java 并发高并发 书籍发我一份吧,可以给你分,发到 564 82 09 82

请教高手们一个如何提高java线程并发性的问题_百度知道
请教高手们一个如何提高java线程并发性的问题
但是结果不如人意,小弟先谢过了;但是应该至少每秒给我发送几十个吧,但是后边我期望程序能在一秒中之内能同事发送不敢说有200个:首先不可能达到真正的每秒200的并发,如果某一线程调用这个socket连接的时候,依然是1秒一次的并发,果然发送量达到了每秒几十上百的并发,超时时间是1秒钟,也就是连接时最多等待1秒钟,我的执行代码就几十行,开始new 200个Thread的速度很快。所以想请教高手们,或者我这个问题大家又碰到的也希望大家能提点意见,超时了就立马进行下次一起发送,关闭,接收。第一,每个线程的执行代码不够优化,发送,我所有的线程共享同一个socket对象。问题在于,但是不至于这么慢,几乎瞬间就出来了,只能等到超时结束才能让下一个线程执行,在做并发的时候应该注意什么,这个问题基本扯淡,200个并行的线程依然是1秒钟发送一个。再有一个原因可能我代码的问题,也得有几十个(因为超时时间是1秒),因为计算机不可能实现真正意义上的200个线程并发,改了之后如果超时时间为1秒.syncExec方法来执行需要并发的代码,看是否有效,程序启动时会立即启动200个线程并立即start,你处理器每秒至少也得给我每秒几十次的速度换着执行其他线程吧,普通的socket创建。于是我给每个线程单独一个socket。我试了一下,虽然每次都是重新连接,把超时时间设置为1ms,所以才会出现上面的每秒钟依然发送一次的结果用swt写了一个执行并发任务的小程序。我觉得问题可能出现在以下几个方面,线程内部是调用display,但是我根据打印的日志发现。并发代码的功能是向服务器发指定的报文,这个方法的参数本身是一个Runnable类型的对象,目的是做系统的压力测试
提问者采纳
和为提高执行效率,发起另外一个UI线程处理;asyncExec执行,否则会导致状态不一致,如几个UI线程负责地图图片的绘制;&&display线程(这种情况比较少,因此有可能在正常队列事件较多,界面出错;&nbsp,需要在执行完毕之后启动另外一个UI处理过程,第一次发出请求是值为1。SWT组件Diaplay提供syncExec与asyncExec方法,而本应该是1、事件处理较慢的时候;&&&5,当前线程一般是非UI线程,asyncExec&nbsp,在框架的事件处理序列中插入另外一个事件。Diaplay是和线程关联的,安排后续事件,每个UI线程一个Diaplay、第三次为3;相关的UI线程中执行、第二次为2;&&nbsp,此时为&&&syncExec适用情况比较简单;&nbsp,每个asyncExec代码访问同一个变量。但是当前事件处理完毕之后;&nbsp、使用户感到界面迟钝现象,使应用到达一定的状态之后,也可以是UI线程(如其它UI相关线程如awt&nbsp。&asyncExec,使UI线程始终能够应付自如。有几种情况下需要这么做,不等待runnable中代码被执行;runnable);UI线程之间协作并发执行,访问整数变量:A;两者的异同决定了其分别适应不同的场合、其它&&nbsp。所有的SWT组件相关代码,甚至调用线程和执行runnable的UI线程是同一个线程)&nbsp、多线程同步问题、跳出当前UI事件处理;&nbsp。可以认为SWT存在两个事件队列;&nbsp,所有请求发出,asyncExec适合在不便,界面整体的有效性;3;2。asyncExec所在的事件队列优先级较低、当前事件处理必须执行完毕;&&&&nbsp,都是为了让Runnable封装的代码在指定的Diaplay(比如某个产成Image的diaplay)&&nbsp,随后第一次发出的asyncExec请求执行,假设该变量是整数,因此非UI线程其实是非display所在的线程,必须在UI线程之中执行、定时刷新或其它不是很重要的UI操作,不影响重要的UI事件处理,asyncExec相关代码不能及时执行的问题;runnable),整数值为5,一般syncExec适合在需要同步UI更新之后继续执行的代码:syncExec&nbsp,该事件处理完毕时;&nbsp,asyncExec对应于SWT低优先级队列、响应及时性;&&nbsp,Display也提供了timerE&nbsp,有些时候是同一个线程;2,结束当前的UI处理,在当前事件处理完毕之后的某个时刻(一般很快)来执行。当前display所在的UI线程,将不重要的事件放到低优先级序列中,从而导致响应不够及时,然后交给另外一个UI线程做装饰处理);1。&UI线程;(Runnable&asyncExec使用时需要注意的问题主要在于两个方面;&&nbsp,有时非常密集,通过&nbsp,从而保证用户响应性,代码在指定时间之后异步执行;&nbsp,一般应用于服务程序。非UI线程是相对与UI线程来讲的,如UI无关的后台作业处理线程;&nbsp,其所在的线程一般称谓UI线程,需异步处理的队列。如,有时不太密集;&nbsp。&nbsp,可以使用&&nbsp,syncExec阻塞当前线程直到UI线程完成runnable中的代码执行。&nbsp,其原型为,只不过将代码的执行根据需要分成两个部分或多个部分处理,正常UI事件队列;1。需要说明的是;&&nbsp,Runnable的run方法中可以封装要执行的代码,为了将事件处理均衡处理,此时可以使用asyncExec,做另外的UI处理。&nbsp。 而asyncExec则直接返回;&nbsp、刷新状态等;B,一般而言是UI相关的代码,但是由于SWT、SWT-AWT共用应用中的awt所在线程,在事件处理过程中,多个SWT&nbsp,可以将其理解为Timer和asyncExec两者的结合,而且不均衡、事件比较密集,其可以是任何其它线程。假如某段事件处理代码发出多个asyncExec请求,当前事件处理完成之后需要应用框架执行一些其它代码之后才可以执行另外的UI处理;&nbsp,如大量生成图片的多UI线程、JFace或其它应用框架的存在、不能syuncExec的情况下使用,如更新组件显示,但并不是说asyncExec执行的代码一定不在同一个线程中,以下总结asyncExec的适用情况,相互之间协调时的调用;&nbsp,可以有多个UI线程;(Runnable&nbsp,UI线程准确的讲是diaplay变量所在的线程、非UI线程需要调用在UI线程中调用的组件方法;&&nbsp.asyncExec(runnable);Socket使用Non-block&nbsp建议你使用asyncExec方法&nbsp,该队列优先级较低;syncExec与asyncExec不相同点体现在对方法调用线程本身的影响。当然了;&nbsp,而不是延迟重要事件的处理;syncExec与asyncExec相同点,其它几个有类似问题;Socket(NIO)非阻塞试的连接,不会出现其它事件来触发需要另外执行的代码:imgCreateDiaplay。&nbsp
提问者评价
谢了,你得回答对我很有启发作用,在你的启发下终于解决了问题,万分感谢
其他类似问题
按默认排序
其他2条回答
Display.syncExec并不能实现你想要并行,是将任务加到UI消息队列,UI消息队列的处理是单线程的
你这样不会达到200并发的,你现在的方法是启动200个线程,可是CPU调度还是分片的,就是同一时刻只能发送一个,普通的Socket不能满足的,建议使用NIO
并发性的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁一个基于混合并发模型的Java虚拟机_杨博_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
评价文档:
一个基于混合并发模型的Java虚拟机_杨博
一​个​基​于​混​合​并​发​模​型​的​J​a​v​a​虚​拟​机
阅读已结束,如果下载本文需要使用
想免费下载本文?
把文档贴到Blog、BBS或个人站等:
普通尺寸(450*500pix)
较大尺寸(630*500pix)
你可能喜欢非常全面的高性能高并发服务器架构解决方案_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
评价文档:
&&¥3.00
喜欢此文档的还喜欢
非常全面的高性能高并发服务器架构解决方案
阅读已结束,如果下载本文需要使用
想免费下载本文?
把文档贴到Blog、BBS或个人站等:
普通尺寸(450*500pix)
较大尺寸(630*500pix)
你可能喜欢Java Web 高性能开发,第 2 部分: 前端的高性能 - 为程序员服务
为程序员服务
推荐团队博客
最近更新博客
Java Web 高性能开发,第 2 部分: 前端的高性能
在前端优化的第一部份中,次要讲授了对静态成本的一些优化装备,包括图片膨胀、CSS Sprites 手艺、GZIP 膨胀等。这一部份,本文将讲授前端优化里主要的 Flush 机制、新闻云集、HTTP 经久衔接、HTTP 和谈无邪运用、CDN 等。连络这些手艺或思惟,信任会使 Java Web 运用轨范的功效更上一层楼。
Flush 机制的行使
理想上在 Web 手艺中,Flush 机制其实不新颖,它的思惟是无需等到网页内容悉数加载终了,一次性写回客户端,而是可以部份逐次的前往。假定网页很除夜的话,一次性写回悉数内容显著是个不明智的选择,因为这会组成网页的长时辰空白。Flush 机制准许垦荒人员将网页的内容按文档流递次慢慢前往给客户端,如允许以使得用户晓得我们的零星正在责任,只是守候的时辰稍长而已,这样用户也会“毫不委屈”的等下去。Flush 机制是一个经典的提高用户体验的方法,至今也一贯在用。假定网页很除夜,这个机制也是建议行使的。在 Java Web 手艺中,完成 Flush 异常庞杂,只需挪用 HttpServletResponse.getWriter 输出流的 flush 方法,就可以将已完成加载的内容写回给客户端。
然则能否是每一个网页都要行使该手艺呢?笔者虽然不这么建议。将网页内容加载终了后再一次性前往客户端也有它的优点。我们晓得汇集传输也有最除夜的传输单元,内容加载终了后一次性输出就可以最除夜水平的行使传输的带宽,增加分块,增加传输次数,也就是说理想上 Flush 机制会增加用户守候时辰、增加阅读器衬着时辰,然则对除夜网页来说,下降这点效率来增强用户体验,是值得的。
所谓的新闻云集,就是将 Web 运用轨范中静态和静态的内容分离放在不合的 Web 干事器上,有针对性的处置责罚静态和静态内容,从而抵达功效的提升。本文基于 Java Web 来说解 Web 优化,而 Java Web 的主流干事器软件是 Tomcat。让人遗憾的是,Tomcat 在并发和静态成本处置责罚的能力上较弱,这也是 Tomcat 为人诟病的地方。然则瑕不掩瑜,既然我们选择了 Java Web,那末就理应施展我们轨范员的思惟去想方设法的提高功效。而新闻云集就是个中一种方法,既然 Tomcat 处置责罚静态成本的能力较弱,那就将静态成本的处置责罚责任交给适合的软件,而让 Tomcat 专注于处置责罚 JSP/Servlet 的要求。
对静态成本处置责罚的干事器软件,我们可以选择 Nginx,它是一款俄罗斯人垦荒的软件,恍如比 Apache 加倍优秀。它支持高并发,对静态成本处置责罚的能力较强,这恰是我们想要的不是吗?现实上,新闻云集的计划许多,有人收受接管 Apache+Tomcat 的组合;也有人行使 Tomcat+Tomcat 的组合,不外两个 Tomcat 分离被放置于不合的主机,不合的域名。个中 Apache+Tomcat 的计划与 Nginx 的计划事理上是一样的,它们都是基于反向署理,绝对行使 Nginx 设置配备铺排新闻云集,Apache 的设置配备铺排就显得略微庞杂一些。在 Apache 里,mod_proxy 模块担负反向署理的完成。个中焦点设置配备铺排内容如清单 1 所示,该设置配备铺排属于本人介入某项目的个中一部份。
清单 1. 新闻云集的 Apache 焦点设置配备铺排
&Proxy balancer://proxy&
BalancerMember http://192.168.1.178:8080 loadfactor=1
BalancerMember http://192.168.1.145:8080 loadfactor=1
NameVirtualHost *:80
&VirtualHost *:80&
ServerAdmin
ServerName
DocumentRoot /www
DirectoryIndex index.shtml
&Directory /www&
AllowOverride All
AddType text/html .shtml
AddType application/x-rar .rar
AddHandler server-parsed .shtml
Options +IncludesNOEXEC
&/Directory&
RewriteEngine on
ProxyRequests Off
ProxyPass /static/!
ProxyPass / balancer://proxy/
ProxyPassReverse / balancer://proxy/
ProxyPreserveHost on
&/VirtualHost&
从 Apache 官方对 mod_proxy 模块的引见,我们可以晓得 ProxyPass 属性可以将一个远端干事器映照到外埠干事器的 URL 空间中,也就是说这是一个地址映照功用。在清单 1 的设置配备铺排中,当接见的途径不在 /static/ 下时(!泄漏表现非),就转发给后端的干事器(也就是 Tomcat);否则假定是 /static/ 途径就接见本机。例如,当接见 /static/css/index.css 时,理想处置责罚要求的是 Apache 干事器,而接见 /index.jsp,那末 Apache 会将要求转发到后端的 Tomcat 干事器,理想接见的页面是 http:// 192.168.1.178( 或 145):8080/index.jsp,这就完成了新闻云集。在清单 1 的设置配备铺排中理想也包括了庞杂的负载平衡(loadfactor 因子)。
现实上,我们可以随意掀开一个除夜型门户网站来看一下,我掀开的是腾讯网站,随意率性检查个中两张图片的地址,我发明一个是:/www/iskin960/qqcomlogo.png,而其他一个则是:/v/pics/hv1/95/225/832/.jpg。可见该网站寄存图片成本行使了多个的域名,我们再用 Linux 的 host 敕令检查两个域名的 IP 地址,效果如图 1 所示。
图 1. 某网站的新闻云集
可以看到,经由进程检查 IP 地址,我们发明这些图片极可以寄存在不合的主机上(为什么是极可以?因为一个主机可以具有多个 IP),而图片内容和网页的静态内容其实不在不合 IP 下,也许多是新闻云集。多个域名在后面也已提到,可以增加阅读器的并发下载数,提凹凸载效率。
本文彩用其他一种计策抵新闻云集中止演示,它的除夜致组织如图 2 所示。
图 2. 本文设计的新闻云集组织
在本文中,我们将静态成本放在 A 主机的一个目录上,将静态轨范放在 B 主机上,同时在 A 上安装 Nginx 而且在 B 上安装 Tomcat。设置配备铺排 Nginx,当要求的是 html、jpg 等静态成本时,就接见 A 主机上的静态成本目录;当用户提出静态成本的要求时,则将要求转发到后端的 B 干事器上,交由 Tomcat 处置责罚,再由 Nginx 将效果前往给要求端。
提到这,可以有您会有疑问,静态要求要先接见 A,A 转发接见 B,再由 B 前往效果给 A,A 最初又将效果前往给客户端,这能否是有点过剩。初看真实其实过剩,然则这样做至多有 2 点优点。第一,为负载平衡做准备,因为跟着零星的成长丁壮夜,只用一台 B 来处置责罚静态要求显著是是缺少的,要有 B1,B2 等等才行。那末基于图 2 的组织,就可以直接扩展年夜 B1,B2,再改削 Nginx 的设置配备铺排就可以完成 B1 和 B2 的负载平衡。第二,对轨范垦荒而言,这类组织的轨范撰写和单台主机没有区分。我们假定只用一台 Tomcat 作为干事器,那末但凡静态成本,如图片、CSS 代码,就需求编写相反这样的接见代码:&img src="/”{address of A}/a.jpg”&,当静态成本过量,需求扩展年夜出其他的干事器来安置静态成本时,接见这些成本即可以要编写这样的代码:&img src=”{address of C}/a.jpg”&、&img src=”{address of D}/a.jpg”&。可以看到,当干事器中止交换或扩展年夜时,代码也要随之做出改削,对轨范垦荒和珍重来说异常难题。而基于上面的组织,轨范都只需 &img src=”a.jpg”&,无需关心具体放置成本的干事器地址,因为具体的地址 Nginx 为帮您绑定和选择。
依照图 2 所示的架构图,安装好需求的软件 Nginx 和 Tomcat。依照想象,对 Nginx 的设置配备铺排文件 nginx.conf 中止设置配备铺排,个中与本文该部份相关的设置配备铺排如清单 2 所示。
清单 2. 新闻云集的 Nginx 设置配备铺排
# 转发的干事器,upstream 为负载平衡做准备
upstream tomcat_server{
server 192.168.1.117:8080;
index index.html index.htm index.
charset koi8-r;
# 静态成本寄存目录
/home/wq/Desktop/ROOT;
access_log
logs/host.access.
# 静态要求的转发
location ~ .*.jsp$ {
proxy_pass http://tomcat_
proxy_set_header Host $
# 静态要求直接读取
location ~ .*/.(gif|jpg|jpeg|png|bmp|swf|css)$ {
清单 2 异常精练,其目的和我们预期的一样,静态的要求(以 .jsp 收尾)发到 B(192.168.1.117:8080,即 tomcat_server)上,而静态的要求(gif|jpg 等)则直接接见界说的 root(/home/wq/Desktop/ROOT)目录。这个 root 目录我直接将其放到 Linux 的桌面 ROOT 文件夹。
接上去在 Tomcat 中新建 Web 项目,很庞杂,我们只为其添加一个 test.jsp 文件,目录组织如图 3 所示。
图 3. B 上的测试项目组织
而我们界说了一张测试用的静态图片,放置在 A 的桌面 ROOT/seperate 目录下。组织如图 4 所示
图 4. A 上的静态成本文件夹组织
留意:这里的 separate 目录名是与 B 的项目文件夹同名的。
再检查图 3 中的 test.jsp 的源码。如清单 3 所示。
清单 3. test.jsp 源码
&%@ page language="java" contentType="text/ charset=UTF-8"
pageEncoding="UTF-8"%&
&%@ page import="java.util.Date" %&
&%@ page import="java.text.SimpleDateFormat" %&
&!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/
html4/loose.dtd"&
&meta http-equiv="Content-Type" content="text/ charset=UTF-8"&
&title&新闻云集的测试&/title&
&div&这是静态剧本处置责罚的效果&/div&&br&
&% //这是一段测试的静态剧本
Date now=new Date();
SimpleDateFormat f=new SimpleDateFormat("现在是"+"yyyy年MM月dd日E kk点mm分");
&%=f.format(now)%&
&div&这是静态成本的要求效果&/div&&br&&img alt="静态成本" src="/jquery.gif"&
清单 3 是一个异常庞杂的 JSP 页面,主假定行使 img 标签来接见 jquery.gif,我们晓得 test.jsp 在 B 干事器上,而 jquery.gif 在 A 干事器上。用于接见 jquery.gif 的代码里不需求指定 A 的地址,而是直接行使绝对途径即可,就似乎该图片也在 B 上一样,这就是本组织的一个优点了。我们在 A 上接见 test.jsp 文件。效果如图 5 所示。
图 5. test.jsp 的效果
异常顺遂,完整依照我们的设法主意主意完成了新闻云集!
我们初步完成了新闻云集的设置配备铺排,然则现实新闻云集若何提高我们的轨范功效我们还不得而知,我们将 Tomcat 干事器也迁移到 A 干事器上,同时将 jquery.gif 拷贝一份到 separate 项目目录下,图 3 的组织酿成图 6 所示。
图 6. 拷贝 jquery.gif 的 separate 项目
我们将 Tomcat 的端口设置为 8080,Nginx 的端口仍然是 9090。现在接见 http://localhost:9090/separate/test.jsp(未行使新闻云集)和接见 http://localhost:8080/separate/test.jsp(行使了新闻云集)的效果是一样的了。只是 8080 端口的静态成本由 Tomcat 处置责罚,而 9090 则是由 Nginx 处置责罚。我们行使 Apache 的 AB 压力测试对象,对 http://localhost:8080/seperate/jquery.gif、http://localhost:9090/seperate/jquery.gif、http://localhost:8080/seperate/test.jsp、http://localhost:9090/seperate/test.jsp 分离中止压力和吞吐率测试。
首先,对静态成本(jquery.gif)的处置责罚效果如清单 4 所示。
清单 4. 静态成本的 AB 测试
测试剧本:ab -c 100 -n 1000 http://localhost:{port}/seperate/jquery.gif
9090 端口,也就是 Nginx 的测试效果:
Concurrency Level:
Time taken for tests:
0.441 seconds
Complete requests:
Failed requests:
Write errors:
Total transferred:
4497000 bytes
HTML transferred:
4213000 bytes
Requests per second:
2267.92 [#/sec] (mean)
Time per request:
44.093 [ms] (mean)
Time per request:
0.441 [ms] (mean, across all concurrent requests)
Transfer rate:
9959.82 [Kbytes/sec] received
8080 端口,也就是 Tomcat 的测试效果:
Concurrency Level:
Time taken for tests:
1.869 seconds
Complete requests:
Failed requests:
Write errors:
Total transferred:
4460000 bytes
HTML transferred:
4213000 bytes
Requests per second:
535.12 [#/sec] (mean)
Time per request:
186.875 [ms] (mean)
Time per request:
1.869 [ms] (mean, across all concurrent requests)
Transfer rate:
2330.69 [Kbytes/sec] received
清单 4 的测试剧本代表同时处置责罚 100 个要求并下载 1000 次 jquery.gif 文件,您可以只关注清单 4 的粗体部份(Requests per second 代表吞吐率),从内容上就可以看出 Nginx 完成新闻云集的优势了,新闻云集每秒可以处置责罚 2267 个要求,而弗成使则只可以处置责罚 535 个要求,是以可知新闻云集后效率的提升是显著的。
您还会关心,静态要求的转发,会致使静态剧本的处置责罚效率下降吗?下降的话又下降若干呢?是以我再用 AB 对象对 test.jsp 中止测试,效果如清单 5 所示。
清单 5. 静态剧本的 AB 测试
测试剧本:ab -c 1000 -n 1000 http://localhost:{port}/seperate/test.jsp
9090 端口,也就是 Nginx 的测试效果:
Concurrency Level:
Time taken for tests:
0.420 seconds
Complete requests:
Failed requests:
Write errors:
Total transferred:
709000 bytes
HTML transferred:
469000 bytes
Requests per second:
2380.97 [#/sec] (mean)
Time per request:
42.000 [ms] (mean)
Time per request:
0.420 [ms] (mean, across all concurrent requests)
Transfer rate:
1648.54 [Kbytes/sec] received
8080 端口,也就是 Tomcat 的测试效果:
Concurrency Level:
Time taken for tests:
0.376 seconds
Complete requests:
Failed requests:
Write errors:
Total transferred:
714000 bytes
HTML transferred:
469000 bytes
Requests per second:
2660.06 [#/sec] (mean)
Time per request:
37.593 [ms] (mean)
Time per request:
0.376 [ms] (mean, across all concurrent requests)
Transfer rate:
1854.77 [Kbytes/sec] received
经由笔者的多次测试,得出了清单 5 的较为波动的测试效果,可以看到外行使 Nginx 完成新闻云集往后,真实其实会组成吞吐率的下落,然则对网站全体功效来说,静态成本的高吞吐率,和未来可以完成的负载平衡、可扩展年夜、高可用性等,该捐躯我想也理应是值得的。
我想任何手艺都是无益有弊,新闻云集也是一样,选择了新闻云集,就选择了加倍庞杂的零星架构,珍重起来在一定水平会加倍庞杂和难题,然则新闻云集也真实其实带来了很除夜水平的功效提升,这也是许多零星架构师会选择的一种处置计划。
HTTP 经久衔接
经久衔接(Keep-Alive)也叫做长衔接,它是一种 TCP 的衔接体式格式,衔接会被阅读器和干事器所缓存,不才次衔接不合干事器时,缓存的衔接被从新行使。因为 HTTP 的无形态性,人们也一贯很了了“一次性”的 HTTP 通讯。经久衔接则增加了树立衔接的开支,提高了功效。HTTP/1.1 已支持长衔接,除夜部份阅读器和干事器也供应了长衔接的支持。
可以想象,要想提议长衔接,干事器和阅读器必需合营协作才可以。一方面阅读器要贯串衔接衔接,其他一方面干事器也不会断开衔接。也就是说要想竖立长衔接,干事器和阅读器需求中止协商,而若何协商就要靠伟除夜的 HTTP 和谈了。它们协商的组织图如图 7 所示。
图 7. 长衔接协商
阅读器在要求的头部添加 Connection:Keep-Alive,以此告知干事器“我支持长衔接,你支持的话就和我竖立长衔接吧”,而借使干事器真实其实支持长衔接,那末就在呼应头部添加“Connection:Keep-Alive”,从而告知阅读器“我真实其实也支持,那我们竖立长衔接吧”。干事器还可以经由进程 Keep-Alive:timeout=10, max=100 的头部告知阅读器“我进展 10 秒算超不时辰,最长不能跨越 100 秒”。
在 Tomcat 里是准许设置配备铺排长衔接的,设置配备铺排 conf/server.xml 文件,设置配备铺排 Connector 节点,该节点担负掌握阅读器与 Tomcat 的衔接,个中与长衔接直接相关的有两个属性,它们分离是:keepAliveTimeout,它泄漏表现在 Connector 关闭衔接前,Connector 为其他一个要求 Keep Alive 所守候的奇妙数,默许值和 connectionTimeout 一样;其他一个是 maxKeepAliveRequests,它泄漏表现 HTTP/1.0 Keep Alive 和 HTTP/1.1 Keep Alive / Pipeline 的最概略求数目,假定设置为 1,将会禁用丢失落 Keep Alive 和 Pipeline,假定设置为小于 0 的数,Keep Alive 的最概略求数将没无限制。也就是说在 Tomcat 里,默许长衔接是掀开的,当我们想关闭长衔接时,只需将 maxKeepAliveRequests 设置为 1 就可以。
毫不踌蹰,首先将 maxKeepAliveRequests 设置为 20,keepAliveTimeout 为 10000,经由进程 Firefox 检查要求头部(这里我们接见上面提到的 test.jsp)。效果如图 8 所示。
图 8. 干事器掀开长衔接
接上去,我们将 maxKeepAliveRequests 设置为 1,而且重启干事器,再次要求网页后检查的效果如图 9 所示。
图 9. 干事器关闭长衔接
比拟可以发明,Tomcat 关闭长衔接后,在干事器的要求呼应中,邃晓标识了:Connection close, 它告知阅读器干事器其实不支持长衔接。那末长衔接现实可以带来若何的功效提升,我们用数据措辞。我们仍然行使 AB 对象,它可以行使一个 -k 的参数,模拟阅读器行使 HTTP 的 Keep-Alive 特色。我们对 http://localhost:8080/seperate/jquery.gif 中止测试。测试效果如清单 6 所示。
清单 6. AB 测试长衔接
测试剧本:ab – k -c 1000 -n 10000 http://localhost:8080/seperate/jquery.gif
关闭长衔接时:
Concurrency Level:
Time taken for tests:
5.067 seconds
Complete requests:
Failed requests:
Write errors:
Keep-Alive requests:
Total transferred:
HTML transferred:
Requests per second:
1973.64 [#/sec] (mean)
Time per request:
506.678 [ms] (mean)
Time per request:
0.507 [ms] (mean, across all concurrent requests)
Transfer rate:
8596.13 [Kbytes/sec] received
掀开长衔接时,maxKeepAliveRequests 设置为 50:
Concurrency Level:
Time taken for tests:
1.671 seconds
Complete requests:
Failed requests:
Write errors:
Keep-Alive requests:
Total transferred:
HTML transferred:
Requests per second:
5983.77 [#/sec] (mean)
Time per request:
167.119 [ms] (mean)
Time per request:
0.167 [ms] (mean, across all concurrent requests)
Transfer rate:
26091.33 [Kbytes/sec] received
效果一定会让您除夜为惊异,行使长衔接和弗成使长衔接的功效比拟,对 Tomcat 设置配备铺排的 maxKeepAliveRequests 为 50 来说,竟然提升了快要 5 倍。可见干事器默许掀开长衔接是有启事的。
HTTP 和谈的合理行使
许多轨范员都将肉体专注在了手艺完成上,他们以为功效的凹凸完整取决于代码的完成,却疏忽了已成型的某些尺度、和谈、对象。最范例的就是在 Web 垦荒上,部份垦荒人员没成心识到 HTTP 和谈的主要性,和 HTTP 和谈可以供应轨范员其他一条功效优化之路。经由进程庞杂的在 JSP 的 request 对象中添加呼应头部,经常可以活络提升轨范功效,一真实古代码恍如都成浮云。本系列文章的宗旨也在于让轨范员编起码的代码,提升最除夜的功效。
本文提出一个这样的需求,在文章后面部份提到的 test.jsp 中,它的一部份功用是显示干事器的当前时辰。现在我们进展这个静态网页准许被阅读器缓存,这恍若有点不合理,然则在许多时辰,虽然是静态网页,然则却只实行一次(比若有些人喜好将网页的主菜单存入数据库,那末他一定不进展每次加载菜单都去读数据库)。阅读器缓存带来的功效提升已世人皆知了,而许多人却其实不晓得阅读器的缓存过不时辰、缓存删除、什么页面可以缓存等,都可以由我们轨范员来掌握,只需您熟习 HTTP 和谈,就可以轻松的掌握阅读器。
我们接见上面说起的 test.jsp。用 Firebug 检查要求情形,发明每次要求都邑从新到干事器下载内容,这不难理解,是以 test.jsp 是静态内容,每次干事器必需都实行后才可以前往效果 , 图 10 是接见当前的 test.jsp 的头部情形。现在我们往 test.jsp 添加清单 7 的内容。
清单 7. 在 test.jsp 的首部添加的代码
SimpleDateFormat f2=new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss");
String ims = request.getHeader("If-Modified-Since");
if (ims != null)
Date dt = f2.parse(ims.substring(0, ims.length()-4));
if (dt.after(new Date()))
response.setStatus(304);
} catch(Exception e)
response.setHeader("Last-Modified", f2.format(new Date()) + " GMT");
上述代码的意图是:干事器获得阅读器要求头部中的 If-Modified-Since 时辰,这个时辰是阅读器讯问干事器,它所要求的成本能否是过时,假定没过时就前往 304 形态码,告知阅读器直接行使外埠的缓存就可以,
图 10. 改削 test.jsp 前的接见头部情形
改削完 test.jsp 代码后,行使鼠标激活阅读器地址栏,按下回车刷新页面。此次的效果如图 11 所示。
图 11. 改削 test.jsp 后的首次接见
可以看到图 11 和图 10 的要求报头没有区分,而在干事器的呼应中,图 11 增加了 Last-Modified 头部,这个头部告知阅读器可以将此页面缓存。
按下 F5(必需是 F5 刷新),F5 会强制 Firefox 加载干事器内容,而且发出 If-Modified-Since 头部。获得的报头效果如图 12 所示 .
图 12. 改削 test.jsp 后的再次接见
可以看到,图 12 的底部已提醒一切内容都来自缓存。阅读器的要求头部多出了 If-Modified-Since,以此讯问干事器从缓存时辰起,干事器能否是对成本中止了改削。干事器剖断后发明没有对此成本(test.jsp)改削,就前往 304 形态码,告知阅读器可以行使缓存。
我们在上面的实行中,用到了 HTTP 和谈的相关常识,个中触及了 If-Modified-Since、Last-Modified、304 形态码等,现实上与缓存相关的 HTTP 头部还有许多,诸如过时设置的头部等。熟习了 HTTP 头部,就如同学会了若何与用户的阅读器攀谈,也可以行使和谈提升您的轨范功效。这也是本文为什么一贯强调 HTTP 和谈的主要性。那末对 test.jsp 这个小网页来说,基于缓存的计划提升了若干功效呢?我们用 AB 给您谜底。
AB 是个很丁壮夜的对象,他供应了 -H 参数,准许测试人员手动添加 HTTP 要求头部,是以测试效果如清单 8 所示。
清单 8. AB 测试 HTTP 缓存
测试剧本:ab -c 1000 – n 10000 – H ‘ If-Modified-Since:Sun, 05 Jun :00 GMT ’ http://localhost:8080/seperate/test.jsp
未改削 test.jsp 前 :
Document Path:
/seperate/test.jsp
Document Length:
Concurrency Level:
Time taken for tests:
10.467 seconds
Complete requests:
Failed requests:
Write errors:
Total transferred:
6080000 bytes
HTML transferred:
3630000 bytes
Requests per second:
955.42 [#/sec] (mean)
Time per request:
[ms] (mean)
Time per request:
1.047 [ms] (mean, across all concurrent requests)
Transfer rate:
567.28 [Kbytes/sec] received
改削 test.jsp 后:
Document Path:
/seperate/test.jsp
Document Length:
Concurrency Level:
Time taken for tests:
3.535 seconds
Complete requests:
Failed requests:
Write errors:
Non-2xx responses:
Total transferred:
1950000 bytes
HTML transferred:
Requests per second:
2829.20 [#/sec] (mean)
Time per request:
353.457 [ms] (mean)
Time per request:
0.353 [ms] (mean, across all concurrent requests)
Transfer rate:
538.76 [Kbytes/sec] received
分离比拟 Document Length、Requests per second 和 Transfer rate 这三个目的。可以发明没行使缓存的 Document Length(下载内容的长度)是 362 字节,而行使了缓存的长度为 0。在吞吐率方面,行使缓存是弗成使缓存的 3 倍旁边。同时在传输率方面,缓存的传输率比没缓存的小。这些都是用到了客户端缓存的启事。
CDN 的行使
CDN 也是笔者比来才意见和接触到的器械,耳中也是多次听到 CDN 这个词了,在淘宝的前端手艺申报上、在一个好同伙的立异工场创业之路上,我都听到了这个词,是以我想至多有需求对此手艺意见一下。所谓的 CDN,就是一种内容分发汇集,它收受接管智能路由和流量治理手艺,实时发明可以给接见者供应最快呼应的加速节点,并将接见者的要求导向到该加速节点,由该加速节点供应内容干事。行使内容分发与复制机制,CDN 客户不需求修改副本的网站组织,只需改削少许的 DNS 设置配备铺排,就可以加速汇集的呼应速度。当用户接见了行使 CDN 干事的网站时,DNS 域名干事器经由进程 CNAME 体式格式将最终域名要求重定向到 CDN 零星中的智能 DNS 负载平衡零星。智能 DNS 负载平衡零星经由进程一组事后界说好的计策(如内容类型、地舆区域、汇集负载情形等),将其时可以最快响运用户的节点地址供应给用户,行使户可以获得疾速的干事。同时,它还与散布在不合所在的一切 CDN 节点贯串衔接通讯,聚集各节点的安康形态,确保不将用户的要求分配就职何一个已弗成用的节点上。而我们的 CDN 还具有在汇集堵塞和丢生效情形下,能具有自顺应调解路由的能力。
因为笔者对 CDN 没有亲自理论,未便多加讲授,然则各除夜网站都在一定水平行使到了 CDN,淘宝的前端手艺演讲中就说起了 CDN,可见 CDN 的威力纷歧般。
图 12. 淘宝的 CDN 前端优化
是以 CDN 也是不能不提的一项手艺,国际有免费供应 CDN 干事的网站:,它需求您有立案的域名,感愉快喜好的您可以去试试。
本文总结了 HTTP 长衔接、新闻云集、HTTP 和谈等等,在您需求的时辰,可以检查本文的内容,信任依照本文的方法,可以辅佐您中止前端的高功效优化。笔者将连续写后续的部份,包括数据库的优化、负载平衡、反向署理等。因为笔者水平无限,若出缺陷,请联络我责怪示正。
接上去在第三部份文章中,我将引见干事器端缓存、静态化与伪静态化、散布式缓存等,而且将它们运用到 Java Web 的垦荒中。行使这些手艺可以匡助提高 Java Web 运用轨范的功效。
相关文章推荐:

我要回帖

更多关于 java 并发 的文章

 

随机推荐