Tomcat优化篇

news2025/6/6 7:00:15

目录

一、Tomcat自身配置

1.Tomcat管理页面

2. 禁用AJP服务

3.Executor优化

4.三种运行模式

5.web.xml

6.Host标签

7.Context标签

8.启动速度优化

9.其他方面

二、JMeter测试

笔者推荐


一、Tomcat自身配置

1.Tomcat管理页面

  我们可以打开Tomcat的管理页面,这块需要先配置下,在 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" />

如果访问提示出现了403的错误,则修改webapps/manager/META-INF/context.xml中的内容

image.png

访问Tomcat服务

image.png

然后输入配置的账号密码

image.png

可以看到对应的监控信息

image.png

2. 禁用AJP服务

  AJP是定向包协议。因为性能原因,使用二进制格式来传输可读性文本。WEB服务器通过TCP连接和SERVLET容器连接。为了减少进程生成socket的花费, WEB服务器和SERVLET容器之间尝试保持持久性的TCP连接,对多个请求/回复循环重用一个连接。一旦连接分配给一个特定的请求,在请求处理循环结束之前不会再分配。 换句话说,在连接上,请求不是多元的。这个使连接两端的编码变得容易,虽然这导致在一时刻会有很多连接。

image.png

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

3.Executor优化

  在Tomcat中每一个用户请求都是一个线程,针对线程池我们也可以提供对应的优化来提升性能。

    <!-- 自定义线程池 -->
    <Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
        maxThreads="150" minSpareThreads="4"/>
  


    <!-- 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 executor="tomcatThreadPool" port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />

涉及到的几个参数

参数说明
maxThreads最大的并发数,不同版本默认值有差别(150~200),一般建议500-1000
minSpareThreads初始化的线程数
maxQueueSize最大等待的队列数,超过就拒绝了

4.三种运行模式

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

nio:new I/O,同步非阻塞的I/O操作,比传统的bio有更好的并发运行性能。

apr:需要安装 apr 、 apr-utils 、tomcat-native包,比较麻烦。是Apache HTTP服务器的支持库。你可以简单地理解为,Tomcat将以JNI的形式调用Apache HTTP服务器的核心动态链接库来处理文件读取或网络传输操作,从而大大地提高Tomcat对静态文件的处理性能。 Tomcat apr也是在Tomcat上运行高并发应用的首选模式。

    @Deprecated
    public void setProtocol(String protocol) {

        boolean aprConnector = AprLifecycleListener.isAprAvailable() &&
                AprLifecycleListener.getUseAprConnector();

        if ("HTTP/1.1".equals(protocol) || protocol == null) {
            if (aprConnector) {
                setProtocolHandlerClassName("org.apache.coyote.http11.Http11AprProtocol");
            } else {
                setProtocolHandlerClassName("org.apache.coyote.http11.Http11NioProtocol");
            }
        } else if ("AJP/1.3".equals(protocol)) {
            if (aprConnector) {
                setProtocolHandlerClassName("org.apache.coyote.ajp.AjpAprProtocol");
            } else {
                setProtocolHandlerClassName("org.apache.coyote.ajp.AjpNioProtocol");
            }
        } else {
            setProtocolHandlerClassName(protocol);
        }
    }

调整对应的配置

image.png

5.web.xml

最终观察tomcat启动日志[时间/内容],线程开销,内存大小,GC等

DefaultServlet

    <servlet>
        <servlet-name>default</servlet-name>
        <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
        <init-param>
            <param-name>debug</param-name>
            <param-value>0</param-value>
        </init-param>
        <init-param>
            <param-name>listings</param-name>
            <param-value>false</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

JspServlet

    <servlet>
        <servlet-name>jsp</servlet-name>
        <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
        <init-param>
            <param-name>fork</param-name>
            <param-value>false</param-value>
        </init-param>
        <init-param>
            <param-name>xpoweredBy</param-name>
            <param-value>false</param-value>
        </init-param>
        <load-on-startup>3</load-on-startup>
    </servlet>

welcome-list-file

    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
        <welcome-file>index.htm</welcome-file>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>

mime-mapping移除响应的内容

    <mime-mapping>
        <extension>zip</extension>
        <mime-type>application/zip</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>zir</extension>
        <mime-type>application/vnd.zul</mime-type>
    </mime-mapping>

session-config 默认jsp页面有session,就是在于这个配置


    <session-config>
        <session-timeout>30</session-timeout>
    </session-config>

6.Host标签

autoDeploy :Tomcat运行时,要用一个线程拿出来进行检查,生产环境之下一定要改成false

unpackWARs:war包自动解压缩,同样的生产环境改为false

7.Context标签

reloadable:false

reloadable:如果这个属性设为true,tomcat服务器在运行状态下会监视在WEB-INF/classes和WEB-INF/lib目录下 class文件的改动,如果监测到有class文件被更新的,服务器会自动重新加载Web应用。 在开发阶段将reloadable属性设为true,有助于调试servlet和其它的class文件,但这样用加重服务器运行负荷,建议 在Web应用的发存阶段将reloadable设为false。

8.启动速度优化

  1. 删除没用的web应用:因为tomcat启动每次都会部署这些应用
  2. 关闭WebSocket:websocket-api.jar和tomcat-websocket.jar
  3. 随机数优化:设置JVM参数:-Djava.security.egd=file:/dev/./urandom
  4. 多个线程启动Web应用: host:startStopThreads

9.其他方面

  • Connector:配置压缩属性compression="500",文件大于500bytes才会压缩
  • 数据库优化:减少对数据库访问等待的时间,可以从数据库的层面进行优化,或者加缓存等等各种方案。
  • 开启浏览器缓存,nginx静态资源部署

二、JMeter测试

  针对相关数据的测试我们可以通过JMeter来直观的给大家来展示。我们在tomcat8.0的服务中部署一个war服务。

image.png

我们找一个FlowableUI的war包,正常启动:可以正常访问

image.png

然后我们通过JMeter来压测:

image.png

设置请求相关信息

image.png

选择几个监听器

然后执行:吞吐量:4103

image.png

然后我们禁用掉AJP

image.png

再测试:4149 稍微有点提升

image.png

然后我们自定义线程池

    <!-- 自定义线程池 -->
    <Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
        maxThreads="500" minSpareThreads="50" prestartminSpareThreads="true"/>

记得关联上

image.png

吞吐量:4188

image.png

我们把线程池的相关数据调整下:最大线程数1000,最小线程数100再看看

image.png

没有太大的区别,这时我们可以设置最大的等待队列:maxQueueSize="100"

image.png

我们可以发现当添加了最大阻塞队列后吞吐量提升到了5203了,提升效果显著,但是同样的异常率提升了很多32.6%,当然这也是正常的现象了。

最后我们修改下运行的模式。改为NIO2,同时不加最大等待队列来看看

    <!-- 自定义线程池 -->
    <Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
        maxThreads="500" minSpareThreads="50" prestartminSpareThreads="true" />
 
   <Connector executor="tomcatThreadPool" port="8080" protocol="org.apache.coyote.http11.Http11Nio2Protocol"
               connectionTimeout="20000"
               redirectPort="8443" />

image.png

正常情况下(150个线程 4个初始化)

image.png

300个线程 30个初始化

image.png

maxQueueSize=100

image.png

通过NIO2的方式来处理

image.png

笔者推荐

Tomcat源码高级篇

结合案例深入理解DDD聚合与聚合根


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2399096.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Temporal Fusion Transformer(TFT)扩散模型时间序列预测模型

1. TFT 简介 Temporal Fusion Transformer&#xff08;TFT&#xff09;模型是一种专为时间序列预测设计的高级深度学习模型。它结合了神经网络的多种机制处理时间序列数据中的复杂关系。TFT 由 Lim et al. 于 2019年提出&#xff0c;旨在处理时间序列中的不确定性和多尺度的依…

【LangServe部署流程】5 分钟部署你的 AI 服务

目录 一、LangServe简介 二、环境准备 1. 安装必要依赖 2. 编写一个 LangChain 可运行链&#xff08;Runnable&#xff09; 3. 启动 LangServe 服务 4. 启动服务 5. 使用 API 进行调用 三、可选&#xff1a;访问交互式 Swagger 文档 四、基于 LangServe 的 RAG 应用部…

攻防世界-unseping

进入环境 在获得的场景中发现PHP代码并进行分析 编写PHP编码 得到 Tzo0OiJlYXNlIjoyOntzOjEyOiIAZWFzZQBtZXRob2QiO3M6NDoicGluZyI7czoxMDoiAGVhc2UAYXJncyI7YToxOntpOjA7czozOiJwd2QiO319 将其传入 想执行ls&#xff0c;但是发现被过滤掉了 使用环境变量进行绕过 $a new…

[yolov11改进系列]基于yolov11使用FasterNet替换backbone用于轻量化网络的python源码+训练源码

【FasterNet介绍】 为了设计快速神经网络&#xff0c;许多工作都集中在减少浮点运算的数量&#xff08;FLOPs&#xff09;上。 然而&#xff0c;我们观察到FLOPs的减少并不一定会导致延迟的类似程度的减少。 这主要源于低效率的每秒浮点运算(FLOPS)。 为了实现更快的网络&#…

一周学会Pandas2之Python数据处理与分析-Pandas2数据绘图与可视化

锋哥原创的Pandas2 Python数据处理与分析 视频教程&#xff1a; 2025版 Pandas2 Python数据处理与分析 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili Pandas 集成了 Matplotlib&#xff0c;提供了简单高效的绘图接口&#xff0c;使数据可视化变得直观便捷。本指南将详…

企业级安全实践:SSL/TLS 加密与权限管理(一)

引言 ** 在数字化转型的浪潮中&#xff0c;企业对网络的依赖程度与日俱增&#xff0c;从日常办公到核心业务的开展&#xff0c;都离不开网络的支持。与此同时&#xff0c;网络安全问题也日益严峻&#xff0c;成为企业发展过程中不可忽视的重要挑战。 一旦企业遭遇网络安全事…

2025——》VSCode Windows 最新安装指南/VSCode安装完成后如何验证是否成功?2025最新VSCode安装配置全攻略

1.VSCode Windows 最新安装指南: 以下是 2025 年 Windows 系统下安装 Visual Studio Code(VSCode)的最新指南,结合官方文档与实际操作经验整理而成: 一、下载官方安装包: 1.访问官网: 打开浏览器,进入 VSCode 官方下载页面https://code.visualstudio.com/Download 2…

【MATLAB代码】制导——三点法,二维平面下的例程|运动目标制导,附完整源代码

三点法制导是一种导弹制导策略,主要用于确保导弹能够准确追踪并击中移动目标。该方法通过计算导弹、目标和制导站之间的相对位置关系,实现对目标的有效制导。 本文给出MATLAB下的三点法例程,模拟平面上捕获运动目标的情况订阅专栏后可直接查看源代码,粘贴到MATLAB空脚本中即…

如何爬取google应用商店的应用分类呢?

以下是爬取Google Play商店应用包名(package name)和对应分类的完整解决方案&#xff0c;采用ScrapyPlaywright组合应对动态渲染页面&#xff0c;并处理反爬机制&#xff1a; 完整爬虫实现 1. 安装必要库 # 卸载现有安装pip uninstall playwright scrapy-playwright -y# 重新…

SQL Relational Algebra(数据库关系代数)

目录 What is an “Algebra” What is Relational Algebra? Core Relational Algebra Selection Projection Extended Projection Product&#xff08;笛卡尔积&#xff09; Theta-Join Natural Join Renaming Building Complex Expressions Sequences of Assignm…

智能工业时代:工业场景下的 AI 大模型体系架构与应用探索

自工业革命以来&#xff0c;工业生产先后经历了机械化、电气化、自动化、信息化的演进&#xff0c;正从数字化向智能化迈进&#xff0c;人工智能技术是新一轮科技革命和产业变革的重要驱动力量&#xff0c;AI 大模型以其强大的学习计算能力掀开了人工智能通用化的序幕&#xff…

易语言使用OCR

易语言使用OCR 用易语言写个脚本&#xff0c;需要用到OCR&#xff0c;因此我自己封装了一个OCR到DLL。 http://lkinfer.1it.top/ 视频演示&#xff1a;https://www.bilibili.com/video/BV1Zg7az2Eq3/ 支持易语言、c、c#使用&#xff0c;平台限制&#xff1a;window 10 介绍…

C++和C#界面开发方式的全面对比

文章目录 C界面开发方式1. **MFC&#xff08;Microsoft Foundation Classes&#xff09;**2. **Qt**3. **WTL&#xff08;Windows Template Library&#xff09;**4. **wxWidgets**5. **DirectUI** C#界面开发方式1. **WPF&#xff08;Windows Presentation Foundation&#xf…

算法-集合的使用

1、set常用操作 set<int> q; //以int型为例 默认按键值升序 set<int,greater<int>> p; //降序排列 int x; q.insert(x); //将x插入q中 q.erase(x); //删除q中的x元素,返回0或1,0表示set中不存在x q.clear(); //清空q q.empty(); //判断q是否为空&a…

性能优化 - 理论篇:CPU、内存、I/O诊断手段

文章目录 Pre引言1. CPU 性能瓶颈1.1 top 命令 —— 多维度 CPU 使用率指标1.2 负载&#xff08;load&#xff09;——任务排队情况1.3 vmstat 命令 —— CPU 繁忙与等待 2. 内存性能瓶颈2.1 操作系统层面的内存分布2.2 top 命令 —— VIRT / RES / SHR 三个关键列2.3 CPU 缓存…

算法:二分查找

1.二分查找 704. 二分查找 - 力扣&#xff08;LeetCode&#xff09; 二分查找算法要确定“二段性”&#xff0c;时间复杂度为O(lonN)。为了防止数据溢出&#xff0c;所以求mid时要用防溢出的方式。 class Solution { public:int search(vector<int>& nums, int tar…

Ubuntu 22.04 上安装 PostgreSQL(使用官方 APT 源)

Ubuntu 22.04 上安装 PostgreSQL&#xff08;使用官方 APT 源&#xff09; 步骤 1&#xff1a;更新系统 sudo apt update sudo apt upgrade -y步骤 2&#xff1a;添加 PostgreSQL 官方仓库 # 安装仓库管理工具 sudo apt install wget ca-certificates gnupg lsb-release -y#…

Linux随记(十八)

一、k8s的node节点磁盘 /data已使用率超过 85% , 出现disk pressure &#xff0c;驱逐pod现象 evicted &#xff0c; the node had condition:[DiskPressure] #修改/var/lib/kubelet/config.yaml ]# cat /var/lib/kubelet/config.yaml apiVersion: kubelet.config.k8s.io/v1…

Windows MongoDB C++驱动安装

MongoDB驱动下载 MongoDB 官网MongoDB C驱动程序入门MongoDB C驱动程序入门 安装环境 安装CMAKE安装Visual Studio 编译MongoDB C驱动 C驱动依赖C驱动&#xff0c;需要先编译C驱动 下载MongoDB C驱动源码 打开CMAKE(cmake-gui) 选择源码及输出路径,然后点击configure …

MS1023/MS1224——10MHz 到 80MHz、10:1 LVDS 并串转换器(串化器)/串并转换器(解串器)

产品简述 MS1023 串化器和 MS1224 解串器是一对 10bit 并串 / 串并转 换芯片&#xff0c;用于在 LVDS 差分底板上传输和接收 10MHz 至 80MHz 的并行字速率的串行数据。起始 / 停止位加载后&#xff0c;转换为负载编 码输出&#xff0c;串行数据速率介于 120Mbps…