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

性能,优化,系列,tomcat,线程,连接池,参数,jvm · 浏览次数 : 0

小编点评

**maxConnections**:最大连接数,指一个应用在同一时间可以处理的最大连接数量。 **maxThreads**:最大线程数,指一个应用在同一时间可以处理的最大线程数量。 **acceptCount**:最大等待数,指一个应用在同一时间可以处理的最大等待连接数。

正文

在这里插入图片描述
尤其是以下三个配置项:maxConnections、maxThreads、acceptCount。

1.4.1 Tomcat的高效配置

Tomcat的maxConnections、maxThreads、acceptCount三大配置,分别表示最大连接数,最大线程数、最大的等待数,可以通过application.yml配置文件来改变这个三个值,一个标准的示例如下:

server:
  tomcat:
    uri-encoding: UTF-8
    #最大工作线程数,默认200, 48g内存,线程数经验值800
    #操作系统做线程之间的切换调度是有系统开销的,所以不是越多越好。
    max-threads: 1000
    # 等待队列长度,默认100
    accept-count: 1000
    max-connections: 20000
    # 最小工作空闲线程数,默认10, 适当增大一些,以便应对突然增长的访问量
   min-spare-threads: 100

    1.4.2 详解:maxConnections、maxThreads、acceptCount

    tomcat中maxConnections、maxThreads、acceptCount的具体含义是什么呢?参考官方文档,对三者的含义说明如下:
    一、accept-count:最大等待数
    官方文档的说明为:当所有的请求处理线程都在使用时,所能接收的连接请求的队列的最大长度。当队列已满时,任何的连接请求都将被拒绝。accept-count的默认值为100。详细的来说:当调用HTTP请求数达到tomcat的最大线程数时,还有HTTP请求到来,这时tomcat会将该请求放在等待队列中,这个acceptCount就是指能够接受的最大等待数,默认100。如果等待队列也被放满了,这个时候再来新的请求就会被tomcat拒绝(connection refused)。
    二、maxThreads:最大线程数
    每一次HTTP请求到达Web服务,tomcat都会创建一个线程来处理该请求,那么最大线程数决定了Web服务容器可以同时处理多少个请求。maxThreads默认200,肯定建议增加。但是,增加线程是有成本的,更多的线程,不仅仅会带来更多的线程上下文切换成本,而且意味着带来更多的内存消耗。JVM中默认情况下在创建新线程时会分配大小为1M的线程栈,所以,更多的线程异味着需要更多的内存。线程数的经验值为:1核2g内存为200,线程数经验值200;4核8g内存,线程数经验值800。
    三、maxConnections:最大连接数
    官方文档的说明为:
    这个参数是指在同一时间,tomcat能够接受的最大连接数。对于Java的阻塞式BIO,默认值是maxthreads的值;如果在BIO模式使用定制的Executor执行器,默认值将是执行器中maxthreads的值。
    对于Java 新的NIO模式,maxConnections 默认值是10000。对于windows上APR/native IO模式,maxConnections默认值为8192,这是出于性能原因,如果配置的值不是1024的倍数,maxConnections 的实际值将减少到1024的最大倍数。
    如果设置为-1,则禁用maxconnections功能,表示不限制tomcat容器的连接数。maxConnections和accept-count的关系为:当连接数达到最大值maxConnections后,系统会继续接收连接,但不会超过acceptCount的值。
    具体配置参数可以参见:https://tomcat.apache.org/tomcat-9.0-doc/config/http.html

    二、线程配置

    在并发配置方面,可以看到我们只有minSpareThreads,但是却没有maxSpareThreads。这是因为,从Tomcat 6开始增加Executor 节点,这个参数已经没用了。
    由于线程是一个池子,所以它的配置,满足池的一切特点。
    参照:https://tomcat.apache.org/tomcat-8.0-doc/config/executor.html
    namePrefix – 每个新开线程的名称前缀
    maxThreads – 线程池中的最大线程数
    minSpareThreads – 一直处于活跃状态的线程数
    maxIdleTime – 线程的空闲时间,在超过空闲时间时这些线程则会被销毁
    threadPriority – 线程池中线程的优先级,默认为5

    三、搞定JVM配置

    tomcat是Java应用,所以JVM的配置同样会影响它的性能。比较重要的配置参数如下。

    2.1、内存区域大小

    首先要调整的,就是各个分区的大小,不过这也要分垃圾回收器,我们仅看一下一些全局的参数。

    -XX:+UseG1GC 首先,要指定JVM使用的垃圾回收器。尽量不要靠默认值去保证,要显式的指定一个。
    -Xmx 设置堆的最大值,一般为操作系统的2/3大小。
    -Xms 设置堆的初始值,一般设置成和Xmx一样的大小来避免动态扩容。
    -Xmn 年轻代大小,默认新生代占堆大小的1/3。高并发快消亡场景可适当加大这个区域。对半,或者更多,都是可以的。但是在G1下,就不用再设置这个值了,它会自动调整。
    -XX:MaxMetaspaceSize 限制元空间的大小,一般256M足够。这一般和初始大小**-XX:MetaspaceSize**设置成一样的。
    -XX:MaxDirectMemorySize 设置直接内存的最大值,限制通过DirectByteBuffer申请的内存。
    -XX:ReservedCodeCacheSize 设置JIT编译后的代码存放区大小,如果观察到这个值有限制,可以适当调大,一般够用。
    -Xss 设置栈的大小,默认为1M,已经足够用了。

    2.2、内存调优

    -XX:+AlwaysPreTouch 启动时就把参数里说好了的内存全部初始化,启动时间会慢一些,但运行速度会增加。
    -XX:SurvivorRatio 默认值为8。表示伊甸区和幸存区的比例。
    -XX:MaxTenuringThreshold 这个值在CMS下默认为6,G1下默认为15。这个值和我们前面提到的对象提升有关,改动效果会比较明显。对象的年龄分布可以使用**-XX:+PrintTenuringDistribution**打印,如果后面几代的大小总是差不多,证明过了某个年龄后的对象总能晋升到老生代,就可以把晋升阈值设小。
    PretenureSizeThreshold 超过一定大小的对象,将直接在老年代分配。不过这个参数用的不是很多。

    2.3、垃圾回收器优化

    G1垃圾回收器
    -XX:MaxGCPauseMillis 设置目标停顿时间,G1会尽力达成。
    -XX:G1HeapRegionSize 设置小堆区大小。这个值为2的次幂,不要太大,也不要太小。如果是在不知道如何设置,保持默认。
    -XX:InitiatingHeapOccupancyPercent 当整个堆内存使用达到一定比例(默认是45%),并发标记阶段就会被启动。
    -XX:ConcGCThreads 并发垃圾收集器使用的线程数量。默认值随JVM运行的平台不同而不同。不建议修改。

    四、其他重要配置

    再看几个在Connector中配置的重要参数。
    enableLookups – 调用request、getRemoteHost()执行DNS查询,以返回远程主机的主机名,如果设置为false,则直接返回IP地址。这个要根据需求来
    URIEncoding – 用于解码URL的字符编码,没有指定默认值为ISO-8859-1
    connectionTimeout – 连接的超时时间(以毫秒为单位)
    redirectPort – 指定服务器正在处理http请求时收到了一个SSL传输请求后重定向的端口号

    五、总结

    tomcat是最常用的web容器,提供了数百个配置参数。但我们在平常的使用中,没必要把所有的参数都弄清楚,只关注最重要的就可以了;

    文章知识点与官方知识档案匹配,可进一步学习相关知识
    Java技能树首页概览100396 人正在系统学习中

    与[转帖]「性能优化系列」Tomcat线程连接池参数优化和JVM参数调优相似的内容:

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

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

    [转帖]JVM系列之:深入学习方法内联

    在前面多篇文章中多次提到方法内联,作为编译器最重要的优化技术,该技术不仅可以消除调用本身带来的性能开销,还能够触发更多的优化。本文将带领大家对该技术一探究竟。 方法内联 方法内联指的是:在编译过程中遇到方法调用时,将目标方法的方法体纳入编译范围之中,并取代原方法调用的优化手段。 以 getter/s

    [转帖]JVM系列之:深入学习方法内联

    https://zhuanlan.zhihu.com/p/487044559 在前面多篇文章中多次提到方法内联,作为编译器最重要的优化技术,该技术不仅可以消除调用本身带来的性能开销,还能够触发更多的优化。本文将带领大家对该技术一探究竟。 方法内联 方法内联指的是:在编译过程中遇到方法调用时,将目标方

    [转帖]性能优化必备——火焰图

    引言 本文主要介绍火焰图及使用技巧,学习如何使用火焰图快速定位软件的性能卡点。结合最佳实践实战案例,帮助读者加深刻的理解火焰图构造及原理,理解 CPU 耗时,定位性能瓶颈。 背景 当前现状 假设没有火焰图,你是怎么调优程序代码的呢?让我们来捋一下。 1. 功能开关法 想当年我刚工作,还是一个技术小白

    [转帖]性能优化 YYDS - Brendan Gregg 与 Intel.com 的故事

    https://www.modb.pro/db/421309 译者序 金庸笔下的《鹿鼎记》有: !! 平生不识陈近南,便称英雄也枉然 现代的认真搞技术的后端程序员,应该也有一句: !! 平生不识 Brendan Gregg,便呆 BAT 也 SoSo 从 2016 年开始,做一个 JVM 调优开始,

    [转帖]性能优化,从老中医到科学理论指导

    https://plantegg.github.io/2018/08/24/%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96%EF%BC%8C%E4%BB%8E%E8%80%81%E4%B8%AD%E5%8C%BB%E5%88%B0%E7%A7%91%E5%AD%A6%E7%

    [转帖]性能优化:频繁分配和释放内存导致的问题

    https://zhuanlan.zhihu.com/p/596366375 现象 1 压力测试过程中,发现被测对象性能不够理想,具体表现为: 进程的系统态CPU消耗20,用户态CPU消耗10,系统idle大约70。 2 用ps -o majflt,minflt -C program命令查看,发现m

    [转帖]性能优化经验分享

    https://maimai.cn/article/detail?fid=1773648919&efid=5xfDOW5OR3tSS0iyVW2ukA 近期,开发 C 端 h5 页面时,发现首页白屏时间比较长,并且用户也多次反映了这个问题,优化这个首屏加载时间是迟早的事,所以在开始优化前先做一些必要

    [转帖]性能最高提升36%!基于阿里云倚天实例的Redis性能测试验证

    性能最高提升36%!基于阿里云倚天实例的Redis性能测试验证 https://aijishu.com/a/1060000000376643 云计算Benchmark性能优化Arm 处理器Alibaba 本文转载自阿里云开发者社区。https://developer.aliyun.com/... 简

    [转帖]Linux性能优化-网络性能优化思路

    确定优化目标 优化前,首先要确定观察到的网络性能指标,要达到多少才合适? 虽然网络性能优化的整体目标,是降低网络延迟(如 RTT)和提高吞吐量(如 BPS 和 PPS),但具体到不同应用中,每个指标的优化标准可能会不同,优先级顺序也大相径庭。 NAT 网关通常需要达到或接近线性转发,也就是说, PP