日期:2014-05-16  浏览次数:21046 次

Apache+Tomcat:JSP长时间等待不响应的问题
公司网站的apache和tomcat都是使用的默认配置,但最近访问量增长得比较快,因此公司网站出了点问题,解决过程如下:

一、发现演示站有时候会无响应,浏览器不报错,但一直等待。这时用ps aux|grep http|wc -l命令查看apache进程数,发现为150,这是apache默认的最大连接数,于是修改httpd.conf,将MaxKeepAliveRequests设为1000,使用命令apache2ctl -k restart重启apache使配置生效。

二、重启后演示站可以正常运行,但几个小时之后,又停止响应,浏览器一直等待。这时查看apache进程数,发现还是150。

三、于是检查Tomcat的Server.xml,发现AJP端口的最大线程数不对,于是修改如下:
<Connector URIEncoding="GBK" port="8009"
    maxThreads="1000" minSpareThreads="25" maxSpareThreads="250"
               enableLookups="false" redirectPort="8443" acceptCount="500"
               debug="0" connectionTimeout="600000"
               disableUploadTimeout="true"
               protocol="AJP/1.3" />

四、重启Tomcat运行几个小时后,又出现故障,现象如前,在150个进程时停止响应。于是又修改httpd.conf中的perfork部分:
<IfModule prefork.c>
StartServers         5
MinSpareServers      5
MaxSpareServers     100
ServerLimit        1000
MaxClients         1000
MaxRequestsPerChild  10
</IfModule>

五、重启apache后问题依旧,没辙了,找来找去,终于在mod_jk.log中找到了线索,其中
有这样的错误信息:
ajp_send_request::jk_ajp_common.c (1244): (tomcat1) increase the backend idle connection timeout or the connection_pool_minsize

六、于是四处搜资料,得知需要修改workers.properties,按照网上文章,加入如下行:
worker.tomcat1.connection_pool_size=1000
worker.tomcat1.connection_pool_minsize=250
worker.tomcat1.connection_pool_timeout=600

七、重启后问题依旧,再搜,发现还需要在workers.properties中如下行:
worker.tomcat1.socket_timeout=20

八、重启后问题解决,运行一天以后进程数依然只有80个。

问题虽然解决了,但自己对Apache和JK_Mod不精通,有些参数只是看到了就拿来改改试试,不求甚解。因此还有一些疑惑:

一、在另一个站点上使用了默认的workers.properties,没有加connection_pool_size等参数,但访问量明显比我们公司的网站大,却一直运行良好。怀疑跟我们公司网站上提供了几个大文件下载有关,但没有证实。

二、在没有加上worker.tomcat1.socket_timeout=20之前,所有的进程/线程数相关的参数都已经改了,但依然在达到150个进程时停止响应,原因不明。

三、在没有加上worker.tomcat1.socket_timeout=20之前,进程数几小时内就会达到150,但加上以后进程数增长得较为缓慢,一天以后都只有80,原因不明。

看来得找时间好好研究一下Apache和JK_Mod了。