[转帖]Tomcat maxKeepAliveRequests

tomcat,maxkeepaliverequests · 浏览次数 : 0

小编点评

#生成内容时需要带简单的排版 以下代码例子展示如何在生成内容时带简单的排版: ```java //定义一个排版字符串 private String contentPattern = "内容"; //生成内容时,添加排版符 private String generatedContent = contentPattern + "\n"; //设置输出格式,包含内容和排版符 private String outputFormat = "内容\n"; //生成内容并输出到文件 public void generateContent() { //输出内容 System.out.println(generatedContent); //设置输出格式 System.out.format(outputFormat, generatedContent); } ``` 这段代码首先定义了一个排版字符串 `contentPattern`,它包含内容和排版符。 然后,在 `generateContent` 方法中,添加了排版符: ```java private String generatedContent = contentPattern + "\n"; ``` 最后,在 `generateContent` 方法中设置了输出格式,包含内容和排版符: ```java private String outputFormat = "内容\n"; ``` 最后,在 `generateContent` 方法中,使用 `println` 和 `format` 方法输出内容并设置输出格式: ```java //输出内容 System.out.println(generatedContent); //设置输出格式 System.out.format(outputFormat, generatedContent); ``` 运行这段代码,会输出以下内容: ``` 内容 ``` 内容包含内容,以及一个排版符。

正文

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

 
于是我写了一个demo工具类,并对这个工具类做了一些测试
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) {
        e.printStackTrace();
    }
}
 
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 {
                    System.out.println(new String(HttpClientUtils.post("http://10.101.17.26:8888/demo"), "utf-8"));
                catch (IOException e) {
                    e.printStackTrace();
                }
            }).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 {
                        System.out.println(new String(HttpClientUtils.post("http://10.101.17.26:8888/demo"), "utf-8"));
                    catch (IOException e) {
                        e.printStackTrace();
                    }
//                }
//            }).start();
        }
        CountDownLatch latch = new CountDownLatch(1);
        latch.await();

控制台一看,连接呢???一下子可以说是搞不明白的

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) {
        System.out.println(i);
    }
    try {
    catch (IOException e) {
        e.printStackTrace();
    }
 
}
 
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.    

 
如果把这个参数设成1,http1.1就退化成http1.0了 

与[转帖]Tomcat maxKeepAliveRequests相似的内容:

[转帖]Tomcat maxKeepAliveRequests

https://www.cnblogs.com/turn2i/p/10480088.html 在写这个问题前,其实我是为了分析项目碰到的一个tcp close wait问题。这个问题就不在这里讲了。 造成的原因很简单,就是很多项目对httpclient的参数和使用都理解有问题,往往随便写一个或者使用

[转帖]Tomcat参数配置

前言 Tomcat是啥子,想必搜索tomcat配置的小伙伴应该无人不晓,无人不知了吧,但是我还是把官网看了一下有句话: Apache Tomcat software powers numerous large-scale, mission-critical web applications acro

[转帖]Tomcat 优雅关闭之路

本文首发于 vivo互联网技术 微信公众号链接:https://mp.weixin.qq.com/s/ZqkmoAR4JEYr0x0Suoq7QQ作者:马运杰 本文通过阅读Tomcat启动和关闭流程的源码,深入分析不同的Tomcat关闭方式背后的原理,让开发人员能够了解在使用不同的关闭方式时需要注意

[转帖]Tomcat部署及优化

目录 一、Tomcat简介1 Tomcat的三大核心组件2 Java Servlet3 JSP全称Java Server Pages4 Tomcat 功能组件结构5 Tomcat 请求过程 二、Tomcat 服务部署1.关闭防火墙,将安装 Tomcat 所需软件包传到/opt目录下2.安装JDK3.

[转帖]总结:Tomcat的IO模型

一、介绍 对于 linux 操作系统,IO 多路复用使用的是 epoll 方式,对于 windows 操作系统中 IO 多路复用使用的是 iocp 方式,对于 mac 操作系统 IO 多路复用使用的是 kqueue 方式。 由于对于 tomcat 服务器来说基本主要部署在 linux 操作系统上,所

[转帖]总结:nginx502:Tomcat调优之acceptCount

问题背景:UI页面点击会偶尔返回error,检查调用日志,发现nginx报502报错,因此本文即排查502报错原因。 如下红框可知,访问本机个备机的服务502了,用时3秒左右(可见并不是超时) 先给出原因:是因为tomcat8默认的acceptCount是100,请求量大的时候,会将一些来不及处理的

[转帖]《JavaWeb篇》07. HTTP&Tomcat&Servlet看这一篇就够了

https://bbs.huaweicloud.com/blogs/380969 【摘要】 Web是全球广域网,也称为万维网(www),能够通过浏览器访问的网站。 在我们日常的生活中,经常会使用浏览器去访问`百度`、`京东`、`传智官网`等这些网站,这些网站统称为Web网站。 HTTP&Tomcat

[转帖]Spring Boot中Tomcat是怎么启动的

https://zhuanlan.zhihu.com/p/208318177 Spring Boot一个非常突出的优点就是不需要我们额外再部署Servlet容器,它内置了多种容器的支持。我们可以通过配置来指定我们需要的容器。 本文以我们平时最常使用的容器Tomcat为列来介绍以下两个知识点: Spr

[转帖]「性能优化系列」Tomcat线程连接池参数优化和JVM参数调优

尤其是以下三个配置项:maxConnections、maxThreads、acceptCount。 1.4.1 Tomcat的高效配置 Tomcat的maxConnections、maxThreads、acceptCount三大配置,分别表示最大连接数,最大线程数、最大的等待数,可以通过applic

[转帖]⭐万字长篇超详细的图解Tomcat中间件方方面面储备知识⭐

https://developer.aliyun.com/article/885079?spm=a2c6h.24874632.expert-profile.321.7c46cfe9h5DxWK 2022-04-13 132举报 简介: LNMT 1.JAVA简介 常见的大型平台有LNMP、LNMP、