tomcat优化处理
tomcat8官方 文档 https://tomcat.apache.org/tomcat-8.0-doc/
https://www.cnblogs.com/redcreen/archive/2011/05/04/2037057.html
server.xml 添加如下配置
1.指定使用NIO模型来接受HTTP请求
protocol=“org.apache.coyote.http11.Http11NioProtocol” 指定使用NIO模型来接受HTTP请求。默认是BlockingIO,配置为protocol=“HTTP/1.1”
acceptorThreadCount=“2” 使用NIO模型时接收线程的数目
2.指定使用线程池来处理HTTP请求
首先要配置一个线程池来处理请求(与Connector是平级的,多个Connector可以使用同一个线程池来处理请求)
<Connector port=“8080”
executor=“tomcatThreadPool” 指定使用的线程池
3.指定BlockingIO模式下的处理线程数目
maxThreads=“150”//Tomcat使用线程来处理接收的每个请求。这个值表示Tomcat可创建的最大的线程数。默认值200。可以根据机器的时期性能和内存大小调整,一般可以在400-500。最大可以在800左右。
minSpareThreads=“25”—Tomcat初始化时创建的线程数。默认值4。如果当前没有空闲线程,且没有超过maxThreads,一次性创建的空闲线程数量。Tomcat初始化时创建的线程数量也由此值设置。
maxSpareThreads=“75”–一旦创建的线程超过这个值,Tomcat就会关闭不再需要的socket线程。默认值50。一旦创建的线程超过此数值,Tomcat会关闭不再需要的线程。线程数可以大致上用 “同时在线人数每秒用户操作次数系统平均操作时间” 来计算。
acceptCount=“100”----指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理。默认值10。如果当前可用线程数为0,则将请求放入处理队列中。这个值限定了请求队列的大小,超过这个数值的请求将不予处理。
connectionTimeout=“20000” --网络连接超时,默认值20000,单位:毫秒。设置为0表示永不超时,这样设置有隐患的。通常可设置为30000毫秒。
4.其它常用设置
maxHttpHeaderSize=“8192” http请求头信息的最大程度,超过此长度的部分不予处理。一般8K。
URIEncoding=“UTF-8” 指定Tomcat容器的URL编码格式。
disableUploadTimeout=“true” 上传时是否使用超时机制
enableLookups=“false”–是否反查域名,默认值为true。为了提高处理能力,应设置为false
compression=“on” 打开压缩功能
compressionMinSize=“10240” 启用压缩的输出内容大小,默认为2KB
noCompressionUserAgents=“gozilla, traviata” 对于以下的浏览器,不启用压缩
compressableMimeType=“text/html,text/xml,text/javascript,text/css,text/plain” 哪些资源类型需要压缩
enableLookups 不加载 dns
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
maxThreads="1000" minSpareThreads="100"
maxIdleTime="600000"
prestartminSpareThreads = "true"
maxQueueSize = "100"/>
<Connector port="80" protocol="org.apache.coyote.http11.Http11NioProtocol"
acceptorThreadCount="2"
connectionTimeout="20000"
redirectPort="8443"
acceptCount="1000"
disableUploadTimeout="true"
enableLookups="false"
maxHttpHeaderSize="8192" ## 语序 http header 请求的更大些
executor="tomcatThreadPool"
URIEncoding="utf-8"
compression="on"
compressionMinSize="10240"
noCompressionUserAgents="gozilla, traviata"
compressibleMimeType="text/html,text/xml,text/javascript,text/css,text/plain"/>
catalina.bat
你使用过tomcat的话,简单的说就是“内存溢出”. 通常情况下,这种问题出现在实际的生产环境中.产生这种问题的原因是tomcat使用较少的内存给进程,通过配置TOmcat的配置文件(Windows 下的catalina.bat或Linux下的catalina.sh)可以解决这种问题.这种解决方法是通过增加JVM的栈内存实现的.也就是说,JVM通常不去调用垃圾回收器,所以服务器可以更多关注处理web请求,并要求尽快完成。要更改文件(catalina.sh) 位于"\tomcat server folder\bin\catalina.sh",下面,给出这个文件的配置信息,
-Xms – 指定初始化时化的栈内存
-Xms – 指定初始化时化的栈内存
-Xmx – 指定最大栈内存
修改bin/catalina.bat文件设置参数,增加
下面的 一定要在一行 位置是
rem Guess CATALINA_HOME if not defined
set “CURRENT_DIR=%cd%” 的下面
set JAVA_OPTS= -server -Xms4096M -Xmx4096M -Xss512k
-XX:NewSize=2250M -XX:MaxNewSize=2250M
-XX:MetaspaceSize =512m
-XX:MaxMetaspaceSize=512m
-XX:CompressedClassSpaceSize=256m
-XX:+UseCompressedClassPointers
-noclassgc -verbose:class
-XX:+AggressiveOpts
-XX:+UseBiasedLocking
-XX:BiasedLockingStartupDelay=0
-XX:+DisableExplicitGC
-XX:+UseParNewGC
-XX:+UseConcMarkSweepGC
-XX:+CMSParallelRemarkEnabled
-XX:+UseCMSCompactAtFullCollection
-XX:LargePageSizeInBytes=128m
-XX:+UseFastAccessorMethods
-XX:+UseCMSInitiatingOccupancyOnly
-Duser.timezone=Asia/Shanghai
-Djava.awt.headless=true
解释:
-Xms:设置JVM初始内存大小(默认是物理内存的1/64)
-Xmx:设置JVM可以使用的最大内存(默认是物理内存的1/4,建议:物理内存80%)
-Xmn:设置JVM最小内存(128-256m就够了,一般不设置)
默认空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制;空余堆内存大于70%时,JVM会减少堆直到-Xms的最小限制。因此服务器一般设置-Xms、
-Xmx相等以避免在每次GC 后调整堆的大小。
在较大型的应用项目中,默认的内存是不够的,有可能导致系统无法运行。常见的问题是报Tomcat内存溢出错误“java.lang.OutOfMemoryError:Java heap space”,从而
导致客户端显示500错误。
-XX:MaxNewSize,默认为16M
其它参数:
-XX:NewSize :默认为2M,此值设大可调大新对象区,减少FullGC次数
-XX:NewRatio :改变新旧空间的比例,意思是新空间的尺寸是旧空间的1/8(默认为8)
-XX:SurvivorRatio :改变Eden对象空间和残存空间的尺寸比例,意思是Eden对象空间的尺寸比残存空间大survivorRatio+2倍(缺省值是10)
-XX:userParNewGC 可用来设置并行收集【多CPU】
-XX:ParallelGCThreads 可用来增加并行度【多CPU】
-XXUseParallelGC 设置后可以使用并行清除收集器【多CPU】
-XX:MetaspaceSize #是分配给类元数据空间(以字节计)的初始大小(Oracle逻辑存储上的初始高水位,the initial high-water-mark ),此值为估计值。MetaspaceSize的值设置的过大会延长垃圾回收时间。垃圾回收过后,引起下一次垃圾回收的类元数据空间的大小可能会变大。
-XX:MaxMetaspaceSize=512m #是分配给类元数据空间的最大值,超过此值就会触发Full GC,此值默认没有限制,但应取决于系统内存的大小。JVM会动态地改变此值。如果设置了启动参数 -XX:MaxMetaspaceSize=64m, 大约加载 70000 个 class 后 JVM 就会挂掉。
-XX:CompressedClassSpaceSize=256m #CompressedClassSpaceSize的调优只有当-XX:+UseCompressedClassPointers #开启了才有效-XX:CompressedClassSpaceSize=1G由于这个大小在启动的时候就固定了的,因此最好设置得大点。没有使用到的话不要进行设置JVM后续可能会让这个区可以动态的增长。不需要是连续的区域,只要从基地址可达就行;可能会将更多的类元信息放回到元空间中;未来会基于PredictedLoadedClassCount的值来自动的设置该空间的大小
-noclassgc -verbose:class #打印加载的 jar 包 测试用的
-XX:+AggressiveOpts #启用JVM开发团队最新的调优成果。例如编译优化,偏向锁,并行年老代收集等。
-XX:+UseBiasedLocking #启动默认五秒之后生效。可以立即生效:
-XX:BiasedLockingStartupDelay=0
注意:此锁是JVM内部锁,不是应用锁。所以如果优化会对整个应用产生影响,需要慎重。
在竞争激烈的场合没有太强的优化效果,反而有可能降低性能。
-XX:+DisableExplicitGC #,这个参数作用是禁止代码中显示调用GC
-XX:+UseParNewGC #设置年轻代为多线程收集。可与CMS收集同时使用。在serial基础上实现的多线程收集器。
-XX:+UseConcMarkSweepGC
-XX:+CMSParallelRemarkEnabled #降低标记停顿
-XX:+UseCMSCompactAtFullCollection #使用并发收集器时,开启对年老代的压缩.
-XX:LargePageSizeInBytes=128m
-XX:+UseFastAccessorMethods
-XX:+UseCMSInitiatingOccupancyOnly
-Duser.timezone=Asia/Shanghai #时区
-Djava.awt.headless=true #一般是在程序开始激活headless模式,告诉程序,现在你要工作在Headless mode下,就不要指望硬件帮忙了,你得自力更生,依靠系统的计算能力模拟出这些特性来
- 当你对项目进行压测时最好将响应时间控制在5秒以下,根据这个来设置tomcat的最大连接数。
查看JVM参数 tomcat-users.xml
<role rolename="manager-gui"/>
<role rolename="admin-gui"/>
<user username="dhh" password="dhh" roles="manager-gui,admin-gui"/>
启动tomcat:
localhost:8080
首页有三个入口
Server Status
Manager App
Host Manager
进入Server Status: http://localhost:8080/manager/status