Tomcat性能调优
Tomcat性能测试
对于系统性能,用户最直观的感受就是系统的加载和操作时间,即用户执行某项操作的耗时。从更为专业的角度讲,性能测试可以从以下两个指标量化:
- 响应时间:如上所述,为执行某个操作耗时。大多数情况下,需要针对同一个操作测试多次,以获取操作的平均响应时间;
- 吞吐量:即在给定的时间内,系统支持的事务数量,计算单位为TPS;
通常情况下,我们需要借助一些自动化工具来进行性能测试,因为手动模拟大量用户的并发访问几乎是不可能的,而现在市面上也有很多的性能测试工具可以使用,如:ApacheBench、WCAT、WebPolygraph、LoadRunner、ApacheJMeter等。
JVM参数调优
Tomcat是一款Java应用,那么JVM的配置便与其运行性能密切相关,而JVM优化的重点则集中在内存分配和GC策略的调整上,因为内存会直接影响服务的运行效率和吞吐量,JVM垃圾回收机制则不同程度地导致程序运行中断。可以根据应用程序的特点,选择不同的垃圾回收策略,调整JVM垃圾回收策略,可以极大减少垃圾回收次数,提升垃圾回收效率,改善程序运行性能。
参数|参数作用|优化建议|
-server|启动server,以服务端模式运行|服务端建议开启|
-Xms|最小堆内存|建议与-Xmx设置相同|
-Xmx|最大堆内存|建议设置为可用内存的80%|
-XX:MetaspaceSize|元空间初始值||
-XX:MaxMetaspaceSize|元空间最大内存|默认无限|
-XX:MaxNewSize|新生代最大内存|默认16M|
-XX:NewRatio|年轻代和老年代大小比值,取值整数,默认为2|不建议修改|
-XX:SurvivorRatio|Eden区与Survivor区大小比值,取值整数,默认为3|不建议修改|
查看堆内存使用情况:
jmap -heap 进程id
GC策略
JVM垃圾回收性能有以下两个主要指标:
- 吞吐量:工作时间(排除GC时间)占总时间的百分比,工作时间并不仅是程序的运行时间,还包含内存分配时间;
- 暂停时间:测试时间段内,由垃圾回收导致的应用程序停止响应次数/时间;
在Sun公司推出的HotspotJVM中,包含以下几种不同类型的垃圾收集器 :
垃圾收集器 | 含义说明 |
---|---|
串行收集器( Serial Collector ) | 采用单线程执行所有的垃圾回收工作,适用于单核CPU服务 器,无法利用多核硬件的优势 |
并行收集器( Parallel Collector ) | 又称为吞吐量收集器,以并行的方式执行年轻代的垃圾回收 ,该方式可以显著降低垃圾回收的开销(指多条垃圾收集线程并行工作,但此时用户线程仍然处于等待状态)。适用于多处理器或多线程硬件上运行的数据量较大的应用 |
并发收集器( Concurrent Collector ) | 以并发的方式执行大部分垃圾回收工作,以缩短垃圾回收的暂停时间。适用于那些响应时间优先于吞吐量的应用,因为该收集器虽然最小化了 暂停时间(指用户线程与垃圾收集线程同时执行,但不一定是并行的,可能会交替进行),但是 会降低应用程序的性能 |
CMs收集器( Concurrent Mark Sweep collector ) | 并发标记清除收集器,适用于那些更愿意缩短垃圾回收暂停时间并 且负担的起与垃圾回收共享处理器资源的应用 |
G1收集器( Garbage一First Garbage Collector ) | 适用于大容量内存的多核服务器,可以在满足垃圾回收暂停时间目标的同时 ,以最大可能性实现高吞吐量(JDK1.7之后) |
不同的应用程序,对于垃圾回收会有不同的需求,JVM会根据运行的平台、服务器资源配置情况选择合适的垃圾收集器、对内存大小及运行时编译器。如果无法满足需求,参考以下准则:
- 程序数据量小,选择串行收集器
- 应用程序运行在单核处理器上且没有暂停时间要求,可交由JVM自行选择或选择串行收集器
- 如果考虑应用程序的峰值性能,没有暂停时间要求,可以选择并行收集器
- 如果应用程序的响应时间比整体吞吐量更重要,可以选择并发收集器
查看Tomcat中的默认的垃圾收集器:
如果为远程连接,需要在tоmсаt/bіn/саtаlіnа. ѕh配置中,假如如下配置:
JAVA_OPTS=" -Djava.rmi.server.hostname=192.168.192.138 -Dcom.sun.management.jmxremote.port=8999 -Dcom.sun.management.jmxremote.rmi.port=8999 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false"
如果为本地连接,直接使用jconsole连接:
CG参数:
参数 | 描述 |
---|---|
-XX:+UseSerialGC | 启用串行收集器 |
-XX:+UseParallelGC | 启用并行垃圾收集器,配置了该选项,那么-XX:+UseParallel0ldGc默认启用 |
-XX:+UseParallel0ldGC | FullGC采用并行收集,默认禁用。如果设置了-XX:+UseParallelGc则自动启用 |
-XX:+UseParNewGC | 年轻代采用并行收集器,如果设置了-XX:+UseConcMarkSweepGc选项,自动启用 |
-XX:ParallelGCThreads | 年轻代及老年代垃圾回收使用的线程数。默认值依赖于JVM使用的CPU个数 |
- XX:+UseCoEcMarkSweepGC |
对于老年代,启用CMS垃圾收集器。当并行收集 器无法满足应用的延迟需求是,推荐使用CMs或G1收集器。 启用该选项后,一XX:+UseParNewGC自动启用。 |
-XX:+UseG1GC | 启用G1收集器。 G1是服务器类型的收集器,用于多核、大内存的机器。它在保持高吞吐量的情况下,高概率满足Gc暂停时间的目标。 |
可以在测试的时候,将JVM参数调整之后,将GC信息打印出来,便于我们进行参数调整提供依据,具体参数如下:
选项 | 描述 |
---|---|
-XX:+PrintGC | 打印每次Gc的信息 |
-XX:+PrintsCApplicationConcurrentTime | 打印最后一次暂停之后所经过的时间,即响应并发执行的时间 |
-XX:+Pr intGCAppl icationStoppedTime | 打印Gc时应用暂停时间 |
-XX:+PrintGCDateStamps | 打印每次Gc的日期戳 |
-XX:+PrintGCDetails打印每次Gc的详细信息 | |
-XX:+PrintGCTaskT imeStamps | 打印每个cc工作线程任务的时间戳 |
-XX:+Pr intGCTimeStamps | 打印每次Gc的时间戳 |
在bin/ catalina. sh的脚本中,追加如下配置:
JAVA_OPTs="-XX:+UseConcMarkSweepGC -XX:+PrintGCDetails"
Tomcat配置调优
调整tomcat/conf/server.xml中关于链接器的配置可以提升应用服务器的性能
参数 | 说明 |
---|---|
maxConnections | 最大连接数,当到达该值后,服务器接收但不会处理更多请求,额外的请求将会阻塞直接连接数低于maxConnections。可通过ulimit -a 查看服务器限制。对于CPU要求更高(计算型)时,建议不要配置过大;对于CPU要求不是特别高时,建议配置在2000左右 |
maxThreads | 最大线程数,需要根据服务器的硬件情况,进行一个合理的设置 |
acceptCount | 最大排队等待数,当服务器接收的请求数量达到maxCounnections,此时Tomcat会将后面的请求,存放在任务队列中进行排序,acceptCount指的就是任务队列中排队等待的请求数。一台Tomcat的最大请求处理数量,是maxConnections+acceptCount |