tomcat的keepalive时间设置问题

前几天进行线上的压测,发现应用的性能比之前还降低了就进行了一些分析。应用的结构是基础的apache+mod_jk+jboss的模式。主要的原因是之前的很多默认参数设置不合理,比如jk的配置
[text]
worker.list=local
worker.local.type=ajp13
worker.local.host=localhost
worker.local.port=8001
worker.local.lbfactor=50
worker.local.cachesize=100 #当前配置大于每个进程的最多线程数50,需要减小
worker.local.cache_timeout=600 #闲置连接的清理时间
worker.local.socket_keepalive=1
worker.local.recycle_timeout=300 # #作用和cachesize类似但是在non-cache 的时候也能用
[/text]
tomcat的配置
[text]
<Connector port="7001" address="${jboss.bind.address}"
emptySessionPath="false" enableLookups="false" redirectPort="8443"
watchModeLimit="1200" maxParameterCount="1200" protocol="AJP/1.3" strategy="ms" acceptCount="300" bufferSize="16384" maxPostSize="2097152" connectionTimeout="300000" useBodyEncodingForURI="true" maxThreads="200" minSpareThreads="40" maxSpareThreads="75"/>
[/text]
当上层的apache进程比较多的时候,很容易把java的线程都占用掉,造成不能接受新请求,OS上可以看到很多SYN_RECV状态的连接。然后我就尝试修改参数能使得闲置的ajp链接被apache主动释放掉。因为cache_timeout和recycle_timeout的2个的作用都是指定闲置连接的回收时间,所以想试试到底是哪个先生效。然后就抓包做了下测试
结果无论是把cache_timeout还是把recycle_timeout的时间改小,ajp连接的回收时间都是300s。
[text]
11:17:02.983554 IP (tos 0x0, ttl 64, id 26914, offset 0, flags [DF], proto 6, length: 60) 127.0.0.1.47060 > 127.0.0.1.7001: S [tcp sum ok] 3713142601:3713142601(0) win 32767 <mss 16396,sackOK,timestamp 283338347 0,nop,wscale 2>
11:17:02.983570 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto 6, length: 60) 127.0.0.1.7001 > 127.0.0.1.47060: S [tcp sum ok] 3721181851:3721181851(0) ack 3713142602 win 32767 <mss 16396,sackOK,timestamp 283338347 283338347,nop,wscale 2>

11:21:57.521848 IP (tos 0x0, ttl 64, id 22127, offset 0, flags [DF], proto 6, length: 52) 127.0.0.1.7001 > 127.0.0.1.47059: F [tcp sum ok] 1642:1642(0) ack 467 win 8192 <nop,nop,timestamp 283367801 283337800>
11:22:03.234846 IP (tos 0x0, ttl 64, id 56573, offset 0, flags [DF], proto 6, length: 52) 127.0.0.1.7001 > 127.0.0.1.47060: F [tcp sum ok] 1642:1642(0) ack 467 win 8192 <nop,nop,timestamp 283368372 283338371>
[/text]
后来继续搜索了一下发现有类似的讨论,主要是直接在tomcat配置文件里面的加keepAliveTimeout=10000。不过单独修改这个配置发现还是没有像预想的那样工作。后来仔细看了那个链接里的讨论,说是在tomcat 5.5里KeepAliveTimeout是没有用的,然后就直接把connectionTimeout改成了32000,重要正常工作了。
[text]
13:05:37.104641 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto 6, length: 60) 127.0.0.1.7001 > 127.0.0.1.47265: S [tcp sum ok] 2010311520:2010311520(0) ack 2018476636 win 32767 <mss 16396,sackOK,timestamp 283989747 283989747,nop,wscale 2>
13:05:45.476963 IP (tos 0x0, ttl 64, id 17630, offset 0, flags [DF], proto 6, length: 60) 127.0.0.1.47280 > 127.0.0.1.7001: S [tcp sum ok] 2021138150:2021138150(0) win 32767 <mss 16396,sackOK,timestamp 283990584 0,nop,wscale 2>
13:05:45.476981 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto 6, length: 60) 127.0.0.1.7001 > 127.0.0.1.47280: S [tcp sum ok] 2016571274:2016571274(0) ack 2021138151 win 32767 <mss 16396,sackOK,timestamp 283990584 283990584,nop,wscale 2>
13:06:11.061661 IP (tos 0x0, ttl 64, id 48536, offset 0, flags [DF], proto 6, length: 52) 127.0.0.1.7001 > 127.0.0.1.47265: F [tcp sum ok] 1642:1642(0) ack 467 win 8192 <nop,nop,timestamp 283993143 283989941>
13:06:17.641781 IP (tos 0x0, ttl 64, id 13753, offset 0, flags [DF], proto 6, length: 52) 127.0.0.1.7001 > 127.0.0.1.47280: F [tcp sum ok] 1642:1642(0) ack 467 win 8192 <nop,nop,timestamp 283993801 283990600>
[/text]
另外tomcat的配置优化tips可以参考下面的介绍:

http://blog.monitis.com/index.php/2011/08/06/18-java-tomcat-application-optimization-tips/

此条目发表在Web server分类目录。将固定链接加入收藏夹。

发表评论