问题描述: 从上面的测试结果来看,尽管并发在开始慢慢变大,但是cpu的使用率一直不高,据现场测试人员提供的信息,当时监控的服务器内存使用量也比较低,并且数据库端当时压力也不大,根据这些现象我们可以看出有大多数的请求可能没有被服务器处理,甚至都不在服务器的等待列里。
通过查看tomcat配置,发现对于最大线程数maxThreads的限制为400,也就是最多只能400个线程工作,其他只能在等待列里等待,等待列的设置是acceptCount的值(即当tomcat启动的线程数达到最大时,接受排队的请求个数),此处也只给了300,如果等待队列也被占满其他还有请求进来的话,会立即返回“connection refused”。
<Connector port="8080" maxHttpHeaderSize="8192" maxThreads="400" minSpareThreads="20" maxSpareThreads="100" enableLookups="false" redirectPort="8443" accptCount="300" connectionTimeout="20000" disableUploadTimeout="true" useBodyEncordingForURI="true" URIencording="UTF-8"/>
修改建议:
通过上面的分析,建议将tomcat server.xml中的配置做如下修改:
<Connector port="8080" maxHttpHeaderSize="8192" maxThreads="1000" minSpareThreads="20" maxSpareThreads="100" enableLookups="false" redirectPort="8443" accptCount="1000" connectionTimeout="20000" disableUploadTimeout="true" useBodyEncordingForURI="true" URIencording="UTF-8"/>
maxThreads:tomcat启动的最大线程数,即同时处理的任务个数,默认值是200
caaptCount:当tomcat启动的线程达到最大时接受排队的请求个数,默认值为100
minSpareThreads:初始化的最小线程数
maxSpareThreads:最大空闲线程