Tomcat的性能优化点
开启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