tomcat在高并发下的线程设置和JVM内存调优

环境概述:

网上大部分Tomcat优化的博客根本就是漏洞百出(与官方文档或者注释不符),抄来抄去的不带脑子,本人出于义愤之下写了这篇博客,调优过程中的每一处细节和过程都是我精心查证打磨过的,绝对可靠,大家可以作为一个参考和借鉴.
我的调优环境是tomcat8.5 + jdk1.8 不过老版本也可以看一下作为一个参考 下面也会讲述一些老版本的细节问题,机器是4核8g

最具权威的参考资料

tomcat英文官方文档 这个链接直达Apache Tomcat 8 配置参考页面 其中详述了怎么配置tomcat8的高并发设置 有兴趣的可以读一读(学会阅读英文的官方文档非常重要 我就非常后悔英文学的不过关)

tomcat的并发线程配置
官方基本参数列表

Connector 配置参数列表:

属性描述
porttomcat启动和访问的端口号
protocol设置协议以处理传入流量。默认值是 HTTP/1.1使用自动切换机制来选择基于 Java NIO 的连接器或基于 APR/本机的连接器。如果PATH(Windows) 或LD_LIBRARY_PATH(在大多数 unix 系统上) 环境变量包含 Tomcat 本机库,并且AprLifecycleListener用于初始化 APR 的useAprConnector属性设置为 true,则将使用 APR/本机连接器。如果找不到本机库或未配置属性,则将使用基于 Java NIO 的连接器。请注意,APR/本机连接器的 HTTPS 设置与 Java 连接器不同。要使用显式协议而不是依赖上述自动切换机制,可以使用以下值:org.apache.coyote.http11.Http11NioProtocol- 非阻塞 Java NIO 连接器org.apache.coyote.http11.Http11Nio2Protocol- 非阻塞 Java NIO2 连接器org.apache.coyote.http11.Http11AprProtocol- APR/本机连接器。也可以使用自定义实现。
connectionTimeout此连接器在接受连接后等待显示请求 URI 行的毫秒数。使用值 -1 表示没有(即无限)超时。默认值为 60000(即 60 秒),但请注意,Tomcat 附带的标准 server.xml 将其设置为 20000(即 20 秒)。除非disableUploadTimeout设置为false,否则在读取请求正文(如果有)时也将使用此超时.
redirectPort如果此连接器支持非 SSL 请求,并且收到匹配 需要 SSL 传输的请求,Catalina 将自动将请求重定向到此处指定的端口号。
acceptCountmaxConnections已达到操作系统为传入连接请求提供的队列的最大长度。操作系统可能会忽略此设置并为队列使用不同的大小。当此队列已满时,操作系统可能会主动拒绝其他连接,或者这些连接可能会超时。默认值为 100。
maxConnections服务器在任何给定时间将接受和处理的最大连接数。当达到此数目时,服务器将接受但不处理进一步的连接。这个额外的连接被阻塞,直到正在处理的连接数低于maxConnections,此时服务器将再次开始接受和处理新连接。请注意,一旦达到限制,操作系统可能仍会根据acceptCount设置接受连接。默认值因连接器类型而异。对于 NIO 和 NIO2,默认值为10000. 对于 APR/native,默认为8192.仅对于 NIO/NIO2,将值设置为 -1,将禁用 maxConnections 功能并且不会计算连接数。
maxThreads此Connector要创建的最大请求处理线程数,因此决定了可以处理的最大并发请求数。如果未指定,则此属性设置为 200。如果执行程序与此连接器关联,则忽略此属性,因为连接器将使用执行程序而不是内部线程池执行任务。请注意,如果配置了执行程序,则为此属性设置的任何值都将被正确记录,但会报告(例如通过 JMX) -1以明确未使用它。
minSpareThreads最小线程数始终保持运行。这包括活动线程和空闲线程。如果未指定,10 则使用默认值。如果执行器与此连接器相关联,则忽略此属性,因为连接器将使用执行器而不是内部线程池执行任务。请注意,如果配置了执行程序,则为此属性设置的任何值都将被正确记录,但会报告(例如通过 JMX)-1以明确未使用它。
executor对Executor 元素中名称的引用。如果设置了此属性,并且指定的执行程序存在,则连接器将使用执行程序,并且将忽略所有其他线程属性。请注意,如果未为连接器指定共享执行器,则连接器将使用私有的内部执行器来提供线程池。

executor参数列表

属性描述
name用于在 server.xml 中的其他位置引用此池的名称。该名称是必需的,并且必须是唯一的。
maxThreads(int) 此池中最大活动线程数,默认为 200
minSpareThreads(int) 始终保持活动状态的最小线程数(空闲和活动),默认为 25
prestartminSpareThreads(boolean) 启动Executor时是否启动minSpareThreads,默认为 false
maxQueueSize(int) 在我们拒绝它们之前可以排队等待执行的可运行任务的最大数量。默认值为Integer.MAX_VALUE
namePrefix(字符串)执行程序创建的每个线程的名称前缀。单个线程的线程名称将是namePrefix+threadNumber
我的tomcat线程配置
    <Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
        maxThreads="800" minSpareThreads="100" prestartminSpareThreads="true"/>
        
    <Connector executor="tomcatThreadPool"
               port="666666" protocol="org.apache.coyote.http11.Http11Nio2Protocol"
               connectionTimeout="20000"
               redirectPort="6589" acceptCount="500"/>

参数解释与注意事项: 此处的配置绝对是跟官方文档完全相符合的.protocol参数建议配置为org.apache.coyote.http11.Http11Nio2Protocol 他采用nio2处理速度比较快 此外Executor 配置必须在Connector 的前面否则会报错 此外prestartminSpareThreads必须配置 否则minSpareThreads配置不会生效.经过压测发现4核8g的机器maxThreads大概在600到800之间 最为合适 但是遇到的另一个坑是redis连接数之前配置小了 导致压测报错jedis获取不到连接数 这些情况需要注意一下

tomcat的jvm内存配置

网上好多说去修改catalina.sh的纯属无稽之谈,这个脚本里面版权声明下面第一句话就是不允许在这个脚本里设置自定义变量,如果你需要的话在tomcat的bin目录下建立 setenv.sh 脚本文件来保存你的自定义参数变量:原画如图:
在这里插入图片描述

内存调优配置如下:
JAVA_OPTS="$JAVA_OPTS -server -Xmx5120M -Xms5120M -XX:NewSize=1024m -XX:MaxNewSize=1856m -XX:NewRatio=3"

注意:这行代码在setenv.sh脚本之中不允许换行 否则程序启动会失败(感兴趣的话可以看看catalina.sh脚本 他去读取和处理了setenv.sh中的参数)

最后总结

只要你有一颗热爱技术的心 好多事情并不像你想象的那么困难,不过不得不吐槽的是现在博客质量真是鱼龙混杂,大部分都是水文 抄袭文 好多时候还是要锻炼自己阅读理解英文文档的能力 遇到问题去翻官方文档 是最高效 也是最正确的 不会出现错误性引导 最后在附一下tomcat官方文档链接 Apache Tomcat 8 配置参考页面

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

life or die

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值