Tomcat优化从两个方面入手,1、Tomcat自身的配置;2、Tomcat运行的JVM环境进行优化;
环境准备:linux 和tomcat8
进入目录 /etc/local/user 新建java 文件夹
mkdir usr/local/java
将准备好的jdk上传至java 目录 并且安装
tar -xvf jdk-8u171-linux-x64.tar.gz
查看修改profile 文件
vi etc/profile
可以看到 环境变量已经配置 如果没有配置 在这个文件中新增以下内容
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
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端口 ,
点击“Server Status”,输入用户名、密码进行登录,tomcat/tomcat
进入之后即可看到服务的信息;
1、禁用AJP连接
2、设置Tomcat线程池
3、使用nio2
4、调整jvm运行参数
使用Apache JMeter进行测试,下载地址:http://jmeter.apache.org/download_jmeter.cgi
下载完成之后进入bin目录,找到jmeter.bat文件,双机打开即可启动
可以修改工具页面的主题和语言,修改黑色主题
修改页面语言方便查看
创建及保存应用首页的测试用例(应用为web应用,将war包放入tomcat并启动)
添加线程组,使用线程模拟用户的并发,1000个线程,每个线程循环10次,也就是tomcat会接收到10000个请求。
添加http请求
添加请求监控,这里选择了聚合报告,结果树,使用表格查看
启动并且测试
可以在聚合报告中查看吞吐量
设置线程池进行测试对比,对打线程500,初始线程50
最大线程5000初始线程1000 ,
虽然最大线程已经设置到5000,但是实际测试效果并不理想,并且平均的响应时间也边长了,所以单
纯靠提升线程数量是不能一直得到性能提升的
在默认的情况下,请求发送到tomcat,如果tomcat正忙,这个请求就会一直等待,这样可以保证每个请求到可以请求到,但是这样的话请求时间会变长,有的时候也不一定需要长时间的等待可以通过设置最大的等待队列的大小如果超时就不用等待,这样虽然请求失败了 但是不需要一直等待,最典型的例子就是12306登陆
测试结果正
平均响应时间:3.1秒,明显缩短,错误率:49.88%错误率提升到一半也可以理解,超过1000就会一直等待,吞吐量:238次/秒,吞吐量明显提升所以响应时间、吞吐量这2个指标需要找到平衡才能达到更好的性能。
默认为nio
进入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"
测试与默认的参数几乎没有区别,
可以将gc.log文件上传到gceasy.io查看gc中是否存在问题。
可以关键指标中可以看出,吞吐量表现不错,但是gc时,线程的暂停时间稍有点长。
年轻代的gc有74次,次数稍有多,说明年轻代设置的大小不合适需要调整
FullGC有8次,说明堆内存的大小不合适,需要调整
从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"
从测试结果来看,吞吐量以及响应时间均有提升。查看gc日志
GC次数要明显减少,说明调整是有效的。
#设置了最大停顿时间100毫秒,初始堆内存128m,最大堆内存1024m
JAVA_OPTS="-XX:+UseG1GC -XX:MaxGCPauseMillis=100 -Xms128m -Xmx1024m -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -XX:+PrintHeapAtGC - Xloggc:../logs/gc.log"
吞吐量有所提升,平均响应时间也有所缩短
可以总结出,对tomcat性能优化就是需要不断的进行调整参数,然后测试结果,可能会调优也可能会调差,这时就需要借助于gc的可视化工具来看gc的情况。再帮我我们做出决策应该调整哪些参数。