「Tomcat优化篇」如何让你的Tomcat性能更加优越 一遍就懂
csdh11 2025-05-30 13:47 5 浏览
Tomcat优化篇
一、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中的内容
访问Tomcat服务
然后输入配置的账号密码
可以看到对应的监控信息
2. 禁用AJP服务
AJP是定向包协议。因为性能原因,使用二进制格式来传输可读性文本。WEB服务器通过TCP连接和SERVLET容器连接。为了减少进程生成socket的花费,
WEB服务器和SERVLET容器之间尝试保持持久性的TCP连接,对多个请求/回复循环重用一个连接。一旦连接分配给一个特定的请求,在请求处理循环结束之前不会再分配。
换句话说,在连接上,请求不是多元的。这个使连接两端的编码变得容易,虽然这导致在一时刻会有很多连接。
我们一般使用的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);
}
}
调整对应的配置
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.启动速度优化
- 删除没用的web应用:因为tomcat启动每次都会部署这些应用
- 关闭WebSocket:websocket-api.jar和tomcat-websocket.jar
- 随机数优化:设置JVM参数:-Djava.security.egd=file:/dev/./urandom
- 多个线程启动Web应用: host:startStopThreads
9.其他方面
- Connector:配置压缩属性compression=“500”,文件大于500bytes才会压缩
- 数据库优化:减少对数据库访问等待的时间,可以从数据库的层面进行优化,或者加缓存等等各种方案。
- 开启浏览器缓存,nginx静态资源部署
二、JMeter测试
针对相关数据的测试我们可以通过JMeter来直观的给大家来展示。我们在tomcat8.0的服务中部署一个war服务。
我们找一个FlowableUI的war包,正常启动:可以正常访问
然后我们通过JMeter来压测:
设置请求相关信息
选择几个监听器
然后执行:吞吐量:4103
然后我们禁用掉AJP
再测试:4149 稍微有点提升
然后我们自定义线程池
<!-- 自定义线程池 -->
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
maxThreads="500" minSpareThreads="50" prestartminSpareThreads="true"/>
记得关联上
吞吐量:4188
我们把线程池的相关数据调整下:最大线程数1000,最小线程数100再看看
没有太大的区别,这时我们可以设置最大的等待队列:maxQueueSize=“100”
我们可以发现当添加了最大阻塞队列后吞吐量提升到了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" />
- 上一篇:深入理解JSP
- 下一篇:SpringBoot项目jar、war包启动解析
相关推荐
- IntelliJ IDEA 部署 Web 项目,终于搞懂了
-
IDEA中最重要的各种设置项,就是这个ProjectStructre了,关乎你的项目运行,缺胳膊少腿都不行。最近公司正好也是用之前自己比较熟悉的IDEA而不是Eclipse,为了更深入理解和使...
- [应用篇]第四篇 JSTL之C标签介绍.md
-
粗体为必须掌握部分表达式控制标签:out、set、remove、catch流程控制标签:if、choose、when、otherwise...
- HikariCP为啥这么火?SpringBoot选它的原因?
-
简介HikariCP是用于创建和管理连接,利用“池”的方式复用连接减少资源开销,和其他数据源一样,也具有连接数控制、连接可靠性测试、连接泄露控制、缓存语句等功能,另外,和druid一样,Hika...
- Jeecg-P3 1.0版本发布,JAVA插件开发框架
-
Jeecg-P31.0版本发布,插件开发框架特点:业务组件以JAR方式提供,插件模式、松耦合、可插拔、支持独立部署,也可以无缝集成Jeecg平台中。【架构说明】1.Jeecg-P3采用Sprin...
- 来来来!一文告诉你Eclipse的正确安装使用姿势,你都清楚吗?
-
前言本学习笔记是有关如何设置Eclipse的详细说明。即使你天天在使用它,但是,相信我,或许你并不足够了解它。安装Java运行时环境Eclipse是Java应用程序,因此设置Eclipse的第一步是安...
- SpringBoot项目jar、war包启动解析
-
一、jar包和war包的区别1.1war包war包是JavaWeb应用程序的一种打包方式符合Servlet标准,它是WebArchive的缩写,主要用于存储Web应用程序相关的文件,包括Java...
- 「Tomcat优化篇」如何让你的Tomcat性能更加优越 一遍就懂
-
Tomcat优化篇一、Tomcat自身配置1.Tomcat管理页面...
- 深入理解JSP
-
第一章JSP1、概述1.1JSP引入在前面的登录案例中,登录失败后为了能够响应登录的错误信息。我特意创建了一个LoginErrorServlet用来动态地拼接错误信息。...
- Struts2.3.32升级到2.5.26详细步骤(无敌版)
-
Struts2真是三天两头爆出漏洞来,特别是一爆出漏洞就建议升级到最新版,也是无语的,并且最新版相比老板还相差挺大的,这部这次需要从Struts2.3.32一下子就必须升级到最新版,这可让人头大,谷歌...
- java中的jar包,war包详解
-
做java开发的,对jar包和war包肯定接触的不少。我们有必要对他们做一个深入的了解。现在我们整理一下。jar包的介绍JAR(JavaArchive)是与平台无关的文件格式,它允许将许多文件组合成...
- Java文件上传与下载
-
1文件上传1.1文件上传入门1.1.1实现文件上传条件1)表单的提交方式必须是...
- 还在用JSP中的脚本程序吗?去掉吧,我教你快速掌握EL及JSTL
-
jsp页面可以使用脚本程序(java代码)来实现页面逻辑,但是维护比较困难。可以使用EL来访问和处理应用程序的数据。JSTL来替换页面显示逻辑的java代码。非常简单!保证你会用后就不会再用jsp脚本...
- Servlet 容器
-
Servlet容器主要是JavaWeb应用提供运行时环境,所以也可以称之为JavaWeb应用容器,或者Servlet/JSP容器。Servlet容器主要负责管理Servlet、JSP的生命周期以及它们...
- Java-Maven详解
-
一、什么是Maven?ApacheMaven是一个软件...
- 阿里面试题:Tomcat为什么要自定义类加载器?价值20K的面试题!
-
你是否曾好奇,为何Tomcat作为JavaWeb服务器的佼佼者,偏偏不走寻常路,要自定义一套类加载器机制?这背后,不仅隐藏着解决Java类加载复杂性的智慧,更蕴含着提升应用隔离性、安全性与灵活性的深...
- 一周热门
- 最近发表
- 标签列表
-
- mydisktest_v298 (34)
- document.appendchild (35)
- 头像打包下载 (61)
- acmecadconverter_8.52绿色版 (39)
- word文档批量处理大师破解版 (36)
- server2016安装密钥 (33)
- mysql 昨天的日期 (37)
- parsevideo (33)
- 个人网站源码 (37)
- centos7.4下载 (33)
- mysql 查询今天的数据 (34)
- intouch2014r2sp1永久授权 (36)
- 先锋影音源资2019 (35)
- jdk1.8.0_191下载 (33)
- axure9注册码 (33)
- pts/1 (33)
- spire.pdf 破解版 (35)
- shiro jwt (35)
- sklearn中文手册pdf (35)
- itextsharp使用手册 (33)
- 凯立德2012夏季版懒人包 (34)
- 冒险岛代码查询器 (34)
- 128*128png图片 (34)
- jdk1.8.0_131下载 (34)
- dos 删除目录下所有子目录及文件 (36)