不同版本的tomcat的参数可能不太一样,所以优化时最好对应官网文档查看下是否还保留着这个参数。
这里是Tomcat官方配置链接:
如果本地已经启动了tomcat,则可以直接访问 http://127.0.0.1:8080/docs/config 来查看本地tomcat配置文档(前提是未删除webapps下的docs目录)。
下面是一些通用的优化手段。
一、tomcat参数配置
1.开启连接池
默认是关闭线程池的。
<!--打开注释,并将线程数调大--> <Executor executor="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="150" minSpareThreads="25"/>
参数解释:
- maxThreads:最大并发数,默认设置 200,一般建议在 500 ~ 800,根据硬件设施和业务来判断
- minSpareThreads:Tomcat 初始化时创建的线程数,默认设置 25
- prestartminSpareThreads:在 Tomcat 初始化的时候就初始化 minSpareThreads 的参数值,如果不等于 true,minSpareThreads 的值就没啥效果了
- maxQueueSize:最大的等待队列数,超过则拒绝请求
2.修改默认的连接参数
修改前
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /><!-- A "Connector" using the shared thread pool--> <!-- <Connector executor="tomcatThreadPool" port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> -->
修改后
<Connector #使用线程池 executor="tomcatThreadPool" port="8080" protocol="org.apache.coyote.http11.Http11Nio2Protocol" connectionTimeout="20000" maxConnections="10000" redirectPort="8443" enableLookups="false" acceptCount="100" maxPostSize="10485760" #开启压缩 compression="on" disableUploadTimeout="true" compressionMinSize="2048" acceptorThreadCount="2" compressableMimeType="text/html,text/xml,text/plain,text/css,text/javascript,application/javascript" #设置编码 URIEncoding="utf-8" />
3.开启NIO或APR
Tomcat有三种运行模式:bio、nio、apr,不同模式下Tomcat的运行效率差别比较大。
- BIO:阻塞式IO,Tomcat6及以前版本默认运行模式,性能低,没有经过任何优化处理。
- NIO:非阻塞式IO,Tomcat7以后的版本默认运行模式,利用Java异步IO技术使Tomcat运行性能有所提升。
- APR:从操作系统级别来解决异步的IO问题,大幅度的提高性能。
①设置NIO模式(Tomcat6)
直接修改server.xml里的Connector节点,修改protocol为 org.apache.coyote.http11.Http11NioProtocol,启动生效。
<!--开启NIO模式--> <Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol" connectionTimeout="20000" redirectPort="8443" />
②设置APR模式(Tomcat7/8)
使用时将protocol指定为protocol=“org.apache.coyote.http11.Http11AprProtocol”。
此外,需要安装apr和native,下面是安装步骤:
#必须要安装apr和native,直接启动就支持apr。 #1.安装apr yum install apr-devel openssl-devel #2.安装native。进入Tomcat的bin目录,解压native源码包 tar -zxvf tomcat-native.tar.gz cd tomcat-native-1.1.32-src/jni/native ./configure--with-apr=/usr/bin/apr-1-config--with-java-home="/opt/soft/jdk1.8.0_60" --with-ssl=yes make make install
native 会被安装到/usr/local/apr/lib。我们需要把/usr/local/apr/lib/ libtcnative-1.so.0.1.32指向Tomcat可识别路径。
15-Apr-2016 22:18:54.209 INFO [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: /usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib
实际上Tomcat8默认apr是开启的,在配置中可以看到。
<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
但是由于操作系统未安装apr或者apr路径未指到Tomcat默认可识别的路径,则apr模式无法启动,自动切换启动nio模式。
cd /usr mkdir java cd java/ mkdir packages cd packages/ mkdir lib cd lib/ mkdir amd64 cd amd64/
把/usr/local/apr/lib/ libtcnative-1.so.0.1.32软链接到上面创建的目录。
ln -s /usr/local/apr/lib/libtcnative-1.so.0.1.32 libtcnative-1.so ln -s /usr/local/apr/lib/libtcnative-1.so.0.1.32 libtcnative-1.so.0
重新启动Tomcat看到启动日志最后三行
4.禁用AJP
如果服务器没有使用 Apache则可以关闭该项。通常我们用的都是nginx,所以可以禁用AJP。
<!--注释掉下面这一行,默认是未注释的--> <!-- <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> -->
二、JVM参数优化
修改文件:bin/catalina.sh
JAVA_OPTS="-Dfile.encoding=UTF-8 -server -Xms1024m -Xmx1024m -XX:NewSize=512m -XX:MaxNewSize=512m -XX:PermSize=256m -XX:MaxPermSize=256m -XX:NewRatio=2 -XX:MaxTenuringThreshold=50 -XX:+DisableExplicitGC"
参数说明:
- file.encoding: 默认文件编码
- -Xmx1024m: 设置JVM最大可用内存为1024MB
- -Xms1024m: 设置JVM最小内存为1024m。此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存。
- -XX:NewSize: 设置年轻代大小
- XX:MaxNewSize: 设置最大的年轻代大小
- -XX:PermSize: 设置永久代大小
- -XX:MaxPermSize:设置最大永久代大小
- -XX:NewRatio=4: 设置年轻代(包括Eden和两个Survivor区)与终身代的比值(除去永久代)。设置为4,则年轻代与终身代所占比值为1:4,年轻代占整个堆栈的1/5
- -XX:MaxTenuringThreshold=0: 设置垃圾最大年龄,默认为:15。如果设置为0的话,则年轻代对象不经过Survivor区,直接进入年老代。对于年老代比较多的应用,可以提高效率。如果将此值设置为一个较大值,则年轻代对象会在Survivor区进行多次复制,这样可以增加对象再年轻代的存活时间,增加在年轻代即被回收的概论。
- -XX:+DisableExplicitGC:这个将会忽略手动调用GC的代码使得System.gc()的调用就会变成一个空调用,完全不会触发任何GC