【tomcat】调优思路
Tomcat调优的简单介绍
- 本文从优化启动速度和运行速度进行分析。
- Tomcat调优的核心实现是:关闭不必要的插件来提高启动速度、配置合适的线程数来提高整体性能。
启动速度调优
- 清理不必要的文件
- 清理不必要的 Web 应用
- 删除掉 webapps 文件夹下不需要的工程,一般是 host-manager、example、doc 等这些默认的工程,可能还有以前添加的但现在用不着的工程
- 清理 不必要的XML 配置
- 清理 不必要的JAR 文件
- 清理其他文件:比如日志...
- 禁止 Tomcat TLD 扫描:可以提高Tomcat的启动速度,并节省JSP编译时间。在conf/context.xml,添加下面的配置。
<JarScanner>
<JarScanFilter defaultTldScan="false"/>
</JarScanner>
- 关闭WebSocket支持:在conf/context.xml中给 Context 标签加一个containerSciFilter属性。
<Context containerSciFilter="org.apache.tomcat.websocket.server.WsSci">
</Context>
- 关闭JSP支持:在conf/context.xml中给 Context 标签加一个containerSciFilter属性。
<Context containerSciFilter="org.apache.tomcat.websocket.server.JasperInitializer">
</Context>
<!-- WebSocket 和 JSP都关闭 -->
<Context containerSciFilter="org.apache.tomcat.websocket.server.WsSci | org.apache.tomcat.websocket.server.JasperInitializer">
</Context>
- 禁止Servlet注解扫描:Servlet 3.0 引入了注解 Servlet,Tomcat 为了支持这个特性,会在 Web 应用启动时扫描你的类文件,因此如果你没有使用 Servlet 注解这个功能,可以告诉 Tomcat 不要去扫描 Servlet 注解。在web应用的web.xml中配置
<web-app metadata-complete="true">
</web-app>
- 并行启动多个 Web 应用:Tomcat 启动的时候,默认情况下 Web 应用都是一个一个启动的,等所有 Web 应用全部启动完成,Tomcat 才算启动完毕。如果在一个 Tomcat 下你有多个 Web 应用,为了优化启动速度,可以配置多个应用程序并行启动。修改conf/server.xml中Host 标签的 startStopThreads 属性.
<Host startStopThreads="0">
</Host>
性能调优整体思路
- Tomcat 的关键指标有吞吐量、响应时间、错误数、线程池、CPU 以及 JVM 内存。
- 前三个指标是我们最关心的业务指标,Tomcat 作为服务器,就是要能够又快有好地处理请求,因此吞吐量要大、响应时间要短,并且错误数要少。
- 后面三个指标是跟系统资源有关的,当某个资源出现瓶颈就会影响前面的业务指标,比如线程池中的线程数量不足会影响吞吐量和响应时间;但是线程数太多会耗费大量 CPU,也会影响吞吐量;当内存不足时会触发频繁地 GC,耗费 CPU,最后也会反映到业务指标上来。
linux下tomcat的一下性能监控命令
# 通过 ps 命令找到 Tomcat 进程,拿到进程 ID
ps -ef|grep tomcat
# 查看进程状态的大致信息
cat/proc/<pid>/status
# 监控进程的 CPU 和内存资源使用情况
top -p pid
# 查看 Tomcat 的网络连接,比如 Tomcat 在 8080 端口上监听连接请求
netstat -na|grep 8080
性能调优工具:JConsole
- 连接远程tomcat:linux上,在tomcat安装目录的bin下,新建setenv.sh,重启tomcat。
export JAVA_OPTS="-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9999 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false"
常用的调优参数(线程池的调优)
-
namePrefix: 线程前缀
-
maxThreads: 最大线程数,默认设置 200,一般建议在 500 ~ 800,根据硬件设施和业务来判断
-
minSpareThreads: 核心线程数,默认设置 25
-
prestartminSpareThreads: 在 Tomcat 初始化的时候就初始化核心线程
-
maxQueueSize: 最大的等待队列数,超过则拒绝请求 ,默认 Integer.MAX_VALUE
-
maxIdleTime: 线程空闲时间,超过该时间,线程会被销毁,单位毫秒
-
className: 线程实现类,默认org.apache.catalina.core.StandardThreadExecutor
-
tomcat调优的配置文件:sever.xml
<!--
重点是maxThreads的值。
CPU密集型任务:最佳的线程数为 CPU 核心数的 1~2 倍。
IO密集型任务:《Java并发编程实战》的作者 Brain Goetz 推荐的计算方法:线程数 = CPU 核心数 *(1+平均等待时间/平均工作时间)。
-->
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-Fox"
prestartminSpareThreads="true"
maxThreads="500" minSpareThreads="8" maxIdleTime="10000"/>
<Connector port="8080" protocol="HTTP/1.1" executor="tomcatThreadPool"
connectionTimeout="20000"
redirectPort="8443" URIEncoding="UTF-8"/>
SpringBoot应用中调整Tomcat参数(配置文件方式)
server:
tomcat:
threads:
min-spare: 20
max: 200
connection-timeout: 5000ms
SpringBoot应用中调整Tomcat参数(重写方法的方式)
@Configuration
public class MyTomcatCustomizer implements WebServerFactoryCustomizer<TomcatServletWebServerFactory> {
@Override
public void customize(TomcatServletWebServerFactory factory) {
factory.setPort(8090);
factory.setProtocol("org.apache.coyote.http11.Http11NioProtocol");
factory.addConnectorCustomizers(connectorCustomizer());
}
@Bean
public TomcatConnectorCustomizer connectorCustomizer(){
return new TomcatConnectorCustomizer() {
@Override
public void customize(Connector connector) {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
protocol.setMaxThreads(500);
protocol.setMinSpareThreads(20);
protocol.setConnectionTimeout(5000);
}
};
}
}
结束语
- 获取更多本文的前置知识文章,以及新的有价值的文章,让我们一起成为架构师!
- 目前已经完成了并发编程、MySQL、spring源码、Mybatis的源码。可以在公众号下方菜单点击查看之前的文章!
- 接下来的目标是深入分析JVM、tomcat、redis
- 这个公众号,无广告!!!每日更新!!!