[转帖]Tomcat maxKeepAliveRequests
https://www.cnblogs.com/turn2i/p/10480088.html
在写这个问题前,其实我是为了分析项目碰到的一个tcp close wait问题。这个问题就不在这里讲了。
造成的原因很简单,就是很多项目对httpclient的参数和使用都理解有问题,往往随便写一个或者使用网上的代码。导致在一些场景连接关闭有问题
httpclient大致有这些版本
- httpclient3.x
- httpclient4.x到httpclient4.3以下
- httpclient4.3以上
一般会选择4.3以上
https://www.baeldung.com/httpclient-connection-management 这是国外一个教学网站的说明,使用和说明还算比较ok
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
|
public class HttpClientUtils { private static CloseableHttpClient httpClient; static { // 基本配置 RequestConfig requestConfig = RequestConfig.custom() // 建连超时时间 .setConnectTimeout(5000) // 传输超时时间 .setSocketTimeout(3000) // 从连接池获取连接超时时间 .setConnectionRequestTimeout(10000) .build(); // 连接管理器 PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager(); // 最大连接数 cm.setMaxTotal(80); // 同一个路由最大连接数 cm.setDefaultMaxPerRoute(20); // 客户端构造器 HttpClientBuilder clientBuilder = HttpClients .custom() .setConnectionManager(cm) .setConnectionManagerShared(false)// 影响连接的关闭 .setDefaultRequestConfig(requestConfig); httpClient = clientBuilder.build(); } public static byte[] get(String url, String userAgent) throws IOException { HttpGet httpGet = new HttpGet(url); if (userAgent != null) { httpGet.setHeader(HTTP.USER_AGENT, userAgent); } CloseableHttpResponse response = httpClient.execute(httpGet, HttpClientContext.create()); System.out.println("----------------------------------------"); System.out.println(response.getStatusLine()); HttpEntity entity = response.getEntity(); if (entity != null) { try { return IOUtils.toByteArray(entity.getContent()); } finally { // 只需在传输完毕关闭流即可,详细见源码 EntityUtils.consumeQuietly(entity); } } return null; } } |
服务端我简单启动了一个web服务(这里略过这个操作),然后客户端用demo进行请求处理
demo1:客户端单线程多次请求
|
1
2
3
4
5
6
7
8
9
10
|
for (int i = 0; i < 20; i++) { try { } catch (IOException e) { }}CountDownLatch latch = new CountDownLatch(1); |
客户端的tcp连接状况

服务器的tcp连接情况

符合预期,只有一个连接,连接复用
demo2:客户端多线程请求
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
for (int i = 0; i < 100; i++) { new Thread(new Runnable() { @Override public void run() { try { } catch (IOException e) { } }).start(); }}CountDownLatch latch = new CountDownLatch(1); |
客户端tcp连接情况

100个请求,20个连接,符合预期
重点来了,刚好为了测试单线程的close情况,于是把thread去掉
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
for (int i = 0; i < 100; i++) {// new Thread(new Runnable() {// @Override// public void run() { try { } catch (IOException e) { }// }// }).start(); } CountDownLatch latch = new CountDownLatch(1); |

控制台一看,连接呢???一下子可以说是搞不明白的
20正常100就没了,怀疑和100这个数字安息,于是模拟了以下测试
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
for (int i = 0; i < 101; i++) { if (i == 98 || i == 99 || i == 100) { } try { } catch (IOException e) { }}CountDownLatch latch = new CountDownLatch(1); |
打断点跟踪发现,reusable这个参数在100的时候,行为是和99和101不同的

于是看源码跟踪这个参数修改的地方
private volatile boolean reusable;
代码中有多处将此参数设置为false,其中在100的时候,命中断点。在MainClientExec.java中有如下使用,那么 reuseStrategy.keepAlive(response, context)是关键

继续看 reuseStrategy.keepAlive(response, context),有个叫Porxy-Connection的当100的时候,值为Close状态,证明这个是服务端的一些设置导致的,于是谷歌关键字keepalive

找到tomcat有如下参数配置,nginx也有,大致意思就是一个连接能被重复使用的次数,当超过他,就会断开。这也可以解释为什么100的时候,连接没了。101又开始建立新的连接
maxKeepAliveRequests |
The maximum number of HTTP requests which can be pipelined until the connection is closed by the server. Setting this attribute to 1 will disable HTTP/1.0 keep-alive, as well as HTTP/1.1 keep-alive and pipelining. Setting this to -1 will allow an unlimited amount of pipelined or keep-alive HTTP requests. If not specified, this attribute is set to 100. |
[转帖]Tomcat maxKeepAliveRequests的更多相关文章
- [转帖]Tomcat目录结构详解
Tomcat目录结构详解 https://www.cnblogs.com/veggiegfei/p/8474484.html 之前应该是知道一点 但是没有这么系统 感谢原作者的描述. 1.bin: 该 ...
- Spring Boot 2.5.0 发布:支持Java16、Gradle 7、Datasource初始化机制调整
今年520的事情是真的多,娱乐圈的我们不管,就跟DD一起来看看 Spring Boot 2.5.0 的发布吧!看看都带来了哪些振奋人心的新特性和改动! 主要更新 支持 Java 16 支持 Gradl ...
- 【java】基于Tomcat的WebSocket转帖 + 自己理解
网址:http://redstarofsleep.iteye.com/blog/1488639 原帖时间是2012-5-8,自己书写时间是2013年6月21日10:39:06 Java代码 packa ...
- [转帖]Apache、Tomcat与Catalina作为软件名字的含义与关系
Apache.Tomcat与Catalina作为软件名字的含义与关系 -- :: 复杂度掠夺者 阅读数 3356更多 分类专栏: 术语解释 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA ...
- [转帖]说一说JVM双亲委派机制与Tomcat
说一说JVM双亲委派机制与Tomcat https://www.cnblogs.com/dengchengchao/p/11844022.html 讲个故事: 以前,爱捣鼓的小明突然灵机一动,写出了下 ...
- jvm系列(五):tomcat性能调优和性能监控(visualvm)
tomcat服务器优化 1.JDK内存优化 根据服务器物理内容情况配置相关参数优化tomcat性能.当应用程序需要的内存超出堆的最大值时虚拟机就会提示内存溢出,并且导致应用服务崩溃.因此一般建议堆的最 ...
- tomcat 常用优化配置
1.精简Tomcat和配置文件 1.删除不需要的管理应用和帮助应用,提高tomcat安全性. # 删除webapps下所有文件 # rm –fr $CATALINA_HOME/webapps/* # ...
- Apache, Tomcat, JK Configuration Example
Example of worker.properties: worker.list=myWorker,yourWorker worker.myWorker.port=7505 worker.myWor ...
- 聊下并发和Tomcat线程数(错误更正)
本文前半部分结论存在严重错误,请看最后2015-1-20更新部分. 最近一直在解决线上一个问题,表现是: Tomcat每到凌晨会有一个高峰,峰值的并发达到了3000以上,最后的结果是Tomcat线程池 ...
- Tomcat重启脚本restart.sh停止脚本stop.sh
Tomcat重启脚本restart.sh停止脚本stop.sh Tomcat本身提供了 startup.sh(启动)shutdown.sh(关闭)脚本,我们在部署中经常会出现死进程形象,无法杀掉进程需 ...
随机推荐
- [Python急救站]学生管理系统链接数据库
相信很多人在初学Python的时候,经常最后作业就是完成一个学生管理系统,但是我们来做一个完美的学生管理系统,并且将数据储存到数据库里. 我们先看看我们的数据库怎么设置. 首先呢,我选择用的是SQL ...
- GetView介绍 以及 GetxController生命周期
etView 只是对已注册的 Controller 有一个名为 controller 的getter的 const Stateless 的 Widget,如果我们只有单个控制器作为依赖项,那我们就可以 ...
- Spark的分布式存储系统BlockManager全解析
摘要:BlockManager 是 spark 中至关重要的一个组件,在spark的运行过程中到处都有 BlockManager 的身影,只有搞清楚 BlockManager 的原理和机制,你才能更加 ...
- 上手测试GaussDB(for Redis) 和开源 Redis,只为推荐质优价廉的Redis
摘要:一文带你全方位测评 GaussDB(for Redis) 和开源 Redis. 本文分享自华为云社区<程序员硬核测评:全方位测评 GaussDB(for Redis) 和开源 Redis& ...
- vue2升级vue3:class component的遗憾
在vue2,class 写法真的非常爽 import { Component as tsc } from 'vue-tsx-support'; import { Component, Watch } ...
- 使用appuploader工具发布证书和描述性文件教程
使用APPuploader工具发布证书和描述性文件教程 之前用AppCan平台开发了一个应用,平台可以同时生成安卓版和苹果版,想着也把这应用上架到App Store试试,于是找同学借了个苹果开发者账号 ...
- 治理效率提升77%!揭秘基于DataLeap实时健康分的最佳实践
更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 背景 某企业实时数仓团队通过数据收集.整合.计算和存储构建实时数据仓库,为企业提供快速.准确.可靠的实时数据分析和 ...
- Kubernetes(K8S) 安装Nacos,报 No DataSource set
原因,数据库为 MySQL 5.7 需要在yaml加上参数 mysql.db.param: "characterEncoding=utf8&connectTimeout=1000&a ...
- WebRTC SDP 详解和剖析
WebRTC 是 Web Real-Time Communication,即网页实时通信的缩写,是 RTC 协议的一种 Web 实现,项目由 Google 开源,并和 IETF 和 W3C 制定了行业 ...
- 离散化/线段树 (POJ - 2528 Mayor's posters)
Mayor's posters https://vjudge.net/problem/POJ-2528#author=szdytom 线段树 + 离散化 讲解:https://blog.csdn.ne ...