求解Apache Tomcat7 并发量问题

weileshenma 2014-06-25 10:47:50
现有如下需求:
对一个web应用进行压力测试,要求并发量700。
--------------------------------------------------------------------

环境工具:
web服务器用的是Tomcat7。
压力测试工具用的是LoadRunner 11。
--------------------------------------------------------------------

Tomcat7的配置:


LoadRunner的脚本只写了一个Action,init和end都是未写东西,Action脚本如下:


LoadRunner场景运行配置:压15分钟,用户每2秒增加5个,最多增加到700。
--------------------------------------------------------------------

问题来了。。。。。。
当LoadRunner的用户增加到350的时候,就开始出错了,具体出错信息如下:

Action.c(4): Error -27796: Failed to connect to server "192.168.1.90:9001":

这个意思是Tomcat直接拒绝了请求?可是我的Tomcat明明配置的是300线程,还有300等待请求,等于是300+300=600。 就算是拒绝请求也要等到用户并发量到达600之后啊,为什么每次压到350就开始报错呢,还是我的配置有问题呢?

请各位指教!
...全文
458 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
shine333 2014-06-26
  • 打赏
  • 举报
回复
引用 11 楼 weileshenma 的回复:
哥们,多谢,麻烦你这这么敲字回答了! 针对你提的问题,我一一做了试验: 1.调整connector里面不同的数字,我把maxThread调整到1000,acceptCount也调整到了1000,或者两个都调到100,依旧是340-350个用户开始报错,错误信息依旧。
因为我平时用jmeter,LR不熟悉,你LR有详细日志吗?
引用 11 楼 weileshenma 的回复:
你说的确认connector的类型这个不太明白是什么意思。。。
引用 11 楼 weileshenma 的回复:
org.apache.coyote.http11.Http11Protocol,block io(BIO) org.apache.coyote.http11.Http11AprProtocol, Apr io (AIO) 如果你的PATH/LD_LIBRARY_PATH下有tomcat native library(tomcat/bin/tcnative-1.dll之类),优先用AIO,否则用BIO, 此外还有第三种,将protocol配置为 org.apache.coyote.http11.Http11NioProtocol,对应 non blocking io (NIO)
你protocol="HTTP/1.1"自然只可能是AIO(bin目录下是否有tcnative-1.dll这个dll)或者BIO(没dll)了。 或者你看下你tomcat启动日志/控制台输出,上面是否有:
引用
Initializing ProtocolHandler ["http-arp-9001"]
引用
Starting ProtocolHandler ["http-arp-9001"]
这样的字样。
东风无眠 2014-06-25
  • 打赏
  • 举报
回复
connnectionTimeout =20s 户每2秒增加5个 所以20秒后增加到50个排队,300+50=350 而这时正好超时时间已到
东风无眠 2014-06-25
  • 打赏
  • 举报
回复
你300个请求在排队,排队也有超时时间的,不是一直等的。 个人感觉,是排到第50个人的时候,前面的http请求已经超时造成的
weileshenma 2014-06-25
  • 打赏
  • 举报
回复
大锅们,快来帮帮忙撒
wyx100 2014-06-25
  • 打赏
  • 举报
回复
引用 3 楼 fangmingshijie 的回复:
先看tomcat是否还正常运行?
weileshenma 2014-06-25
  • 打赏
  • 举报
回复
引用 3 楼 fangmingshijie 的回复:
先看tomcat是否还正常运行?
在运行,还能正常访问,只不过在loadrunner压力测试报错之后,就连不上Tomcat,压力测试关掉之后就能正常连接上
  • 打赏
  • 举报
回复
先看tomcat是否还正常运行?
weileshenma 2014-06-25
  • 打赏
  • 举报
回复
坐等指教。。。急急急。。。
weileshenma 2014-06-25
  • 打赏
  • 举报
回复
在线等答复。请各位不吝赐教啊!
weileshenma 2014-06-25
  • 打赏
  • 举报
回复
不要沉啊。。。
龙翔飞雪 2014-06-25
  • 打赏
  • 举报
回复
我想问一句: 每个用户就一定对应一个线程吗?? 单个用户, 每次和服务器交互才是一个线程吧? (当然如果程序里再划分线程的 另算)
weileshenma 2014-06-25
  • 打赏
  • 举报
回复
引用 9 楼 shine333 的回复:
纠正下,不是250个等待“线程”,而是等待的队列里面,还有250个空位。 只好用排除法了,尝试调整<connector>里面不同的数字,每次放大/缩小一个数字。再loadrunner(配置不变),看是否还报错,如果报错,是否数量有变化。 然后再尝试loadrunner配置调整。根据变化情况,再来帮你分析分析。 另外,还有件很重要的事情,请确认你connector的类型。因为protocol字段写HTTP/1.1的话,有可能对应2种不同的socket org.apache.coyote.http11.Http11Protocol,block io(BIO) org.apache.coyote.http11.Http11AprProtocol, Apr io (AIO) 如果你的PATH/LD_LIBRARY_PATH下有tomcat native library(tomcat/bin/tcnative-1.dll之类),优先用AIO,否则用BIO, 此外还有第三种,将protocol配置为 org.apache.coyote.http11.Http11NioProtocol,对应 non blocking io (NIO) 建议考虑显式指定NIO或AIO。不过,暂时没有明确证据表明选用哪种protocol与你的问题直接相关。 其他可以参考:http://tomcat.apache.org/tomcat-7.0-doc/config/http.html
且close_wait状态的端口很少
weileshenma 2014-06-25
  • 打赏
  • 举报
回复
引用 9 楼 shine333 的回复:
纠正下,不是250个等待“线程”,而是等待的队列里面,还有250个空位。 只好用排除法了,尝试调整<connector>里面不同的数字,每次放大/缩小一个数字。再loadrunner(配置不变),看是否还报错,如果报错,是否数量有变化。 然后再尝试loadrunner配置调整。根据变化情况,再来帮你分析分析。 另外,还有件很重要的事情,请确认你connector的类型。因为protocol字段写HTTP/1.1的话,有可能对应2种不同的socket org.apache.coyote.http11.Http11Protocol,block io(BIO) org.apache.coyote.http11.Http11AprProtocol, Apr io (AIO) 如果你的PATH/LD_LIBRARY_PATH下有tomcat native library(tomcat/bin/tcnative-1.dll之类),优先用AIO,否则用BIO, 此外还有第三种,将protocol配置为 org.apache.coyote.http11.Http11NioProtocol,对应 non blocking io (NIO) 建议考虑显式指定NIO或AIO。不过,暂时没有明确证据表明选用哪种protocol与你的问题直接相关。 其他可以参考:http://tomcat.apache.org/tomcat-7.0-doc/config/http.html
哥们,多谢,麻烦你这这么敲字回答了! 针对你提的问题,我一一做了试验: 1.调整connector里面不同的数字,我把maxThread调整到1000,acceptCount也调整到了1000,或者两个都调到100,依旧是340-350个用户开始报错,错误信息依旧。 2.用netstat -na查看了端口占用情况,端口没有接近65535,才50000不到 你说的确认connector的类型这个不太明白是什么意思。。。
shine333 2014-06-25
  • 打赏
  • 举报
回复
另外,你这里测试客户端这里,是否本地端口已满。 netstat 看看,是否有很多close_wait,而且最大本地端口号已经接近65535了
shine333 2014-06-25
  • 打赏
  • 举报
回复
纠正下,不是250个等待“线程”,而是等待的队列里面,还有250个空位。 只好用排除法了,尝试调整<connector>里面不同的数字,每次放大/缩小一个数字。再loadrunner(配置不变),看是否还报错,如果报错,是否数量有变化。 然后再尝试loadrunner配置调整。根据变化情况,再来帮你分析分析。 另外,还有件很重要的事情,请确认你connector的类型。因为protocol字段写HTTP/1.1的话,有可能对应2种不同的socket org.apache.coyote.http11.Http11Protocol,block io(BIO) org.apache.coyote.http11.Http11AprProtocol, Apr io (AIO) 如果你的PATH/LD_LIBRARY_PATH下有tomcat native library(tomcat/bin/tcnative-1.dll之类),优先用AIO,否则用BIO, 此外还有第三种,将protocol配置为 org.apache.coyote.http11.Http11NioProtocol,对应 non blocking io (NIO) 建议考虑显式指定NIO或AIO。不过,暂时没有明确证据表明选用哪种protocol与你的问题直接相关。 其他可以参考:http://tomcat.apache.org/tomcat-7.0-doc/config/http.html
weileshenma 2014-06-25
  • 打赏
  • 举报
回复
引用 7 楼 lockedstar 的回复:
connnectionTimeout =20s 户每2秒增加5个 所以20秒后增加到50个排队,300+50=350 而这时正好超时时间已到
我的最大线程量是300,当用户数量到达350时,此时用掉了最大线程300,外加50个等待线程,还有250个等待线程呢。。

81,094

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧