浅谈Tomcat调优

Tomcat是开发中必不可少的web应用服务器,很多时候我们下载下来直接用,比较少关注他的配置,但默认配置性能并不是最优的,我们可以通过优化tomcat以此来提高web项目的性能。

想提高Tomcat web应该服务器的性能可以分为两个方向,服务器资源和优化配置。

一、服务器资源

服务器所能提供CPU、内存、硬盘的性能对处理能力有决定性影响,所以说服务器性能牛B,Tomcat也不会太差。当然提高服务器的硬件配置,是需要大量RMB的支持。所以不到万不得已不会采用这种方式,一般公司会采取下面这种通过优化配置,来提升Tomcat性能的方式。

二、优化配置

1、模式选择

    bio:
    默认的模式,性能非常低下,没有经过任何优化处理和支持.

    nio:
    nio(NEW I/O),是Java SE 1.4及后续版本提供的一种新的I/O操作方式(即Java.nio包及其子包)。
    java nio是一个基于缓冲区、并能提供非阻塞I/O操作的Java API,因此nio也被看成是non-blocking I/O的缩写。

    它拥有比传统I/O操作(bio)更好的并发运行性能。

    apr:
    安装起来最困难,但是从操作系统级别来解决异步的IO问题,大幅度的提高性能.

    启动NIO模式

    修改server.xml里的Connector节点,修改protocol为org.apache.coyote.http11.Http11NioProtocol

    默认配置如:

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

    修改配置如:

<Connector URIEncoding="utf-8" connectionTimeout="20000" port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol" redirectPort="8443"/>
2、tomcat连接(线程池)

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

   打开如下配置:

  <Service name="Catalina">

    <!--The connectors can use a shared executor, you can define one or more named thread pools-->
    
   <!-- <Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
        maxThreads="150" minSpareThreads="4"/> -->

在Connector中指定使用共享线程池

  <Service name="Catalina">

    <!--The connectors can use a shared executor, you can define one or more named thread pools-->
    
   <Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
        maxThreads="1000" minSpareThreads="100"/> 
    

    <!-- A "Connector" represents an endpoint by which requests are received
         and responses are returned. Documentation at :
         Java HTTP Connector: /docs/config/http.html (blocking & non-blocking)
         Java AJP  Connector: /docs/config/ajp.html
         APR (HTTP/AJP) Connector: /docs/apr.html
         Define a non-SSL HTTP/1.1 Connector on port 8080
    -->
    <!--<Connector URIEncoding="utf-8" connectionTimeout="20000" port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol" redirectPort="8443"/>-->
    <!-- A "Connector" using the shared thread pool-->
    
        <Connector executor="tomcatThreadPool"
               port="8080"
              protocol="org.apache.coyote.http11.Http11NioProtocol"
              maxHttpHeaderSize="8192"
              maxHttpHeaderSize="8192"
              minSpareThreads="100"
              maxSpareThreads="1000"
              minProcessors="100"
              maxProcessors="1000"
              enableLookups="false"
              URIEncoding="utf-8"
              acceptCount="1000"
              redirectPort="8443"
              disableUploadTimeout="true"/>

Executor重要参数说明:

name:共享线程池的名字。这是Connector为了共享线程池要引用的名字,该名字必须唯一。默认值:NONE;

namePrefix:在JVM上,每个运行线程都可以有一个name字符串。这一属性为线程池中每个线程的name字符串设置了一个前缀,Tomcat将把线程号追加到这一前缀的后面。默认值:tomcat-exec-;

maxThreads:该线程池可以容纳的最大线程数。默认值:200;

maxIdleTime:在Tomcat关闭一个空闲线程之前,允许空闲线程持续的时间(以毫秒为单位)。只有当前活跃的线程数大于minSpareThread的值,才会关闭空闲线程。默认值:60000(一分钟)。

maxSpareThreads Tomcat连接器的最大空闲 SOCKET 线程数

minSpareThreads:Tomcat应该始终打开的最小不活跃线程数。默认值:25。

threadPriority:线程的等级。默认是Thread.NORM_PRIORITY

Connector重要参数说明:

executor:表示使用该参数值对应的线程池;

minProcessors:服务器启动时创建的处理请求的线程数;

maxProcessors:最大可以创建的处理请求的线程数;

acceptCount:指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理。

enableLookups 若设为TRUE, 则支持域名解析,可把 ip 地址解析为主机名

redirectPort 在需要基于安全通道的场合,把客户请求转发到基于SSL 的 redirectPort 端口

connectionTimeout 连接超时

URIEncoding URL统一编码

3、tomcat缓存优化
    <Connector  executor="tomcatThreadPool"
                port="8080"
               protocol="org.apache.coyote.http11.Http11NioProtocol"
               maxHttpHeaderSize="8192"
              maxThreads="1000"
              minSpareThreads="100"
              maxSpareThreads="1000"
              minProcessors="100"
              maxProcessors="1000"
              enableLookups="false"
              compression="on"
              compressionMinSize="2048"
              compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"
              connectionTimeout="20000"
              URIEncoding="utf-8"
              acceptCount="1000"
              redirectPort="8443"
              disableUploadTimeout="true"/>

    compression :打开压缩功能

 compressionMinSize :启用压缩的输出内容大小,这里面默认为2KB

 compressableMimeType :压缩类型

 connectionTimeout :定义建立客户连接超时的时间. 如果为 -1, 表示不限制建立客户连接的时间


4、禁用AJP连接器

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


我们一般是使用Nginx+tomcat的架构,所以用不着AJP协议,所以把AJP连接器禁用

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

完成上面几步对Tomcat的优化配置,你的Tomcat web应用服务器肯定会有大幅度的提升。这只是简单的配置,后续还会有针对JVM的专项介绍。JVM参数也是影响Tomcat性能的一个重要因素。


### Tomcat 性能优化配置参数 #### JVM 参数 Tomcat 的运行依赖于 Java 虚拟机 (JVM),因此针对 JVM 进行适当设置能够显著改善其性能。这包括但不限于整堆内存大小、永久代/元空间以及选择合适的垃圾收集器。 - **堆内存**:合理设定初始 (`-Xms`) 和最大 (`-Xmx`) 堆尺寸有助于防止频繁的 Full GC 发生,通常建议将两者设为相同值以避免扩展收缩带来的开销[^2]。 - **年轻代比例**:通过 `-XX:NewRatio` 或者直接指定新生代大小(如 `-Xmn`),可以影响对象分配策略并间接控制老年代的增长速率,进而影响GC频率和暂停时间。 - **垃圾回收算法**:依据应用特点选用适合的应用场景下的垃圾回收机制,例如 G1 收集器适用于大多数现代Web应用程序;CMS(Concurrent Mark Sweep) 对低延迟敏感型服务可能更合适;而 Parallel Scavenge 则专注于吞吐量最大化。 ```bash JAVA_OPTS="$JAVA_OPTS -server \ -Xms2048m -Xmx2048m \ -XX:+UseG1GC" ``` #### AJP 协议与静态资源处理 当采用 Apache HTTP Server 结合 mod_jk 模块作为前端代理时,AJP 协议会用于转发动态请求给后端 Tomcat 实例执行业务逻辑计算。然而,在某些情况下如果不需要此功能或者已经部署了其他方式实现动静分离,则应考虑关闭不必要的连接监听以免造成额外负担[^3]。 编辑 `conf/server.xml` 文件找到如下部分: ```xml <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> ``` 将其注释掉即可停止对外提供 AJP 接口支持。 #### 处理器亲和性设置 利用 Linux 下的任务度工具 `taskset` 可以为特定进程指派固定的工作线程池所在的物理核心列表,以此达到降低跨核通信成本的目的,并且提高了局部数据访问效率[^4]。 命令格式如下所示: ```bash sudo taskset -pc 0,1 $TOMCAT_PID ``` 这里 `$TOMCAT_PID` 是正在运行中的 tomcat java 进程 ID。 #### 操作系统层面优化措施 除了上述提到的技术手段外,还可以从操作系统角度出发进一步挖掘潜力,比如节文件句柄数量上限、TCP/IP 网络栈参数微等操作均能在一定程度上缓解高负载情况下的压力反应[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

十点摆码

有用你就打赏一下

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值