1、server.xml优化
<Connector
port="8080"
executor="tomcatThreadPool"
protocol="org.apache.coyote.http11.Http11NioProtocol"
enableLookups="false"
maxThreads="1000"
minSpareThreads="100"
acceptCount="1500"
disableUploadTimeout="true"
connectionTimeout="20000"
URIEncoding="UTF-8"
redirectPort="8443"
compression="on"
compressionMinSize="1024"
useSendfile="false"
noCompressionUserAgents="gozilla, traviata"
compressibleMimeType="text/html,text/xml,text/plain,text/css,text/javascript,application/javascript " />
executor tomcat线程池,同maxThreads
org.apache.coyote.http11.Http11NioProtocol:工作模式为nio,如果设成Nio2启动时会警告The NIO2 connector requires an exclusive executor to operate properly on shutdown,会影响停服等速度
maxThreads:最大线程数,默认150。增大值避免队列请求过多,导致响应缓慢。线程数算法涉及到吞吐量,一般单核建议100-200之间,多核按此计算累加,单进程linux下有最大1000的限制。
minSpareThreads:最小空闲线程数。
acceptCount:当处理请求超过此值时,将后来请求放到队列中等待。
disableUploadTimeout:禁用上传超时时间
connectionTimeout:连接超时,单位毫秒,0代表不限制
URIEncoding:URI地址编码使用UTF-8
enableLookups:关闭dns解析,提高响应时间
compression:启用压缩功能
compressionMinSize:最小压缩大小,单位Byte
compressibleMimeType :压缩的文件类型
2、JAVA_OPTS
-server -Dfile.encoding=UTF-8 -XX:+UseG1GC -XX:MaxTenuringThreshold=14 -Xms1g -Xmx2g -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=256m -XX:MaxDirectMemorySize=256m -XX:ConcGCThreads=2 -XX:+AlwaysPreTouch
2.1、内存区域大小
首先要调整的,就是各个分区的大小,不过这也要分垃圾回收器,我们仅看一下一些全局的参数。
- -XX:+UseG1GC 首先,要指定JVM使用的垃圾回收器。尽量不要靠默认值去保证,要显式的指定一个。
- -Xmx 设置堆的最大值,一般为操作系统的2/3大小。
- -Xms 设置堆的初始值,一般设置成和Xmx一样的大小来避免动态扩容。
-Xmn 年轻代大小,默认新生代占堆大小的1/3。高并发快消亡场景可适当加大这个区域。对半,或者更多,都是可以的。但是在G1下,就不用再设置这个值了,它会自动调整,因为用的G1,所以并没有设- -XX:MaxMetaspaceSize 限制元空间的大小,一般256M足够。这一般和初始大小**-XX:MetaspaceSize**设置成一样的。可以理解成MaxPermSize
- -XX:MaxDirectMemorySize 设置直接内存的最大值,限制通过DirectByteBuffer申请的内存,幽灵内存适当可以放大。
-XX:ReservedCodeCacheSize 设置JIT编译后的代码存放区大小,如果观察到这个值有限制,可以适当调大,一般够用。正常默认值就行-Xss 设置栈的大小,默认为1M,已经足够用了。- -XX:+AlwaysPreTouch 启动时就把参数里说好了的内存全部初始化,启动时间会慢一些,但运行速度会增加。
-XX:SurvivorRatio 默认值为8。表示伊甸区和幸存区的比例。- -XX:MaxTenuringThreshold 这个值在CMS下默认为6,G1下默认为15。这个值和我们前面提到的对象提升有关,改动效果会比较明显。对象的年龄分布可以使用**-XX:+PrintTenuringDistribution**打印,如果后面几代的大小总是差不多,证明过了某个年龄后的对象总能晋升到老生代,就可以把晋升阈值设小。
G1按固定大小把内存划分为很多小区域(region),这个堆大概有2000多块;在逻辑上,某些小区域构成Eden,某些构成Survivor,某些构成老年代,这些小区域物理上是不相连的,并且构成新生代和老年代的区域可以动态改变。
可以通过命令行参数-XX:NewRatio=n
来配置老年代和新生代的比例,默认为2,即比例为2:1;-XX:SurvivorRatio=n
则可以配置Eden与Survivor的比例,默认为8。
G1垃圾回收器
- -XX:MaxGCPauseMillis 设置目标停顿时间,G1会尽力达成,默认是200ms,不建议设置太低,会增加cpu的值
-XX:G1HeapRegionSize 设置小堆区大小。这个值为2的次幂,不要太大,也不要太小。如果是在不知道如何设置,保持默认。-XX:InitiatingHeapOccupancyPercent 当整个堆内存使用达到一定比例(默认是45%),并发标记阶段就会被启动。- -XX:ConcGCThreads 并发垃圾收集器使用的线程数量。默认值随JVM运行的平台不同而不同。不建议修改。
- -XX:MaxTenuringThreshold=14 提升年老代的最大临界值(tenuring threshold). 默认值为 15[每次GC,增加1岁,到15岁如果还要存活,放入Old区]
3、 catalina.out日志按日期生成
由于tomcat对rotatelogs的支持比较好,所以用rotatelogs来进行拆分
一、准备rotatelogs工具
- 从安装httpd的服务器上,拷贝
/usr/sbin/rotatelogs
文件到$CATALINA_HOME/bin/
目录,并加可执行权限。 - 安装依赖软件 apr , 否则会报错。请见 附件3。
yum install apr apr-util -y
- 执行
./rotatelogs -h
测试rotatelogs是否工作
[tomcat@VM-99-19-centos bin]$ ./rotatelogs -h
rotatelogs: illegal option -- h
Usage: ./rotatelogs [-v] [-l] [-L linkname] [-p prog] [-f] [-t] [-e] [-c] [-n number] <logfile> {<rotation time in seconds>|<rotation size>(B|K|M|G)} [offset minutes from UTC]
二、在$CATALINA_HOME/bin/
目录下创建setenv.sh
,内容如下:
CATALINA_OUT_CMD="$CATALINA_BASE/bin/rotatelogs -f $CATALINA_BASE/logs/catalina.out.%Y-%m-%d.log 86400 480"