Tomcat性能优化只是优化的一个环节,整体的服务器性能,还涉及到了服务器本身,代码等等很多因素。
系统性能的衡量,主要是响应时间和吞吐量:
- 响应时间:执行操作的耗时
- 吞吐量:系统在给定时间内,能够支持的事务数量,单位为TPS(Transactions PerSecond)。也就是事务数/秒,一个事务是指一个客户机向服务器发送请求然后服务器做出反应的过程。
Tomcat优化可以从两个方面入手:
-
JVM虚拟机优化(优化内存模型)
-
Tomcat自身配置的优化(比如是否适用共享线程池?IO模型?Bio,Nio)
不同的生产环境,有不同的情况,所以一般优化并不能照搬。必须根据自己的生产环境来进行调整。
调优是一个过程,需要根据服务器具体情况来调整最适合自己的。
这里只是提供一个思路。
虚拟机运行优化
JAVA虚拟机的运行优化主要是 内存分配
和 垃圾回收机制
的优化。
-
内存直接影响服务器的运行效率和吞吐量
-
JVM垃圾回收机制则会不同程度导致程序运行中断。
我们可以选择不同的垃圾回收策略,调整JVM垃圾回收策略,可以极大减少垃圾回收次数,提升垃圾回收效率,改善程序运行性能。
1.内存优化
JVM内存优化,主要也是优化“堆内存”。
java虚拟机内存有以下相关参数可以调整:
参数 | 作用 | 优化建议 |
---|---|---|
-server | 启动server已服务端模式运行 | 服务端模式建议开启 |
-Xms | 最小堆内存 | 与-Xmx一致(因为动态调整内存也是耗资源的,所以开始就保持一致即可) |
-Xmx | 最大堆内存 | 设置为可用内存的80% |
-XX:MetaspaceSize | 元空间初始值 | |
-XX:MaxMataspaceSize | 元空间最大内存 | 默认是无限制的 |
-XX:NewRatio | 年轻代和老年代大小比值,整数,默认是2 | 不需要修改 |
-XX:SurvivorRatio | Eden区与Survivor区大小的比值,整数,默认为8(8:1) | 不需要修改 |
JAVA虚拟机的参数:
配置到catalina.sh中,放到注释区域的下方即可。
JAVA_OPTS="-server -Xms2048m -Xmx2048m -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m"
如何查看是否配置生效呢?
使用jvm提供的查看内存映射工具 jhsdb
jhsdb jmap --heap --pid {进程PID}
2.垃圾回收策略(GC)
垃圾回收性能指标:
- 吞吐量,工作时间占总时间的百分比,工作时间不仅仅是程序运行的时间,还包含内存分配时间。
- 暂停时间,由垃圾回收导致的应用程序停止响应次数/时间
JVM有以下垃圾收集器:
-
串行收集器 Serial Collector
单线程执行所有垃圾回收工作,适合单核CPU服务器
-
并行收集器 Parallel Collector
又叫做吞吐量收集器(因为关注的是吞吐量),以并行的方式执行年轻代的垃圾回收。该方式可以显著降低垃圾回收的开销(这里是指多个垃圾收集线程并行工作,用户的线程还是会处于等待状态)。适用于多处理器火或者多线程硬件上运行的数据量大的应用。
-
并发收集器 Concurrent Collecotr
以并发的方式执行大部分垃圾回收工作,以缩短垃圾回收的暂停时间。
指的是用户线程与垃圾收集线程同时执行,但并不是一定是并行的,可能是交替进行。适用于响应时间优先于吞吐量的应用。
因为该收集器虽然最小化了暂停时间,但是会降低应用程序的性能。
-
CMS收集器 Concurrent Mark Sweep Collector
并发标记清除收集器,适用于愿意缩短垃圾回收暂停时间,并担负得起与垃圾回收共享处理器资源的应用。
-
G1收集器 Garbage-First Garbage Collector
这个是在JDK1.7之后才有的。
适用于大容量内存的多核服务器,可以在满足垃圾回收暂停时间的同时,以最大可能性实现高吞吐量。
可以使用java提供的jconsole工具查看
垃圾回收器的参数:
参数 | 描述 |
---|---|
-XX:+UseSerialGC | 启用串行收集器 |
-XX:+UserParallelGC | 启用并行垃圾收集器,配置了这个时,-XX:+UseParallelOldGC默认启用 |
-XX:+UserParNewGC | 年轻代采用并行收集器,如果设置了-XX:+UseConcMarkSweepGC,自动启用 |
-XX:ParallelGCThreads | 年轻代及老年代回收使用的线程数。默认依赖于JVM的CPU个数 |
-XX:+UseConcMarkSweepGC | 对于老年代,启用CMS垃圾收集器。当并行收集器无法满足应用的延迟需要时,推荐使用CMS或者G1。启用这个后,-XX:+UseParNewGC自动启用 |
-XX:+UseG1GC | 启用G1收集器。是服务器类型的收集器,用于多核,大内存的机器。它在保持高吞吐量的情况下,高概率满足GC暂停时间的目标 |
在catalina.sh中,添加以下配置:
JAVA_OPTS="-XX:+UseG1GC"
Tomcat自身优化
- 调整线程池
###调整tomcat连接器
调整server.xml中关于连机器的配置,可以提升应用服务器的性能
参数 | 说明 |
---|---|
maxConnections | 最大连接器,当到达这个数后,服务器会接收单不会处理这些请求,额外的请求会阻塞知道连接数低于maxConnections。可通过ulimit -a 查看服务器限制。对于CPU要求更高(计算密集型)时,这个值不要设置得太大 a(单个链接需要cpu分配的资源)*b(连接数)=c(耗费CPU)。对于CPU要求不是太高。建议可以设置在2000左右(受服务器影响) |
maxThreads | 最大线程数,需要根据服务器硬件情况进行合理的设置 |
acceptCount | 最大排队数,当服务器接收的请求达到maxConnections,tomcat会将后面的请求存放到任务队列中排队。acceptCount指的就是任务队列中排队的最大请求数。 |
Tomcat最大的请求处理数量为:maxConnections + acceptCount
禁用AJP连接器
AJP连接器是在于apache集成的设置,如果没有这个需求,可以把server.xml的AJP配置给注释掉
调整IO模式
Tomcat8之前使用默认的IO模型是BIO(阻塞式IO),对于每个请求都要创建一个线程来处理,不适合高并发。
Tomcat8之后使用默认的IO模型是NIO(非阻塞IO)。
调整 protocol 参数即可配置NIO
<Connetcor prot="8080"
protocol="org.apache.coyote.http11.Http11NioProtocol"
connectionTimeout="20000"
redirectPort="8443"/>
当Tomcat并发性能有较高要求或者出现瓶颈时,可以尝试使用APR(Apache Portable Runtime)模式,是从操作系统级别解决异步IO问题的,使用时需要在操作系统上安装ARP和Native(因为APR原理是使用JNI技术滴调用操作系统底层的IO接口的)
动静分离
Tomca不擅长处理静态资源。
可以使用Nginx+Tomcat的部署方案,Nginx负责静态资源的访问,Tomat负责动态资源访问处理。