Tomcat性能优化

Tomcat性能优化

优化一、AJP连接

什么是AJP

AJP(Apache JServer Protocol)
AJPv13协议是面向包的。WEB服务器和Servlet容器通过TCP连接来交互;为了节省SOCKET创建的昂贵代价,WEB服务器会尝试维护一个永久TCP连接到servlet容器,并且在多个请求和响应周期过程会重用连接。

我们一般是使用Nginx+Tomcat的架构,所以用不着AJP协议,把AJP连接器禁用。

修改conf下的server.xml文件,将AJP服务禁用掉即可。

<!-- 禁用AJP连接 -->
<!-- <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> -->

优化二、线程池

在tomcat中每一个用户请求都是一个线程,所以可以使用线程池提高性能。

修改server.xml文件:

<!--将注释打开-->
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
        maxThreads="500" minSpareThreads="50" prestartminSpareThreads="true" maxQueueSize="100"/>

<!--
参数说明:
maxThreads:最大并发数,默认设置 200,一般建议在 500 ~ 1000,根据硬件设施和业务来判断
minSpareThreads:Tomcat 初始化时创建的线程数,默认设置 25
prestartminSpareThreads: 在 Tomcat 初始化的时候就初始化 minSpareThreads 的参数值,如果不等于 true,minSpareThreads 的值就没啥效果了
maxQueueSize,最大的等待队列数,超过则拒绝请求
-->

<!--在Connector中设置executor属性指向上面的执行器-->
<Connector executor="tomcatThreadPool" port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />

优化三、运行模式

tomcat的运行模式有3种:

bio
性能非常低下,没有经过任何优化处理和支持

nio
nio(new I/O),是Java SE 1.4及后续版本提供的一种新的I/O操作方式(即java.nio包及其子包)。Java nio是一个基于缓冲区、并能提供非阻塞I/O操作的Java API,因此nio也被看成是non-blocking I/O的缩写。它拥有比传统I/O操作(bio)更好的并发运行性能。Tomcat8默认使用nio运行模式。

apr
安装起来最困难,但是从操作系统级别来解决异步的IO问题,大幅度的提高性能

对于每种协议,Tomcat都提供了对应的I/O方式的实现,而且Tomcat官方还提供了在每种协议下每种I/O实现方案的差异, HTTP协议下的处理方式如下表,详情可查看Tomcat官网说明

推荐使用nio,在tomcat8中有最新的nio2,速度更快,建议使用nio2

设置nio2:

<Connector executor="tomcatThreadPool"  port="8080" protocol="org.apache.coyote.http11.Http11Nio2Protocol"
               connectionTimeout="20000"
               redirectPort="8443" />

优化四、调整tomcat启动参数

设置并行垃圾回收器

在/bin/catalina.sh文件第一行添加如下参数,gc日志输出到/logs/gc.log

#年轻代、老年代均使用并行收集器,初始堆内存64M,最大堆内存512M
JAVA_OPTS="-XX:+UseParallelGC -XX:+UseParallelOldGC -Xms64m -Xmx512m -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -XX:+PrintHeapAtGC -Xloggc:../logs/gc.log"

这样会产生gc.log文件

查看gc日志文件

将gc.log文件上传到gceasy.io查看gc中是否存在问题。上传文件后需要等待一段时间,需要耐心等待。

img

JVM配置最佳实践

此最佳配置仅供参考

JAVA_OPTS="-Dfile.encoding=UTF-8-server -Xms1024m -Xmx2048m -XX:NewSize=512m -XX:MaxNewSize=1024m -XX:PermSize=256m -XX:MaxPermSize=256m -XX:MaxTenuringThreshold=10-XX:NewRatio=2 -XX:+DisableExplicitGC"

参数说明:

file.encoding 默认文件编码

-Xmx1024m 设置JVM最大可用内存为1024MB

-Xms1024m 设置JVM最小内存为1024m。此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存。

-XX:NewSize 设置年轻代大小

-XX:MaxNewSize 设置最大的年轻代大小

-XX:PermSize 设置永久代大小

-XX:MaxPermSize 设置最大永久代大小

-XX:NewRatio=4 设置年轻代(包括Eden和两个Survivor区)与终身代的比值(除去永久代)。设置为4,则年轻代与终身代所占比值为1:4,年轻代占整个堆栈的1/5

-XX:MaxTenuringThreshold=0 设置垃圾最大年龄,默认为:15。如果设置为0的话,则年轻代对象不经过Survivor区,直接进入年老代。对于年老代比较多的应用,可以提高效率。如果将此值设置为一个较大值,则年轻代对象会在Survivor区进行多次复制,这样可以增加对象再年轻代的存活时间,增加在年轻代即被回收的概论。

-XX:+DisableExplicitGC 这个将会忽略手动调用GC的代码使得System.gc()的调用就会变成一个空调用,完全不会触发任何GC。

我的配置

JAVA_OPTS="-Dfile.encoding=UTF-8-server -Xms512m -Xmx512m -XX:NewSize=256m -XX:MaxNewSize=384m -XX:PermSize=256m -XX:MaxPermSize=256m -XX:MaxTenuringThreshold=10 -XX:NewRatio=2 -XX:+DisableExplicitGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -XX:+PrintHeapAtGC -Xloggc:../logs/gc.log"

测试

查看服务器信息

CentOS7服务器环境信息查看命令

查看Linux版本

cat /etc/centos-release

查看CPU个数

查看逻辑cpu个数:cat /proc/cpuinfo | grep “processor” | wc -l

查看物理cpu个数:cat /proc/cpuinfo | grep “physical id” | sort | uniq | wc -l

查看每个物理cpu的核数cores

cat /proc/cpuinfo | grep “cpu cores”

如果所有物理cpu的cores个数加起来小于逻辑cpu的个数,则该cpu使用了超线程技术。查看每个物理cpu中逻辑cpu的个数:cat /proc/cpuinfo | grep “siblings”

查看内存使用情况

free -m

参数说明

Mem:内存的使用情况总览表。

total:机器总的物理内存 单位为:M

used:用掉的内存。

free:空闲的物理内存。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZXvr85R2-1598259657168)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1595904574203.png)]

优化测试

JMeter测试

优化前:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3ShOkLAi-1598259657170)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1595908263746.png)]

优化后:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9lpXptPP-1598259657172)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1595908283048.png)]

吞吐量提高近3倍。

Linux下查看各资源使用情况

top命令查看所有java进程

top $(ps -e | grep java | awk '{print $1}' | sed 's/^/-p/')
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值