【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"

连接数据.png

常用的调优参数(线程池的调优)

  • 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
  • 这个公众号,无广告!!!每日更新!!!
    作者公众号.jpg
posted @ 2022-03-28 21:56  程序java圈  阅读(118)  评论(0编辑  收藏  举报