阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

一起搞定Tomcat重要参数调优

32次阅读
没有评论

共计 2925 个字符,预计需要花费 8 分钟才能阅读完成。

导读 tomcat 这只老猫为何能活过普通猫咪能活的年龄? 这与它轻巧的构造有关,还与它卓越的性能有关。现在的 tomcat,版本已经飙到 10 了! 最新的版本是 10.0.2。

一起搞定 Tomcat 重要参数调优

tomcat 这只老猫为何能活过普通猫咪能活的年龄? 这与它轻巧的构造有关,还与它卓越的性能有关。现在的 tomcat,版本已经飙到 10 了! 最新的版本是 10.0.2。

tomcat 的配置参数奇多,但想要达到优化效果,我们并不需要全部关注。本文将详细介绍一些主要的配置参数,保证让你这只老猫跑的更快!

一般最常做的更改,就是修改服务器的端口,也就是 server.xml 里的 Connector 部分。典型如下图所示:

一起搞定 Tomcat 重要参数调优

其实,大部分优化,也是在 Connector 标签之内,从端口、并发到线程,都可以在这里配置。

一. 3 个参数搞定并发配置

作为一个能承接高并发互联网请求的 Web 容器,首当其冲的当然是海量请求的冲击。幸运的是 Tomcat 支持 NIO,我们可以通过调整线程数和并发配置,让它表现出最佳的性能。

  1. maxThreads — tomcat 接收客户端请求的最大线程数,也就是同时处理任务的个数,它的默认大小为 200; 一般来说,在高并发的 I / O 密集型应用中,这个值设置为 1000 左右比较合理
  2. maxConnections 这个参数是指在同一时间,tomcat 能够接受的最大连接数。对于 Java 的阻塞式 BIO,默认值是 maxthreads 的值; 如果在 BIO 模式使用定制的 Executor 执行器,默认值将是执行器中 maxThreads 的值。对于 Java 新的 NIO 模式,maxConnections 默认值是 10000,所以这个参数我们一般保持不动即可
  3. acceptCount — 当线程数量达到上面设置的值,所能接受的最大排队数量。超过了这个值,请求就会被拒绝。我一般会设置成和 maxThreads 设置成一样大的

简单说明一下上面三个参数的关系:

系统能够保持的连接数

maxConnections+acceptCount,区别是 maxConnections 中的连接可以被调度处理;acceptCount 中的连接只能等待排队

系统能处理的请求数

maxThreads 的大小,实际能够工作的线程数量。
幸福指数:maxThreads > maxConnections > acceptCount。
现在有些文章还充斥着 maxProcessors 和 minProcessors。但这两个参数,从 Tomcat5 开始被 deprecated,从 6 开始就彻底没了。
只能说你看到的这些文章,可能真的是不懂技术的运营发表的。
以 8 为代表,具体配置参数可以参见:
https://tomcat.apache.org/tomcat-8.0-doc/config/http.html

二、线程配置

在并发配置方面,可以看到我们只有 minSpareThreads,但是却没有 maxSpareThreads。这是因为,从 Tomcat 6 开始增加 Executor 节点,这个参数已经没用了。

由于线程是一个池子,所以它的配置,满足池的一切特点。

参照:https://tomcat.apache.org/tomcat-8.0-doc/config/executor.html

  1. namePrefix — 每个新开线程的名称前缀
  2. maxThreads — 线程池中的最大线程数
  3. minSpareThreads — 一直处于活跃状态的线程数
  4. maxIdleTime — 线程的空闲时间,在超过空闲时间时这些线程则会被销毁
  5. threadPriority — 线程池中线程的优先级,默认为 5
三、搞定 JVM 配置

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

3.1、内存区域大小

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

  1. -XX:+UseG1GC 首先,要指定 JVM 使用的垃圾回收器。尽量不要靠默认值去保证,要显式的指定一个。
  2. -Xmx 设置堆的最大值,一般为操作系统的 2 / 3 大小。
  3. -Xms 设置堆的初始值,一般设置成和 Xmx 一样的大小来避免动态扩容。
  4. -Xmn 年轻代大小,默认新生代占堆大小的 1 /3。高并发快消亡场景可适当加大这个区域。对半,或者更多,都是可以的。但是在 G1 下,就不用再设置这个值了,它会自动调整。
  5. -XX:MaxMetaspaceSize 限制元空间的大小,一般 256M 足够。这一般和初始大小 **-XX:MetaspaceSize** 设置成一样的。
  6. -XX:MaxDirectMemorySize 设置直接内存的最大值,限制通过 DirectByteBuffer 申请的内存。
  7. -XX:ReservedCodeCacheSize 设置 JIT 编译后的代码存放区大小,如果观察到这个值有限制,可以适当调大,一般够用。
  8. -Xss 设置栈的大小,默认为 1M,已经足够用了。
3.2、内存调优
  1. -XX:+AlwaysPreTouch 启动时就把参数里说好了的内存全部初始化,启动时间会慢一些,但运行速度会增加。
  2. -XX:SurvivorRatio 默认值为 8。表示伊甸区和幸存区的比例。
  3. -XX:MaxTenuringThreshold 这个值在 CMS 下默认为 6,G1 下默认为 15。这个值和我们前面提到的对象提升有关,改动效果会比较明显。对象的年龄分布可以使用 **-XX:+PrintTenuringDistribution** 打印,如果后面几代的大小总是差不多,证明过了某个年龄后的对象总能晋升到老生代,就可以把晋升阈值设小。
  4. PretenureSizeThreshold 超过一定大小的对象,将直接在老年代分配。不过这个参数用的不是很多。
3.3、垃圾回收器优化

G1 垃圾回收器

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

再看几个在 Connector 中配置的重要参数。

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

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

阿里云 2 核 2G 服务器 3M 带宽 61 元 1 年,有高配

腾讯云新客低至 82 元 / 年,老客户 99 元 / 年

代金券:在阿里云专用满减优惠券

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2024-07-25发表,共计2925字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中