Tomcat性能优化总结

Easter79
• 阅读 312

层级优化!(JAVA_OPTS参数和主要元素的优化)

Tomcat大致元素架构:server--->service-->Engine-->Host-->Context

Tomcat有可以使用三种协议:HTTP,AJP,HTTPS

tomcat默认采用的BIO模型

tomcat的运行模式有3种:bio,nio,apr(额外安装),例如:

protocol="org.apache.coyote.http11.Http11Nio2Protocol"

Tomcat各个元素里面都有listener监听器,由Service层的连接器connector通过线程池(Thread Pool)调用执行器(Executor),Connector的作用是接收连接请求,创建Request和Response对象用于和请求端交换数据;然后分配线程携带该request和response交给绑定的Engine来处理,最后把处理后的Request和Response返回给客户端。

tomcat在启动时,会将web项目中WEB-INF/web.xml和自己的conf/web.xml进行合并,然后在ContextConfig类下的configureContext()统一解析这些内容

所以,不必要的配置要删除,以减少Tomcat解析成本。

像在conf/web.xml的DefaultServlet或JspServlet,jspmap,mime,欢迎页面按需来配置。

在conf/server.xml的Listener监听器中,VersionLoggerListener作用是显示版本和JDK环境,可以删除;AprLifecycleListener作用:加载APR库使用,这个配置仅当connector的protocol设置为AJP/1.3时有用,如果非AJP/1.3,可以删除。

GlobalResourcesLifecycleListener作用于全局资源

GlobalNamingResources可以定义全局资源,可以看出,这个tomcat的默认配置是通过读取$TOMCAT_HOME/ conf/tomcat-users.xml实现的。tomcat-user.xml用于定义tomcat管理页面相关配置,如果不登录管理界面可以删掉。

当tomcat需要集成到Apache服务器时才使用这个

Server元素的port监听关闭服务的请求

Connector

port:指定服务器端要创建的端口号,并在这个断口监听来自客户端的请求

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

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

enableLookups:如果为true,则可以通过调用request.getRemoteHost()进行DNS查询来得到远程客户端的实际主机名,若为false则不进行DNS查询,而是返回其ip地址

redirectPort:指定服务器正在处理http请求时收到了一个SSL传输请求后重定向的端口号

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

maxConnections:达到这个值之后,将继续接受连接,但是不处理,能继续接受多少根据acceptCount的值

minSpareThreads:最小空闲线程数

connectionTimeout:指定超时的时间数(以毫秒为单位)

tomcat默认连接池有限制,可以为connector配置自己的连接池,例如:

<Connector executor="tomcatThreadPool"port="8080" protocol="HTTP/1.1"

jvm参数优化

tomcat是用Java写的,就要运行在jvm上,垃圾处理方式等都要遵循jvm的方式。tomcat中设置jvm参数在 catalina.sh(Linux)和catalina.bat(windows)中,以JAVA_OPTS变量存储。

各参数详解:

-Xms:设置JVM初始内存大小(默认是物理内存的1/64)

-Xmx:设置JVM可以使用的最大内存(默认是物理内存的1/4,建议:物理内存80%)

-Xmn:设置JVM最小内存(128-256m就够了,一般不设置)

-XX:PermSize :为JVM启动时Perm的内存大小

-XX:MaxPermSize :为最大可占用的Perm内存大小(默认为32M)

-XX:MaxNewSize,默认为16M

-XX:NewSize :默认为2M,此值设大可调大新对象区,减少Full
GC次数

-XX:NewRatio :改变新旧空间的比例,意思是新空间的尺寸是旧空间的1/8(默认为8)

-XX:SurvivorRatio :改变Eden对象空间和残存空间的尺寸比例,意思是Eden对象空

间的尺寸比残存空间大survivorRatio+2倍(缺省值是10)

-XX:userParNewGC 可用来设置并行收集【多CPU】

-XX:ParallelGCThreads 可用来增加并行度【多CPU】

-XXUseParallelGC 设置后可以使用并行清除收集器【多CPU】

1. conf/server.xml中Executor对应的相关参数

<Executor 
name="tomcatThreadPool" --线程池名
namePrefix="catalina-exec-" --线程名称前缀 namePrefix+threaNumber
maxThreads="1000" --池中最大线程数
minSpareThreads="100" --活跃线程数 会一直存在
maxIdleTime="60000" --线程空闲时间,超过该时间,线程会被销毁 ms
maxQueueSize="Integer.MAX_VALUE" --被执行前线程的排队数目
prestartminSpareThreads="false" --启动线程池时,是否启用minSpareThreads部分线程
threadPriority="5" --线程池中线程优先级 1~10
className="org.apache.catalina.core.StandardThreadExecutor" --线程实现类 自定义线程需时间 org.apache.catalina.Executor类
/>

<Connector 
executor="tomcatThreadPool" --线程池名
port="8080" 
protocol="org.apache.coyote.http11.Http11AprProtocol"
connectionTimeout="20000"
redirectPort="8443" />

2.conf/server.xml中Connector对应的相关参数

<Connector 
port="8080" 
protocol="org.apache.coyote.http11.Http11AprProtocol" --协议类型 
disableUploadTimeout="true"
keepAliveTimeout="20000"
connectionTimeout="20000" --已接受,但未被处理的请求的等待超时时间 ms
redirectPort="8443" --安全通信的转发端口 
URIEncoding="UTF-8"--URL编码字符集
minSpareThreads="100" --默认初始化和保持空闲的线程数
enableLookups="false"--关闭DNS反向查询
useURIValidationHack="false" --关闭不必要的检查
maxThreads="1000" --处理请求线程的最大数目 未配置为200 此属性会被忽略
acceptCount="1000" --所用可能的线程都在使用时传入连接请求的最大长度
disableUploadTimeout="true" --设置允许更长的超时连接
maxConnections="1000"--接受和处理的最大连接数(nio/nio2 1000,apr 8192)
maxHttpHeaderSize="8192"--请求和响应http头的最大大小 8k
tcpNoDelay="true" --tcp不延迟
compression="on"--是否启用压缩 on off force 
compressionMinSize="2048" --压缩前数据最小值 2k byte
noCompressionUserAgents="gozilla,traviata" --设置哪些浏览器不压缩
compressableMimeType="text/html,text/xml,text/css,application/javascript,text/plain" --设置压缩的文件类型
/>

3. 有关 JAVA_OPTS

set JAVA_OPTS=
-server 
-Xms1000M 
-Xmx1000M #-Xms与-Xmx设成一样的值,避免JVM因为频繁的GC导致性能大起大落
-Xss512k 
-XX:+AggressiveOpts 
-XX:+UseBiasedLocking 
-XX:+DisableExplicitGC 
-XX:MaxTenuringThreshold=15 
-XX:+UseConcMarkSweepGC 
-XX:+UseParNewGC 
-XX:+CMSParallelRemarkEnabled 
-XX:+UseCMSCompactAtFullCollection 
-XX:LargePageSizeInBytes=128m 
-XX:+UseFastAccessorMethods 
-XX:+UseCMSInitiatingOccupancyOnly

-Djava.awt.headless=true

4. 禁用8005端口

telnet localhost 8005 然后输入 SHUTDOWN 就可以关闭 Tomcat,为了安全我们要禁用该功能

默认值:

修改为: \---------------------
点赞
收藏
评论区
推荐文章
刚刚好 刚刚好
2个月前
css问题
1、 在IOS中图片不显示(给图片加了圆角或者img没有父级) <div<img src""/</div div {width: 20px; height: 20px; borderradius: 20px; overflow: h
blmius blmius
1年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录 问题 用navicat导入数据时,报错: 原因这是因为当前的MySQL不支持datetime为0的情况。 解决修改sql\mode: sql\mode:SQL Mode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。 全局s
晴空闲云 晴空闲云
2个月前
css中box-sizing解放盒子实际宽高计算
我们知道传统的盒子模型,如果增加内边距padding和边框border,那么会撑大整个盒子,造成盒子的宽度不好计算,在实务中特别不方便。boxsizing可以设置盒模型的方式,可以很好的设置固定宽高的盒模型。 盒子宽高计算假如我们设置如下盒子:宽度和高度均为200px,那么这会这个盒子实际的宽高就都是200px。但是当我们设置这个盒子的边框和内间距的时候,那
艾木酱 艾木酱
1个月前
快速入门|使用MemFire Cloud构建React Native应用程序
> MemFire Cloud是一款提供云数据库,用户可以创建云数据库,并对数据库进行管理,还可以对数据库进行备份操作。它还提供后端即服务,用户可以在1分钟内新建一个应用,使用自动生成的API和SDK,访问云数据库、对象存储、用户认证与授权等功能,可专
Stella981 Stella981
1年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置 1、virsh edit centos7 找到“memory”和“vcpu”标签,将 <name>centos7</name> <uuid>2220a6d1-a36a-4fbb-8523-e078b3dfe795</uuid>
Easter79 Easter79
1年前
Twitter的分布式自增ID算法snowflake (Java版)
概述 == 分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。 有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。 而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
1年前
MySQL查询按照指定规则排序
1.按照指定(单个)字段排序 select * from table_name order id desc; 2.按照指定(多个)字段排序 select * from table_name order id desc,status desc; 3.按照指定字段和规则排序 selec
Wesley13 Wesley13
1年前
PHP中的NOW()函数
是否有一个PHP函数以与MySQL函数`NOW()`相同的格式返回日期和时间? 我知道如何使用`date()`做到这一点,但是我问是否有一个仅用于此的函数。 例如,返回: 2009-12-01 00:00:00 * * * ### #1楼 使用此功能: function getDatetimeNow() {
Wesley13 Wesley13
1年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
#### 背景描述 # Time: 2019-01-24T00:08:14.705724+08:00 # User@Host: **[**] @ [**] Id: ** # Schema: sentrymeta Last_errno: 0 Killed: 0 # Query_time: 0.315758 Lock_
helloworld_34035044 helloworld_34035044
4个月前
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。 uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid() 或 uuid(sep)参数说明:sep 布尔值,生成的uuid中是否包含分隔符'',缺省为
helloworld_28799839 helloworld_28799839
2个月前
常用知识整理
# Javascript ## 判断对象是否为空 ```js Object.keys(myObject).length === 0 ``` ## 经常使用的三元运算 > 我们经常遇到处理表格列状态字段如 `status` 的时候可以用到 ``` vue