Tomcat的性能优化点

生活中,最使人疲惫的往往不是道路的遥远,而是心中的郁闷;最使人痛苦的往往不是生活的不幸,而是希望的破灭;最使人颓废的往往不是前途的坎坷,而是自信的丧失;最使人绝望的往往不是挫折的打击,而是心灵的死亡。所以我们要有自己的梦想,让梦想的星光指引着我们走出落漠,走出惆怅,带着我们走进自己的理想。

导读:本篇文章讲解 Tomcat的性能优化点,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

开启Tomcat管理界面

修改tomcat\conf\tomcat-users.xml添加用户

<role rolename="manager"/>
<role rolename="manager-gui"/>
<role rolename="admin"/>
<role rolename="admin-gui"/>
<user username="tomcat" password="tomcat" roles="admin-gui,admin,manager-gui,manager"/>

注意:Tomcat9还需要修改tomcat\webapps\manager\META-INF\context.xml,注释value标签内容

<Context antiResourceLocking="false" privileged="true" >
  <Valve className="org.apache.catalina.valves.RemoteAddrValve"
         allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />
  <Manager sessionAttributeValueClassNameFilter="java\.lang\.(?:Boolean|Integer|Long|Number|String)|org\.apache\.catalina\.filters\.CsrfPreventionFilter\$LruCache(?:\$1)?|java\.util\.(?:Linked)?HashMap"/>
</Context>

启动Tomcat访问Server Status,输入配置的用户名、密码进行登录
在这里插入图片描述

禁用AJP协议

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

AJP协议在Tomcat8.5.51之前默认是开启的,后续版都是禁用的。

在这里插入图片描述
现在企业级主要使用Nginx+tomcat的架构,用不着AJP协议,所以可以把AJP连接器禁用,否则占用相应资源。可以使用JDK自带工具jvisualvm查看Ajp线程资源占用。
在这里插入图片描述
修改conf/server.xml,禁用AJP服务

 <!-- <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> -->

启用线程池

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

修改conf/server.xml,打开Executor注释,同时Connector使用executor属性指向执行器

  <!--注释没打开的情况下默认10个线程,最小10,最大200--> 
    <!-- <Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
        maxThreads="150" minSpareThreads="4"/>  -->
  
    <Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
        maxThreads="300" minSpareThreads="20"/>

    <!-- <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" /> -->

    <!-- A "Connector" using the shared thread pool-->
    
    <Connector executor="tomcatThreadPool"
               port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
name: 执行器名称

maxThreads:最大并发数,默认设置 200,一般建议在 500 ~ 1000,需结合硬件压测配置

namePrefix: 指定线程前缀名称

minSpareThreads:初始化时创建的线程数,默认设置 25

maxQueueSize:最大的等待队列数,超过则拒绝请求

使用jvisualvm工具查看
在这里插入图片描述

修改运行模式

Tomcat有4种运行模式

BIO:传统Java I/O操作,同步且阻塞IO

NIO:同步阻塞或同步非阻塞IO,是一种新的I/O操作方式

AIO/NIO2:异步非阻塞IO

APR: 安装困难,是从操作系统级别来解决异步的IO问题
	 Tomcat以JNI的形式调用Apache HTTP服务器的核心动态链接库来处理文件读取或网络传输操作,从而大大地提高Tomcat对静态文件的处理性能。

BIO性能低下,没有经过任何优化处理,Tomcat8.5开始已经舍弃了BIO模式,默认NIO模式。
在这里插入图片描述

NIO是一个基于缓冲区、并能提供非阻塞I/O操作,有比传统I/O操作(BIO)更好的并发运行性能。

NIO2异步的本质是数据从内核态到用户态这个过程是异步的,且该过程是可以分割的。

NIO中这个过程必须完成了才能执行下个请求,而NIO2不必等这个过程完成就可以执行下个请求,因此NIO2性能比NIO更高。

设置NIO2模式

    <!-- <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" /> -->

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

在这里插入图片描述

APR是从操作系统级别来解决异步的IO问题,大幅度的提高性能。

APR模式启动比较复杂,需要额外安装相关软件(安装gcc, expat-devel,perl-5,apr,apr-util,openssl,tomcat-native等)。

修改catalina.sh脚本文件,使tomcat支持apr配置apr库文件

# Register custom URL handlers
# Do this here so custom URL handles (specifically 'war:...') can be used in the security policy
JAVA_OPTS="$JAVA_OPTS -Djava.protocol.handler.pkgs=org.apache.catalina.webresources"
# 指向apr安装的lib目录
JAVA_OPTS="$JAVA_OPTS -Djava.library.path=/usr/local/apr/lib"

# Set juli LogManager config file if it is present and an override has not been issued

设置APR模式

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

在这里插入图片描述

调整Tomcat相关JVM参数

修改catalina.sh脚本

设置串行垃圾回收器

年轻代、老年代均使用串行收集器,初始堆内存64M,最大堆内存512M,打印gc时间戳等信息,生成gc日志文件
JAVA_OPTS="-XX:+UseSerialGC -Xms64m -Xmx512m -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX: +PrintGCDateStamps -XX:+PrintHeapAtGC -Xloggc:../logs/gc.log"

设置并行垃圾回收器

年轻代、老年代均使用并行垃圾收集器,初始堆内存64M,最大堆内存512M,打印gc时间戳等信息,生成gc日志文件
JAVA_OPTS="-XX:+UseParallelGC 
-XX:+UseParallelOldGC -Xms64m -Xmx512m 
-XX:+PrintGCDetails -XX :+PrintGCTimeStamps
-XX:+PrintGCDateStamps
-XX:+PrintHeapAtGC -Xloggc:../logs/gc.log"

GC日志分析对比

访问https://gceasy.io/进行GC日志在线分析,分别上传gc.log进行对比分析

结论:并行垃圾收集器平均执行时间减少,吞吐量增加,异常率减少,总体性能有提高

调整年轻代大小

年轻代、老年代均使用并行垃圾收集器,增加初始化堆内存和最大堆内存,分别设置为128m和1024m,打印gc时间戳等信息,生成gc日志文件
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.log进行分析,结论:发现性能再一次的得到提升

设置G1垃圾回收器(Jdk9之后默认G1)

年轻代、老年代均使用G1垃圾收集器,设置最大停顿时间100毫秒,初始堆内存128M,最大堆内存1024M,打印gc时间戳等信息,生成gc日志文件
JAVA_OPTS="-XX:+UseG1GC -Xms128m -Xmx1024m 
-XX:+PrintGCDetails -XX:+PrintGCTimeStamps
-XX:+Pr intGCDateStamps -XX:+PrintHeapAtGC 
‐XX:MaxGCPauseMillis=100
-Xloggc:../logs/gc.log"

上传gc.log进行分析,结论:总体性能再一次得到了提升

压缩属性设置

http响应头中压缩相关属性

1.传输内容编码:Content-Encoding

内容编码,数据在服务器端经过怎样的编码处理,然后客户端以怎么的编码来反向处理,以得到原始的内容

内容编码主要是指压缩编码,即服务器端压缩,客户端解压缩。 参考值:gzip,compress,deflate和identity

通常压缩方式都是gzip格式,当选择gzip的时候,整个html文本会被进行一次gzip格式的压缩

2.传输数据编码:Transfer-Encoding

数据编码,表示数据在网络传输当中,使用怎么样的保证方式来保证数据是安全成功地传输处理。

可以可以是分段传输,也可以是不分段,直接使用原数据进行传输。 有效的值为:chunked和Identity

3.传输内容格式:Content-Type

内容格式,接收的数据最终是以何种的形式显示在浏览器中

额外支持可选参数charset,即实际内容的字符集。通过字符集,客户端可以对数据进行解编码,以最终显示可以看得懂的文字

sendfile

sendfile是linux系统中一项优化技术,用以发送文件和网络通信时,减少用户态空间与磁盘倒换数据,而直接在内核级做数据拷贝。

Tomcat中基于在不同的通道中有不同的实现,配置也不尽相同,但实际上都是底层操作系统的SendFile的系统调用。

useSendfile属性在NIO通道中默认打开。

compression压缩属性设置

usesendfile和compression属性必须同时设置,且互斥

<Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443"
			   usesendfile="false"
			   compression="on"
			   />          

远程jmx监控查Tomcat

配置catalina.sh

CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote -Djava.rmi.server.hostname=112.74.X.X -Dcom.sun.management.jmxremote.port=9999  -Dcom.sun.management.jmxremote.rmi.port=9999 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false"

JMeter压力测试

JMeter是一款开源性能测试工具。

BadBoy

BadBoy是一款免费WEB自动化测试工具,其实就是一个浏览器模拟工具,具有录制和回放功能,支持对录制出来的脚本进行调试。同时支持捕获表单数据的功能,所以能够进行自动化测试。但目前用的多的是用来进行脚本录制,BadBoy支持将脚本导出为JMeter脚本。

JMeter录制脚本有多种方法,其中最常见的方法是用第三方工具badboy录制,另外还有JMeter自身设置(Http代理服务器+IE浏览器设置)来录制脚本,但用的多就是通过Badboy进行录制。

BadBoy脚本录制与使用
在这里插入图片描述
操作录制好后,点击File->Export to JMeter,保存为JMeter脚本。
在这里插入图片描述
JMeter打开BadBoy录制脚本
在这里插入图片描述
启动执行,后台得到相应请求结果
在这里插入图片描述
自建测试计划

新建测试计划,在该计划下新建线程组

在线程组下添加取样器---HTTP请求

在这里插入图片描述

在线程组下添加监听器---聚合报告

在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/136990.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!