Tomcat是我们经常使用的 servlet容器之一,甚至很多线上产品都使用 Tomcat充当服务器。而且优化后的Tomcat性能提升显著,本文从以下几方面进行分析优化(文章针对linux操作系统)。
目录结构
内存优化
linux系统中,参数在catalina.sh中配置。
配置最小内存:-Xms2048M,最大内存:-Xmx2048M。
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=F:softwareapache-tomcat-8.0.36logsheap.dump。内存溢出时,内存影像dump到文件中。
新生代,老生代不用配置了,新版本的jdk默认的已经做的非常好了。jdk8已经不存在永久代。从JDK8开始,永久代(PermGen)的概念被废弃掉了,取而代之的是一个称为Metaspace的存储空间。可理解为元数据空间。
移除永久代的工作从JDK1.7就开始了。JDK1.7中,存储在永久代的部分数据就已经转移到了Java Heap或者是 Native Heap。但永久代仍存在于JDK1.7中,并没完全移除,譬如符号引用(Symbols)转移到了native heap;字面量(interned strings,字符串池)转移到了java heap;类的静态变量(class statics)转移到了java heap。
转载:Java8内存模型—永久代(PermGen)和元空间(Metaspace):http://www.cnblogs.com/paddix/p/5309550.html
转载:为何去掉永久代:https://blog.csdn.net/u011531613/article/details/62971713
如果你的业务生成的对象很多会进入老年代,生命周期非常长,建议内存稍大一点。这样可以节约频繁的GC的开销。
如果你的业务生成的对象很多都是朝生夕灭,生命周期短暂,建议新生代和老年代内存比例可以适当调整,老年代小一点。Min GC会相对来说稍微频繁一点。但是尽量避免Full GC。因为这个对JVM性能影响比Min GC大很多。
如果你们的业务对内存很敏感,上线前一半要做很多实验和测试来确定合适的内存大小。
新生代和老年代的比例如:-XX:NewRatio=2,即新生代:老年代=1:2。jdk8中,配置2g内存后,查看tomcat信息,如下图所示。
tomcat运行后,默认页面,点击server status.
并发优化
具体参数含义,参考tomcat安装目录下,webappsdocsconfig里的http.html文件。
2.1 maxConnections
最大连接数。对于 NIO and NIO2 默认值为10000. 对于 APR/native, 默认值为8192。windows系统默认采用APR。linux下,需安装配置。apr适合高并发下的文件读写。
2.2 acceptCount
并发连接数达到配置的值时,新的请求放入队列中。该值为队列大小。默认值为100.
2.3 maxThreads
最大线程数。默认200。一般8核cpu,200个线程足够了。如果存在大量的web输入,等待IO,该值可以调大。
2.4 minSpareThreads
默认10。最小空闲线程。
具体参数在server.xml里配置。
其他优化
3.1 autoDeploy
具体参数含义,参考tomcat安装目录下,webappsdocsconfig里的host.html文件。
该参数是指,tomcat是否周期性的检查有没有新的应用或是更新的应用。默认为true,会影响性能。
3.2 enableLookups
具体说明,http.html文件中。
如果想进行dns查询,设置为true。如果想跳过,则设置为false,会直接返回IP地址。默认false(低版本tomcat不一定)。false下,会提升性能。
3.3 reloadable
true的情况下,监控WEB-INF/classes/和/WEB-INF/lib下的变化,自动重新加载web应用。线上绝对不允许开发,会造成非常严重的负载。默认也是false.
3.4 AJP
ajp是和apache集成的时候用的,一般采用的是nginx+tomcat,用不到,注销掉。即在server.xml文件中,注销:
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
3.5 关闭SSLEngine
如果没有用到ssl,在server.xml中,
<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="off">
总体来说,tomcat新的版本,大部分已经配置好了,基本上能做到开箱即用。
apr连接器
apr会用到native的api,适用于大并发。如果网站用到大并发,需要用到apr。
安装最新apr和其依赖项,到官网下载。
安装完成后,在server.xml里配置如下:
具体安装apr完成之后,修改总览如下。
从JDK8开始,永久代(PermGen)的概念被废弃掉了,取而代之的是一个称为Metaspace的存储空间。
-XX:MetaspaceSize=128m,设置元空间初始大小为128M。该值越大触发Metaspace GC的时机就越晚。随着GC的到来,虚拟机会根据实际情况调控Metaspace的大小,可能增加上线也可能降低。Metaspace使用的是本地内存,而不是堆内存,也就是说在默认情况下Metaspace的大小只与本地内存大小有关。
内存调优工具,jdk安装后,有几个自带的分析命令,如:jstat,jmap等
---------------END----------------
后续的内容同样精彩
长按关注“IT实战联盟”哦
注意:本文归作者所有,未经作者允许,不得转载