Tomcat性能调优
Tomcat性能测试
-
性能测试最直观的衡量指标就是系统的加载和操作时间,也就是用户执行某项操作的耗时
-
性能测试可以从以下两个指标进行量化:
- 响应时间: 执行某个操作的耗时. 大多数情况下,需要针对同一个操作测试多次来获取操作的平均响应时间
- 吞吐量: 在给定的时间内,系统支持的事务数量.单位为TPS
-
使用一些自动化测试工具来进行性能测试,目前主流的性能测试工具有:
- ApacheBench
- ApacheJMeter
- WCAT
- WebPolygrah
- LoadRunner
ApacheBench
- ApacheBench是一款ApacheServer基准的测试工具,可以用于测试ApacheServer每秒处理请求数的服务能力
- ApacheBench不仅可以用于Apache的测试,还可以用于Tomcat, Nginx, lighthttp, IIS服务器
安装
yum install httpd-tools
验证是否安装成功
ab -V
部署项目
- 在服务器上安装Tomcat
- 将项目的war包上传至Tomcat的webapps目录下
- 导入项目SQL, 准备数据库连接
mysql> source table.sql
- 可以在控制台打开项目的执行日志
tail -f logs/catalina.out
性能测试
- 使用ApacheBench的性能测试命令测试Tomcat服务器性能:
ab -n 1000 -c 100 -p data.json -T application/json http://localhost:8080/add
- 性能测试命令参数说明:
| 参数 | 说明 |
|---|---|
| -n | 在测试会话中执行的请求 默认只执行一次请求 |
| -c | 一次产生的请求个数 默认一次只产生一个请求 |
| -p | 进行POST请求的数据文件 |
| -t | 测试进行的最长时间 默认没有时间限制 |
| -T | 进行POST请求数据所需要使用的Content-Type头信息 |
性能测试结果说明
- 性能测试结果说明:
| 指标名称 | 说明 |
|---|---|
| Server Software | 服务器软件 |
| Server Hostname | 服务器主机名称 |
| Server Port | 服务器主机端口号 |
| Document Path | 测试的页面 |
| Document Length | 测试的页面的大小 |
| Concurrency Level | 并发数 |
| Time taken for tests | 整个性能测试持续的时间 |
| Complete requests | 完成请求的数量 |
| Failed requests | 失败的请求数量 这里的失败是指请求的连接服务器,发送数据,接收数据等环节发生异常,以及无响应后超时的情况 |
| Write errors | 输出错误的数量 |
| Total transfered | 整个场景中的网络传输量 表示所有请求的响应数据长度总和,包括每个http响应数据的头信息和正文数据的长度 |
| HTML transfered | 整个场景中的HTML内容传输量 表示所有请求的响应数据中正文数据的总和 |
| Request per second | 每秒平均处理的请求数 相当于LR中每秒事务数,这个就是服务器的吞吐率,值为 C o m p l e t e r e q u e s t s T i m e t a k e n f o r t e s t s \frac{Complete requests}{Time taken for tests} TimetakenfortestsCompleterequests |
| Time per request | 每个线程处理请求的平均消耗时间 相当于LR中的平均事务响应时间,也是平均用户等待时间 |
| Transfer rate | 平均每秒网上的流量 |
| Percentage of requests serverd within a certain time(ms) | 指定时间内执行的请求百分比 |
- 重要指标:
| 指标名称 | 说明 |
|---|---|
| Requests per second | 吞吐率 服务器并发处理能力的量化描述,单位是reqs/s. 指的是在某个并发用户数下单位时间内处理的请求数 某个并发用户数下单位时间内能处理的最大请求数,称为最大吞吐率 这个数值表示当前服务器的整体性能,值越大越好 |
| Time per request | 用户平均等待时间 这是用户角度完成一个请求所需要的时间 |
| Time per request(across all concurrent requests) | 服务器平均等待时间 服务器完成一个请求的时间 |
| Concurrency Level | 并发用户数 |
Tomcat性能调优
-
Tomcat是一款Java应用,因此JVM的配置与Tomcat的运行性能密切相关
-
JVM的优化重点在于两个方面:
-
内存分配
- 内存会直接影响服务的运行效率和吞吐量
-
GC策略
- JVM垃圾回收机制会不同程度导致程序运行中断
- 根据应用程序的特点,选择不同的垃圾回收策略
- 调整JVM垃圾回收策略,可以极大减少垃圾回收次数,提升垃圾回收效率,改善程序运行性能
-
内存分配
- JVM内存参数配置说明:
| 内存参数 | 描述 | 说明 |
|---|---|---|
| -server | 以服务端模式运行应用 | 推荐开启以服务端模式运行 |
| -Xms | 最小堆内存 | 推荐与最大内存存 -Xmx 设置相同值 |
| -Xmx | 最大堆内存 | 推荐设置为可用内存的 80% |
| -XX:MetaspaceSize | 元空间的初始值 | 推荐使用默认值 |
| -XX:MaxMetaspaceSize | 元空间的最大内存 | 推荐使用默认值无限大 |
| -XX:MaxNewSize | 新生代的最大内存 | 推荐使用默认值 16M |
| -XX:NewRatio | 年轻代和老年代的内存值的比值,取值为整数 | 推荐使用默认值 2 |
| -XX:SurvivorRatio | Eden区与Survivor区内存值的比值,取值为整数 | 推荐使用默认值 8 |
- 配置JVM内存参数指令:
JAVA_OPTS="-server -Xms2048m -Xmx2048m -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m"
-
查看Tomcat的JVM内存参数信息:
- 首先获取Tomcat的进程ID:
ps -ef|grep tomcat- 执行查看JVM内存参数的指令查看JVM内存参数:
jmap -heap 51904
GC策略
-
JVM的垃圾回收性能主要包含以下两个指标:
- 吞吐量: 工作时间占总时间的百分比. 其中工作时间是排除GC垃圾回收时间,但是包括程序运行时间和内存分配时间
- 暂停时间: GC垃圾回收期间导致程序停止响应的时间
-
垃圾回收器的类型:
-
串行收集器: Serial Collector
- 使用单线程执行所有的垃圾回收工作
- 适用于单核CPU的服务器
-
并行收集器: Parallel Collector
- 吞吐量收集器, 以并行的方式执行年轻代的垃圾回收工作
- 可以显著降低垃圾回收的开销,多条垃圾回收线程并行工作,但是用户线程处于等待状态
- 适用于多处理器或者多线程硬件上运行的数据量比较大的应用
-
并发收集器: Concurrent Collector
- 以并发的方式执行大部分垃圾回收工作,用以缩短垃圾回收的暂停时间
- 可以最小化垃圾回收的暂停时间. 在垃圾回收期间,用户线程和垃圾回收线程是同时执行的,但是不一定是并行,可能会交替进行.可能会降低应用程序的性能
- 适用于响应时间优先于吞吐量的应用程序
-
CMS收集器: Concurrent Mark Sweep Collector
- 并发标记清除收集器
- 适用于需要缩短垃圾回收暂停时间并且执行与垃圾回收共享处理器资源的应用
-
G1收集器: Garbage-First Garbage Collector
- JDK1.7之后的垃圾收集器,可以在满足垃圾回收暂停时间目标的同时,以最大的可能性实现高吞吐量
- 适用于大容量内存的多核服务器
-
-
不同的应用程序,对于垃圾回收有不同的需求 . JVM会根据运行的平台,服务资源配置选择合适的垃圾收集器,堆内存以及运行时的编译器,总体满足以下原则:
- 程序数据量小时,选择串行收集器
- 应用运行在单核处理器并且没有暂停时间的限制需求时,可交由JVM自行选择垃圾收集器,或者选择串行收集器
- 需要应用程序具有较高的性能,但是对程序的暂停时间没有需求时,可以使用并行收集器
- 需要应用程序的响应时间较高,对整吞吐量没有限制要求时,可以使用并发收集器或者CMS收集器
-
查看Tomcat中的垃圾收集器:
- 如果查看的是本地Tomcat服务器的JVM信息,直接使用JDK的jconsole打开本地Tomcat线程,查看JVM概要信息
- 如果查看的是远程Tomcat服务器的JVM信息,需要在远程Tomcat的中的tomcat/bin/catalina.sh配置中,加入以下配置后再使用JDK的jconsole查看远程Tomcat的JVM概要信息
JAVA_OPTS="-Djava.rmi.server.hostname=192.168.6.36 -Dcom.sun.management.jmxremote.port=8866 -Dcom.sun.management.jmxremote.rmi.port=8866 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false" -
调整JAVA_OPTS中的参数启动指定的GC收集器:
| 参数 | 说明 |
|---|---|
| -XX:+UseSerialGC | 启用串行收集器 |
| -XX:+UseParallelGC | 启用并行收集器 如果配置了该选项,那么-XX:+UseParallelOldGC自动启用 |
| -XX:+UseParallelOldGC | FullGC采用并行收集器 默认禁用,如果设置了-XX:+UseParallelGC则自动启用 |
| -XX:ParallelGCThreads | 年轻代及老年代垃圾回收使用的线程数 默认值依赖于JVM使用的CPU个数 |
| -XX:+UseParNewGC | 年轻代使用并行收集器 如果设置了-XX:+UseConcMarkSweepGC自动则启用 |
| -XX:+UseConcMarkSweepGC | 老年代采用CMS垃圾收集器 当并行收集器无法满足应用的延迟需求时,推荐使用CMS或者G1收集器.如果配置了该选项,那么-XX:+UseParNewGC自动启用 |
| -XX:+UseG1GC | 启用G1收集器 G1收集器是服务器类型的收集器,适用于多核,大内存的机器.可以在高吞吐量的情况下,满足GC暂停时间的目标 |
- 调整JAVA_OPTS中的参数打印出GC执行时的相关信息:
| 参数 | 说明 |
|---|---|
| -XX:+PrintGC | 打印每次的GC信息 |
| -XX:+PrintGCApplicationConcurrentTime | 打印响应并发执行的时间 最后一次执行之后所经过的时间 |
| -XX:PrintGCApplicationStoppedTime | 打印GC时应用暂停的时间 |
| -XX:PrintGCDateStamps | 打印每次GC时的日期戳 |
| -XX:PrintGCDetails | 打印每次GC时的详细信息 |
| -XX:PrintGCTaskTimeStamps | 打印每个GC工作线程任务的时间戳 |
| -XX:PrintGCTimeStamps | 打印每次GC时的时间戳 |
Tomcat配置调优
-
调整tomcat/conf/server.xml中的连接器 < Connector /> 标签的参数可以对连接器进行配置来提升应用服务器的性能:
-
maxConnections: 最大连接数
- 当服务器接收的连接数到达该值时,服务器接收但不会处理更多的请求,额外的请求会阻塞直到连接数小于最大连接数maxConnections
- 配置最大连接数需要参考服务器硬件性能的限制,可以通过ulimit -a指令查看服务器的限制
- 当应用对CPU的性能要求很高时,最大连接数maxConnections的值不能配置过大. 当应用对CPU的性能要求不高时,推荐配置最大连接数maxConnection的值为2000. 这个也是要服务器的硬件性能的支持
-
maxThreads: 最大线程数
- 需要根据服务器硬件性能的支持,配置一个合理的值
-
acceptCount: 最大排队等待数
- 当服务器接收的请求数量达到最大连接数时,额外的请求会放在任务队列中进行等待
- acceptCount就是任务队列中排队等待的请求数
- Tomcat服务器的最大请求处理的数量值就是最大连接数maxConnections和最大排队等待数acceptCount之和
-