Tomcat server.xml中配置的connectionTimeout参数无效?

发布于 2022-09-05 23:48:05 字数 3411 浏览 14 评论 0

在tomcat的配置文件server.xml中,可以设置Connector的参数,其中包含超时参数connectionTimeout。

apache官网对于这些参数的解释:https://tomcat.apache.org/tom...

本人对其中几个重要参数大致理解为(应该理解错了):

  • connectionTimeout:一个请求最多等待时间,超过则报错。
  • maxConnections:最多同时连接数,连接上不一定处理。超过连接数,则排队。
  • maxThreads:同时处理的线程数,经测试,理解无误。
  • acceptCount:等待队列长度,当超越maxConnections时,会进入等待队列。等待队列满之后,直接拒绝请求。

对这些参数进行测试,然而遇到了疑惑。


第一组测试

设置:
connectionTimeout为10000,
maxConnections为2,
maxThreads为2,
acceptCount为2。

<Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="10000"
               redirectPort="8443" 
               maxConnections="2" maxThreads="2" acceptCount="2"/>

写一个controller测试,sleep30s。

@RequestMapping(value = "sync")
@ResponseBody
public String sync() throws InterruptedException {
    Thread.sleep(30000L);
    return "test success";
}

使用JMeter进行测试。

clipboard.png

测试结果,尝试三次都一致,如下:

一共20次请求,失败14个。

clipboard.png

clipboard.png

前两个请求,的确是在30s之后返回。

clipboard.png

失败的14个请求,都在52s左右。

clipboard.png

最后四个成功的请求,前两个在60s时返回,后两个在90s时返回。符合sleep30s的时间点。

分析:

  1. 同时生成20次请求。
  2. maxConnections=2,有两个请求被连接上,acceptCount=2,有两个请求进行排队。
  3. 其余16个请求,应该在某处也“排着队”吧,就称为野生请求。
  4. maxThreads=2,两个请求同时处理,30s后,这两个请求处理完毕。
  5. 排队的两个请求连接,两个野生请求进入队列。
  6. 莫名其妙地在52s时,进行了一波等待超时判断,14个野生请求全部失败。
  7. 已经连接和在排队中的请求后续会成功处理。

疑问:

  1. 52s来自何处,设置的connectionTimeout是10s呢。

第二组测试

<Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="10000"
               redirectPort="8443" 
               maxConnections="10" maxThreads="2" acceptCount="5"/>

其中设置:
connectionTimeout为10000,
maxConnections为10,
maxThreads为2,
acceptCount为5。

仍发起20次请求,共失败5次。

clipboard.png

失败的4次请求,仍然是在52s左右失败。

clipboard.png

之后的请求返回时间符合每30s返回两个的预期。

分析:

  1. 连接10个,等待5个,每次处理2个。
  2. 30s后,2个请求成功返回,连接数变成8个,按照第一组的分析,会有2个等待请求顶上去。那么,最终失败的请求应该是3个,然而结果是5个。
  3. 猜测需要等到连接的请求全部完成后或完成一部分之后,等待请求才会顶上去,野生请求只能干等。

疑问:

  1. connectionTimeout参数作用是?52s何处来?
  2. 其他几个参数理解是否正确?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

花开浅夏 2022-09-12 23:48:05

刚刚测试了下,connectionTimeout是指客户端连接时间并不是服务器响应时间。

 //连接tomcat
 Socket socket = new Socket("127.0.0.1", 8080);
 long time = System.currentTimeMillis();
 //不发送http报文,阻塞到tomcat服务器主动断开连接
 System.out.println(socket.getInputStream().read());
 System.out.println(System.currentTimeMillis()-time);

控制台输出

-1        //-1关闭连接标识
10200    //connectionTimeout时间
孤独难免 2022-09-12 23:48:05

达到maxConnections和acceptCount的数量时间刚好在52s左右,再有连接到来tomcat直接拒绝了。

猫弦 2022-09-12 23:48:05

第一组测试和浏览器的连接超时时间有关系,http请求中有两个超时时间,连接超时时间、读超时时间。
这两个超时时间都是在client端设置的,比如谷歌浏览器、火狐浏览器,各个浏览器设置的连接超时间、读超时时间的默认值是不一样的,第一组测试中,客户端jmeter的连接超时时间肯定是大于30秒的,

maxConnections为2,acceptCount为2。决定了同一时刻最多处理4个请求,maxConnections里面的两个线程处理完之后,花了30秒,这个时候jmeter的客户端连接超时时间还没到,于是又有两个请求进入到服务器,所以一共是6个请求到达服务器,后面14个请求,由于jmeter的客户端连接超时时间到了,所以都超时,不请求了。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文