目录
- 3. Tomcat 性能调优3.1 Tomcat 性能测试3.2 Tomcat 性能优化3.2.1Tomcat配置调优1.禁用AJP连接2.Connector 连接器的选择3.Executor线程池调整3.2.2 JVM参数调优1) JVM内存参数2) GC策略3.2.3 Tomcat架构调优动静分离:Tomcat集群:修改Tomcat默认端口号tomcat中部署项目的方式
3. Tomcat 性能调优
性能优化的三个指标
降低响应时间 :
提高系统吞吐量(QPS) : QPS (每秒请求量) T(事务) PS (每秒处理事务的数量)
提高服务的可用性:
性能优化的原则
具体情况具体分析
积少成多
性能分析工具
JConsole jvm性能监控平台: 主要监控 内存和CPU的情况
JMeter 分布式性能测试工具: 响应时间、吞吐量、错误率
性能优化测试指标
正确率、CPU占有率、QPS、JVM
3.1 Tomcat 性能测试
我们使用JMeter来进行测试:
3.2 Tomcat 性能优化
3.2.1Tomcat配置调优
1.禁用AJP连接
默认状态下,Tomcat会启动AJP服务,占用8009端口。
AJP是什么?有什么作用呢?
AJP(Apache JServer Protocol) 是为Tomcat与HTTP服务器之间通信而定制的协议,能提供较高的通信速度和效率。
Tomcat虽然是一个javaWeb服务器,可以对静态资源进行解析,但它最主要的作用是提供Servlet 和 Jsp容器,对静态资源的解析肯定不如一些专业的Http服务器 如:apache、nginx 。所以通常生产环境会把Tomcat和其他http服务器搭配使用, 所有请求都访问http服务器,如果访问的资源是Servlet或Jsp则http服务器将请求交由Tomcat处理,如果静态资源 http服务器直接处理, ajp就是apache服务器和tomcat服务器通信的主要协议,nginx 和 浏览器是不支持这个协议的,所以如果你不使用Tomcat和Apache服务器整合的话,这个AJP协议服务是没必要开启的。
ajp就是下面这行代码来配置,主要注释它就可以禁用AJP
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
2.Connector 连接器的选择
Tomcat 连接器的三种方式: bio、nio 和 apr,三种方式性能差别很大,apr 的性能最优, bio 的性能最差。而 Tomcat 7 使用的 Connector 默认就启用的 Apr 协议,但需要系统安装 Apr 库,否则就会使用 bio 方式。
BIO:
一个线程处理一个请求。缺点:并发量高时,线程数较多,浪费资源。
Tomcat7或以下,在Linux系统中默认使用这种方式。
NIO:
利用Java的异步IO处理,可以通过少量的线程处理大量的请求。
Tomcat8在Linux系统中默认使用这种方式。
Tomcat7必须修改Connector配置来启动:
APR:
即Apache Portable Runtime,从操作系统层面解决io阻塞问题。
Tomcat7或Tomcat8在Win7或以上的系统中启动默认使用这种方式。
Linux如果安装了apr和native,Tomcat直接启动就支持apr。
tomcat8 提供了nio2,效率要比nio快些,所以如果是tomcat8之前的版本推荐使用nio ,如果是tomcat8及之后的版本使用nio2
APR( Apache Portable Runtime) 提供卓越的伸缩性,更强的性能以及跟原生服务器技术更好的集成。
如果使用APR要保证1.配置文件中引入了APR的监听 2.服务器上安装APR的相关软件
linux配置APR:
安装依赖
yum install apr-devel yum install openssl-devel yum install gcc yum install make
安装APR包
进入 apache-tomcat-8.5.39/bin 执行命令 tar -xzvf tomcat-native.tar.gz
输入命令 cd
tomcat-native-1.2.21-src/native/进入到native文件夹下
执行命令 ./configure && make && make install
安装后会出现这个界面,表示安装成功,并给出了安装后的目录位置
通过上图我们可以看到 我们还需要配置两个环境变量
输入命令使环境变量生效 source /etc/profile
修改server.xml 配置
启动tomcat查看日志
进入到 /logs目录 执行命令 tail -f -n 200 catalina.out
<Connector executor="tomcatThreadPool"
port="8080"
protocol="org.apache.coyote.http11.Http11Nio2Protocol"