Tomcat优化性能调优及代码优化建议

目录

1、Tomcat8优化

1.1、Tomcat配置优化

1.1.1、部署安装tomcat8

1.1.2、禁用AJP连接

1.1.3 什么是AJP呢?

1.1.3、执行器(线程池)

1.1.4、3种运行模式

1.2、部署测试用的java web项目

1.2.1、创建dashboard数据库

1.3、使用Apache JMeter进行测试

1.3.1、下载安装

1.3.2、修改主题和语言

1.3.3、创建首页的测试用例

1.3.4、启动、进行测试

1.3.5、聚合报告

1.4、调整tomcat参数进行优化

1.4.2、设置线程池

1.4.3、设置nio2的运行模式

1.5、调整JVM参数进行优化

1.5.1、设置并行垃圾回收器

1.5.2、查看gc日志文件

1.5.3、调整年轻代大小

1.5.4、设置G1垃圾回收器

1.5.5、小结


 

1、Tomcat8优化

tomcat服务器在JavaEE项目中使用率非常高,所以在生产环境对tomcat的优化也变得非常重要了。

对于tomcat的优化,主要是从2个方面入手,一是,tomcat自身的配置,另一个是tomcat所运行的jvm虚拟机的调优。

下面我们将从这2个方面进行讲解。

1.1、Tomcat配置优化

1.1.1、部署安装tomcat8

下载并安装:

https://tomcat.apache.org/download-80.cgi

Tomcat优化性能调优及代码优化建议_第1张图片

cd /tmp
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
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

#打开浏览器进行测试访问
http://192.168.40.133:8080/

Tomcat优化性能调优及代码优化建议_第2张图片

点击“Server Status”,输入用户名、密码进行登录,tomcat/tomcat

Tomcat优化性能调优及代码优化建议_第3张图片

 

Tomcat优化性能调优及代码优化建议_第4张图片

 

进入之后即可看到服务的信息。

1.1.2、禁用AJP连接

在服务状态页面中可以看到,默认状态下会启用AJP服务,并且占用8009端口。

Tomcat优化性能调优及代码优化建议_第5张图片

 

1.1.3 什么是AJP呢?

Tomcat HTTP协议与AJP协议
HTTP Connector
AJP Connector
配置

Tomcat在server.xml中配置了两种连接器。
HTTP Connector
拥有这个连接器,Tomcat才能成为一个web服务器,但还额外可处理Servlet和jsp。
AJP Connector
AJP连接器可以通过AJP协议和另一个web容器进行交互。
配置

           connectionTimeout="20000"
           redirectPort="8443" />




第一个连接器监听8080端口,负责建立HTTP连接。在通过浏览器访问Tomcat服务器的Web应用时,使用的就是这个连接器。

第二个连接器监听8009端口,负责和其他的HTTP服务器建立连接。在把Tomcat与其他HTTP服务器集成时,就需要用到这个连接器。AJP连接器可以通过AJP协议和一个web容器进行交互。tomcat和其他服务器的集成,就是通过ajp协议来完成的。

Web客户访问Tomcat服务器的两种方式:

è¿éåå¾çæè¿°

 

你对这个有误解,其实你更应该去看tomcat的官方文档,而不是网上所谓的资料: https://tomcat.apache.org/connectors-doc/ajp/ajpv13a.html

ajp13是一个二进制的TCP传输协议,相比HTTP这种纯文本的协议来说,效率和性能更高,也做了很多优化。显然,浏览器并不能直接支持AJP13协议,只支持HTTP协议。所以实际情况是,通过Apache的proxy_ajp模块进行反向代理,暴露成http协议给客户端访问。所以这么来看实际跟动静分离没一毛钱关系,你如果没做动静分离的设置,那么单纯反向代理AJP13协议也没太大的意义。

 

其他支持AJP协议的代理服务器当然也可以用这种做法。但是实际情况是,支持AJP代理的服务器非常少,比如目前很火爆的Nginx就没这个模块。因此tomcat的配置大部分都是关闭AJP协议端口的,因为除了Apache之外别的http server几乎都不能反代AJP13协议,自然就没太大用处了。

 

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

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

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


重启tomcat,查看效果。

Tomcat优化性能调优及代码优化建议_第6张图片

可以看到AJP服务以及不存在了。

 

1.1.3、执行器(线程池)

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

修改server.xml文件:








保存退出,重启tomcat,查看效果。

Tomcat优化性能调优及代码优化建议_第7张图片

 

在页面中显示最大线程数为-1,这个是正常的,仅仅是显示的问题,实际使用的指定的值。

也有人遇到这样的问题:https://blog.csdn.net/weixin_38278878/article/details/80144397

1.1.4、3种运行模式

tomcat的运行模式有3种:

  1. bio
    默认的模式,性能非常低下,没有经过任何优化处理和支持.
  2. 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)更好的并发运行性能。
  3. apr
    安装起来最困难,但是从操作系统级别来解决异步的IO问题,大幅度的提高性能.

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

设置nio2:


               redirectPort="8443" />

Tomcat优化性能调优及代码优化建议_第8张图片

 

可以看到已经设置为nio2了。

1.2、部署测试用的java web项目

为了方便测试性能,我们将部署一个java web项目,这个项目本身和本套课程没有什么关系,仅仅用于测试。

注意:这里在测试时,我们使用一个新的tomcat,进行测试,后面再对其进行优化调整,再测试。

1.2.1、创建dashboard数据库

cat dashboard.sql | mysql -uroot -proot

创建完成后,可以看到有3张表。

Tomcat优化性能调优及代码优化建议_第9张图片

 

1.2.2、部署web应用

找到自己的项目上传war包,上传到linux服务器,进行部署安装。

cd /tmp/apache-tomcat-8.5.34/webapps
rm -rf *
mkdir ROOT
cd ROOT/

rz上传war包
jar -xvf test-dashboard-web.war
rm -rf test-dashboard-web.war

#修改数据库配置文件
cd /tmp/apache-tomcat-8.5.34/webapps/ROOT/WEB-INF/classes
vim jdbc.properties

#这里根据自己的实际情况进行配置

jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://node01:3306/dashboard?useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true
jdbc.username=root
jdbc.password=root

重新启动tomcat。

访问首页,查看是否已经启动成功:http://192.168.40.133:8080/index

Tomcat优化性能调优及代码优化建议_第10张图片

 

 

1.3、使用Apache JMeter进行测试

Apache Jmeter是开源的压力测试工具,我们借助于此工具进行测试,将测试出tomcat的吞吐量等信息。

1.3.1、下载安装

下载地址:http://jmeter.apache.org/download_jmeter.cgi

Tomcat优化性能调优及代码优化建议_第11张图片

 

安装:直接将下载好的zip压缩包进行解压即可。

Tomcat优化性能调优及代码优化建议_第12张图片

 

进入bin目录,找到jmeter.bat文件,双机打开即可启动。

Tomcat优化性能调优及代码优化建议_第13张图片

 

Tomcat优化性能调优及代码优化建议_第14张图片

 

Tomcat优化性能调优及代码优化建议_第15张图片

 

1.3.2、修改主题和语言

默认的主题是黑色风格的主题并且语言是英语,这样不太方便使用,所以需要修改下主题和中文语言。

Tomcat优化性能调优及代码优化建议_第16张图片

 

Tomcat优化性能调优及代码优化建议_第17张图片

 

Tomcat优化性能调优及代码优化建议_第18张图片

主题修改完成。

接下来设置语言为简体中文。

Tomcat优化性能调优及代码优化建议_第19张图片

语言修改完成。

Tomcat优化性能调优及代码优化建议_第20张图片

 

1.3.3、创建首页的测试用例

第一步:保存测试用例

 

Tomcat优化性能调优及代码优化建议_第21张图片

 

第二步:添加线程组,使用线程模拟用户的并发

Tomcat优化性能调优及代码优化建议_第22张图片

 

Tomcat优化性能调优及代码优化建议_第23张图片

1000个线程,每个线程循环10次,也就是tomcat会接收到10000个请求。

第三步:添加http请求

Tomcat优化性能调优及代码优化建议_第24张图片

 

Tomcat优化性能调优及代码优化建议_第25张图片

 

第四步:添加请求监控

Tomcat优化性能调优及代码优化建议_第26张图片

 

Tomcat优化性能调优及代码优化建议_第27张图片

1.3.4、启动、进行测试

Tomcat优化性能调优及代码优化建议_第28张图片

1.3.5、聚合报告

在聚合报告中,重点看吞吐量。

Tomcat优化性能调优及代码优化建议_第29张图片

 

1.4、调整tomcat参数进行优化

通过上面测试可以看出,tomcat在不做任何调整时,吞吐量为73次/秒。

1.4.1、禁用AJP服务

 

Tomcat优化性能调优及代码优化建议_第30张图片

 

可以看到,禁用AJP服务后,吞吐量会有所提升。

当然了,测试不一定准确,需要多测试几次才能看出是否有提升。

1.4.2、设置线程池

通过设置线程池,调整线程池相关的参数进行测试tomcat的性能。

1.4.2.1、最大线程数为500,初始为50


测试结果:

吞吐量为128次/秒,性能有所提升。

1.4.2.2、最大线程数为1000,初始为200


Tomcat优化性能调优及代码优化建议_第31张图片

吞吐量为151,性能有所提升。

1.4.2.3、最大线程数为5000,初始为1000

是否是线程数最多,速度越快呢? 我们来测试下。


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

1.4.2.4、设置最大等待队列数

默认情况下,请求发送到tomcat,如果tomcat正忙,那么该请求会一直等待。这样虽然可以保证每个请求都能请求到,但是请求时间就会边长。

有些时候,我们也不一定要求请求一定等待,可以设置最大等待队列大小,如果超过就不等待了。这样虽然有些请求是失败的,但是请求时间会虽短。典型的应用:12306。



测试结果:

  • 平均响应时间:3.1秒
    • 响应时间明显缩短
  • 错误率:49.88%
    • 错误率提升到一半,也可以理解,最大线程为500,测试的并发为1000
  • 吞吐量:238次/秒
    • 吞吐量明显提升

结论:响应时间、吞吐量这2个指标需要找到平衡才能达到更好的性能。

1.4.3、设置nio2的运行模式

将最大线程设置为500进行测试:






 

Tomcat优化性能调优及代码优化建议_第32张图片

可以看到,平均响应时间有缩短,吞吐量有提升,可以得出结论:nio2的性能要高于nio。

1.5、调整JVM参数进行优化

接下来,测试通过jvm参数进行优化,为了测试一致性,依然将最大线程数设置为500,启用nio2运行模式。

1.5.1、设置并行垃圾回收器

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

Tomcat优化性能调优及代码优化建议_第33张图片

测试结果与默认的JVM参数结果接近。(执行了2次测试,结果是第二次测试的结果)

1.5.2、查看gc日志文件

将gc.log文件上传到gceasy.io查看gc中是否存在问题。

问题一:

Tomcat优化性能调优及代码优化建议_第34张图片

在报告中显示,在5次GC时,系统所消耗的时间大于用户时间,这反应出的服务器的性能存在瓶颈,调度CPU等资源所消耗的时间要长一些。

问题二:

Tomcat优化性能调优及代码优化建议_第35张图片

可以关键指标中可以看出,吞吐量表现不错,但是gc时,线程的暂停时间稍有点长。

问题三:

Tomcat优化性能调优及代码优化建议_第36张图片

通过GC的统计可以看出:

  • 年轻代的gc有74次,次数稍有多,说明年轻代设置的大小不合适需要调整
  • FullGC有8次,说明堆内存的大小不合适,需要调整

问题四:

Tomcat优化性能调优及代码优化建议_第37张图片

从GC原因的可以看出,年轻代大小设置不合理,导致了多次GC。

1.5.3、调整年轻代大小

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"

将初始堆大小设置为128m,最大为1024m

初始年轻代大小64m,年轻代最大256m

Tomcat优化性能调优及代码优化建议_第38张图片

从测试结果来看,吞吐量以及响应时间均有提升。

查看gc日志:

Tomcat优化性能调优及代码优化建议_第39张图片

 

Tomcat优化性能调优及代码优化建议_第40张图片

可以看到GC次数要明显减少,说明调整是有效的。

1.5.4、设置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"

测试结果:

Tomcat优化性能调优及代码优化建议_第41张图片

 

Tomcat优化性能调优及代码优化建议_第42张图片

可以看到,吞吐量有所提升,评价响应时间也有所缩短。

1.5.5、小结

通过上述的测试,可以总结出,对tomcat性能优化就是需要不断的进行调整参数,然后测试结果,可能会调优也可能会调差,这时就需要借助于gc的可视化工具来看gc的情况。再帮我我们做出决策应该调整哪些参数。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(网络编程)