JVM优化之Tomcat8优化

Tomcat优化从两个方面入手,1、Tomcat自身的配置;2、Tomcat运行的JVM环境进行优化;
环境准备:linux 和tomcat8

linux安装jdk和tomcat

进入目录 /etc/local/user 新建java 文件夹

mkdir  usr/local/java

将准备好的jdk上传至java 目录 并且安装

tar -xvf jdk-8u171-linux-x64.tar.gz

查看修改profile 文件

vi etc/profile

JVM优化之Tomcat8优化_第1张图片
可以看到 环境变量已经配置 如果没有配置 在这个文件中新增以下内容

echo "export JAVA_HOME=/usr/local/java/jdk1.8.0_201" >> /etc/profile;
echo "export JRE_HOME=${JAVA_HOME}/jre" >> /etc/profile;
echo "export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib" >> /etc/profile;
echo "export  PATH=${JAVA_HOME}/bin:$PATH" >> /etc/profile;

profile 文件有了环境变量后回到用户目录下 生效 profile文件

 source  ../../etc/profile

查看是否安装成功‘

java -version

在这里插入图片描述
1、将jdk-8u171-linux-x64.tar.gz 上传

安装tomcat
1、新建一个tomcat目录,将tomcat8 上传至该目录
执行命令解压并且安装 执行命令:如果没有tomcat 执行以下命令 在线下载

wget http://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-8/v8.5.34/bin/apache- tomcat-8.5.34.tar.gz

在这里插入图片描述

tar -xvf apache-tomcat-8.5.34.tar.gz

进入tomcat bin 目录启动tomcat

./startup.sh

启动成功
JVM优化之Tomcat8优化_第2张图片

配置tomcat 用户和角色

cd apache-tomcat-8.5.34/conf
#修改配置文件,配置tomcat的管理用户
vim tomcat-users.xml
#写入如下内容:





#保存退出

#如果是tomcat7,配置了tomcat用户就可以登录系统了,但是tomcat8中不行,还需要修改另一个配置文件,否则访 问不了,提示403

vim webapps/manager/META-INF/context.xml

#将 

#保存退出即可
#启动tomcat cd /tmp/apache-tomcat-8.5.34/bin/ ./startup.sh && tail -f ../logs/catalina.out

#打开浏览器进行测试访问 访问8080端口 ,
JVM优化之Tomcat8优化_第3张图片
点击“Server Status”,输入用户名、密码进行登录,tomcat/tomcat
JVM优化之Tomcat8优化_第4张图片
进入之后即可看到服务的信息;

Tomcat 主要从三个方面

1、禁用AJP连接
2、设置Tomcat线程池
3、使用nio2
4、调整jvm运行参数

调整Tomcat参数进行优化测试

下载安装Apache JMeter

使用Apache JMeter进行测试,下载地址:http://jmeter.apache.org/download_jmeter.cgi
JVM优化之Tomcat8优化_第5张图片
下载完成之后进入bin目录,找到jmeter.bat文件,双机打开即可启动
JVM优化之Tomcat8优化_第6张图片
可以修改工具页面的主题和语言,修改黑色主题
JVM优化之Tomcat8优化_第7张图片
JVM优化之Tomcat8优化_第8张图片
修改页面语言方便查看
JVM优化之Tomcat8优化_第9张图片

Apache JMeter测试web应用

创建及保存应用首页的测试用例(应用为web应用,将war包放入tomcat并启动)
JVM优化之Tomcat8优化_第10张图片
添加线程组,使用线程模拟用户的并发,1000个线程,每个线程循环10次,也就是tomcat会接收到10000个请求。

JVM优化之Tomcat8优化_第11张图片
JVM优化之Tomcat8优化_第12张图片
添加http请求
JVM优化之Tomcat8优化_第13张图片
JVM优化之Tomcat8优化_第14张图片
添加请求监控,这里选择了聚合报告,结果树,使用表格查看
JVM优化之Tomcat8优化_第15张图片
JVM优化之Tomcat8优化_第16张图片
启动并且测试
JVM优化之Tomcat8优化_第17张图片
可以在聚合报告中查看吞吐量
JVM优化之Tomcat8优化_第18张图片

禁用Tomcat AJP协议

进行测试查看表格可以看到吞吐量会有所提升
JVM优化之Tomcat8优化_第19张图片

设置线程池

设置线程池进行测试对比,对打线程500,初始线程50


吞吐量明显提升
在这里插入图片描述
设置最大线程1000 初始线程200


JVM优化之Tomcat8优化_第20张图片

最大线程5000初始线程1000 ,



在这里插入图片描述
虽然最大线程已经设置到5000,但是实际测试效果并不理想,并且平均的响应时间也边长了,所以单
纯靠提升线程数量是不能一直得到性能提升的

设置最大等待队列数

在默认的情况下,请求发送到tomcat,如果tomcat正忙,这个请求就会一直等待,这样可以保证每个请求到可以请求到,但是这样的话请求时间会变长,有的时候也不一定需要长时间的等待可以通过设置最大的等待队列的大小如果超时就不用等待,这样虽然请求失败了 但是不需要一直等待,最典型的例子就是12306登陆


 

在这里插入图片描述
测试结果正
平均响应时间:3.1秒,明显缩短,错误率:49.88%错误率提升到一半也可以理解,超过1000就会一直等待,吞吐量:238次/秒,吞吐量明显提升所以响应时间、吞吐量这2个指标需要找到平衡才能达到更好的性能。

设置nio2的运行模式

默认为nio

 
 

在这里插入图片描述

调整JVM参数进行优化

设置并行垃圾回收器

进入tomcat,bin目录下修改cataila.sh脚本加入以下生成gc日志文件

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

测试与默认的参数几乎没有区别,
JVM优化之Tomcat8优化_第21张图片
可以将gc.log文件上传到gceasy.io查看gc中是否存在问题。

JVM优化之Tomcat8优化_第22张图片
可以关键指标中可以看出,吞吐量表现不错,但是gc时,线程的暂停时间稍有点长。
JVM优化之Tomcat8优化_第23张图片
年轻代的gc有74次,次数稍有多,说明年轻代设置的大小不合适需要调整
FullGC有8次,说明堆内存的大小不合适,需要调整
JVM优化之Tomcat8优化_第24张图片
从GC原因的可以看出,年轻代大小设置不合理,导致了多次GC。

调整年轻代大小在测试
将初始堆大小设置为128m,最大为1024m
初始年轻代大小64m,年轻代最大256m

JAVA_OPTS="-XX:+UseParallelGC -XX:+UseParallelOldGC -Xms128m -Xmx1024m -XX:NewSize=64m -XX:MaxNewSize=256m -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps - XX:+PrintHeapAtGC -Xloggc:../logs/gc.log"

JVM优化之Tomcat8优化_第25张图片
从测试结果来看,吞吐量以及响应时间均有提升。查看gc日志
JVM优化之Tomcat8优化_第26张图片
GC次数要明显减少,说明调整是有效的。
JVM优化之Tomcat8优化_第27张图片

设置G1垃圾回收器

#设置了最大停顿时间100毫秒,初始堆内存128m,最大堆内存1024m
 JAVA_OPTS="-XX:+UseG1GC -XX:MaxGCPauseMillis=100 -Xms128m -Xmx1024m -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -XX:+PrintHeapAtGC - Xloggc:../logs/gc.log"

JVM优化之Tomcat8优化_第28张图片
吞吐量有所提升,平均响应时间也有所缩短
可以总结出,对tomcat性能优化就是需要不断的进行调整参数,然后测试结果,可能会调优也可能会调差,这时就需要借助于gc的可视化工具来看gc的情况。再帮我我们做出决策应该调整哪些参数。

你可能感兴趣的:(JVM优化)