tomcat8 优化(配置优化 & 利用jvm参数进行优化)

tomcat8 优化

tomcat可以说是比较常用的了,所以tomcat优化在生产环境也是比较重要的。对于tomcat优化,主要从2个方面,一是tomcat自身的配置,另外一个就是利用jvm虚拟机的调优。

随便找个web项目(不想找的可以私信或者评论找我要我测试的),打成war包丢到tomcat ROOT下,去mysql官网找点测试数据。保证请求访问能成功。
然后利用 Jmeter 做压力测试。先配置下Jmeter。

添加线程组
tomcat8 优化(配置优化 & 利用jvm参数进行优化)_第1张图片
配置线程组
tomcat8 优化(配置优化 & 利用jvm参数进行优化)_第2张图片
添加HTTP请求
tomcat8 优化(配置优化 & 利用jvm参数进行优化)_第3张图片
tomcat8 优化(配置优化 & 利用jvm参数进行优化)_第4张图片
添加几个请求的监控(查看结果用的)
tomcat8 优化(配置优化 & 利用jvm参数进行优化)_第5张图片

启动tomcat,做第一次测试。tomcat启动之后。
tomcat8 优化(配置优化 & 利用jvm参数进行优化)_第6张图片
tomcat8 优化(配置优化 & 利用jvm参数进行优化)_第7张图片
可以看出,我们第一次的响应时间是1512ms,吞吐量为621。这个每次测试都不一样的,但是大概都是这个数值,具体数值和电脑性能有关。响应时间越少、吞吐量越大 就表示电脑性能越好。当然在服务器上,我们除了升级配置,就只能来优化tomcat了。下面开始优化。

优化1:禁用AJP服务

AJP(Apache JServer Protocol) 是apache的一种服务协议,WEB服务器和servlet容器通过TCP连接来交互,为了节省socket创建的代价,web服务器会尝试维护一个永久的tcp连接到servlet容器,并且在多个请求和响应周期过程会重用连接。
但是我么现在基本都用nginx + tomcat ,所以用不着AJP了。

打开conf 下的 server.xml 文件 找到AJP配置 注释掉它。

  "8009" protocol="AJP/1.3" redirectPort="8443" />

然后重启tomcat。
在这里插入图片描述
可以看到响应时间和吞吐量有了明显变化。响应时间为 1145ms,吞吐量达到了777.7。可以多测试几次,但是会发现都是有提升的。

优化2:启用线程池

打开conf/server.xml文件
tomcat8 优化(配置优化 & 利用jvm参数进行优化)_第8张图片
可以看到,线程池被注释掉了,可以打开它 ,也可以再复制一份。

    "tomcatThreadPool" namePrefix="catalina-exec-"
        maxThreads="500" minSpareThreads="50" prestartminSpaceThreads="true"/>

    "tomcatThreadPool" port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />

先设置最大线程数500,最小线程数50。重启tomcat,来看下测试结果
在这里插入图片描述
可以看到 响应时间 1105ms,吞吐量达到了813。接下来我们调整下线程的数量,再进行测试。
将最大线程数设置为1000 最小线程数为100。
在这里插入图片描述
发现并不是线程数越多速度就越快,还是要适合自己的项目以及电脑的配置。

优化3:设置队列最大等待数

"tomcatThreadPool" namePrefix="catalina-exec-"
        maxThreads="500" minSpareThreads="50" prestartminSpaceThreads="true" maxQueueSize = "100"/>

在这里插入图片描述
可以看到吞吐量明显上升,响应时间明显下降,但是错误率也很高,接近百分之50。为什么呢,因为我们测试的最大线程数是500,测试了1000个线程。所以错误率达到一半了。

这种配置就适合抢票那种设计,满了就等待。例如:12306。

优化4:设置运行模式为 nio2

现在把队列最大等待数先删掉,配置运行模式为nio2

    "tomcatThreadPool" namePrefix="catalina-exec-"
        maxThreads="500" minSpareThreads="50" prestartminSpaceThreads="true"/>

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

在这里插入图片描述
可以看出来是比nio1性能要稍微高一点的。

优化5:调整jvm参数

打开tomcat bin目录下的 catalina.sh 加入下面参数

JAVA_OPTS="-XX:+UseParallelGC -XX:+UseParallelOldGC -Xms512m -Xmx2048m -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -XX:+PrintHeapAtGC -Xloggc:../logs/gc.log"

参数的意思是新生代,老年代都使用ParallerGC,也就是并行的垃圾收集器,如果不了解垃圾收集器可以查看我的历史博客 jvm垃圾收集器。初始堆内存512m,最大堆内存 2048m,并且在log目录打印出gc.log日志。
初始堆内存的值和最大堆内存的值需要根据服务器的配置多次尝试,得出最优结果。我的结果和上面差不多,没有什么明显变化。

gc.log日志可前往 gc分析 进行分析。

我们再设置为G1收集器试试。

JAVA_OPTS="-XX:+UseG1GC -XX:MaxGCPauseMillis=100 -Xms512m -Xmx2048m -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -XX:+PrintHeapAtGC -Xloggc:/Users/pengweiwei/Downloads/apache-tomcat-8.5.50/logs/gc.log"

在这里插入图片描述可以得出结论是tomcat性能优化需要不断的调整参数,然后测试结果,可能会调优,也可能会调差,可以借助gc分析网站,以及一些可视化的工具来查看,决策应该调整哪些参数,我电脑后面已经有点发烫了,估计影响了些许性能。

你可能感兴趣的:(jvm)