优化内存
/bin/catalina.sh添加JAVA_OPTS参数
jdk1.7
JAVA_OPTS="-Djava.awt.headless=true -Dfile.encoding=UTF-8 -server -Xms512m -Xmx1024m -XX:NewSize=512m -XX:MaxNewSize=1024M -XX:PermSize=1024m -XX:MaxPermSize=1024m -XX:+DisableExplicitGC"
jdk1.8
1.8版本中已经没有PermSize、MaxPermSize
JAVA_OPTS="-Djava.awt.headless=true -Dfile.encoding=UTF-8 -server -Xms512m -Xmx1024m -XX:NewSize=512m -XX:MaxNewSize=1024M -XX:+DisableExplicitGC"
参数说明:
-Djava.awt.headless:没有设备、键盘或鼠标的模式。有关介绍:What is Headless mode in Java
-Dfile.encoding: 设置字符集
-server:jvm的server工作模式,对应的有client工作模式。使用“java -version”可以查看当前工作模式
-Xms512m:初始Heap大小,使用的最小内存
-Xmx1024m:Java heap最大值,使用的最大内存
-XX:NewSize=512m:表示新生代初始内存的大小,应该小于 -Xms的值
-XX:MaxNewSize=1024M:表示新生代可被分配的内存的最大上限,应该小于 -Xmx的值
-XX:PermSize=1024m:设定内存的永久保存区域(注:jdk1.8 was removed)
-XX:MaxPermSize=1024m:设定最大内存的永久保存区域(注:jdk1.8 was removed)
-XX:+DisableExplicitGC:自动将System.gc()调用转换成一个空操作,即应用中调用System.gc()会变成一个空操作
优化连接数
优化线程数
在conf/server.xml找到Connectorport="8080" protocol="HTTP/1.1",增加maxThreads和acceptCount属性(使acceptCount大于等于maxThreads),如下:
<Connectorport="8080" protocol="HTTP/1.1"connectionTimeout="20000" redirectPort="8443"acceptCount="500" maxThreads="400" />
参数说明:
maxThreads:tomcat可用于请求处理的最大线程数,默认是200
minSpareThreads:tomcat初始线程数,即最小空闲线程数
maxSpareThreads:tomcat最大空闲线程数,超过的会被关闭
acceptCount:当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理.默认100
使用线程池
在conf/server.xml中增加executor节点,然后配置connector的executor属性,如下:
<Executorname="tomcatThreadPool" namePrefix="req-exec-"maxThreads="1000" minSpareThreads="50"maxIdleTime="60000"/>
<Connectorport="8080" protocol="HTTP/1.1"executor="tomcatThreadPool"/>
参数说明:
namePrefix:线程池中线程的命名前缀
maxThreads:线程池的最大线程数
minSpareThreads:线程池的最小空闲线程数
maxIdleTime:超过最小空闲线程数时,多的线程会等待这个时间长度,然后关闭
threadPriority:线程优先级
优化运行模式(connector for protocol)
-
BIO
一个线程处理一个请求。缺点:并发量高时,线程数较多,浪费资源。Tomcat7或以下在Linux系统中默认使用这种方式。
配置conf/server.xml
```
<Connector executor="tomcatThreadPool" port="8080" protocol="HTTP/1.1" connectionTimeout="20000" enableLookups="false" redirectPort="8443" URIEncoding="UTF-8" />```
-
NIO
利用Java的异步IO处理,可以通过少量的线程处理大量的请求。Tomcat8在Linux系统中默认使用这种方式。Tomcat7必须修改Connector配置来启动(conf/server.xml配置文件)。
配置conf/server.xml
<Connector executor="tomcatThreadPool" port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol" connectionTimeout="20000" enableLookups="false" redirectPort="8443" URIEncoding="UTF-8" />
3. apr
apr=Apache Portable Runtime,从操作系统层面解决io阻塞问题。
- 安装apr
下载apr: http://www.linuxfromscratch.org/blfs/view/svn/general/apr.html
```shell
tar xvf apr-1.5.2.tar.bz2
cd apr-1.5.2
./configure --prefix=/usr --disable-static --with-installbuilddir=/usr/share/apr-1/build &&
make
make install
```
> --disable-static: This switch prevents installation of static versions of the libraries
- 安装tomcat-native
进入tomcat/bin目录,比如:
```
cd /home/vhs/tomcat/bin
tar xzfv tomcat-native.tar.gz
cd tomcat-native-1.1.32-src/jni/native
./configure --with-apr=/usr/bin/apr-1-config
make
make install
```
- 配置server.xml
- 对tomcat设置环境变量,方法是在bin/catalina.sh文件中增加1行
` CATALINA_OPTS="-Djava.library.path=/usr/local/apr/lib" `
- 修改conf/server.xml
```
<Connector executor="tomcatThreadPool" port="8080" protocol="org.apache.coyote.http11.Http11AprProtocol" connectionTimeout="20000" enableLookups="false" redirectPort="8443" URIEncoding="UTF-8" />
```
> tomcat启动遇到错误:failed to initialize the sslengine。
> 解决办法:
> 修改server.xml中Listener的className=“org.apache.catalina.core.AprLifecycleListener” 的参数SSLEngine为off。如下:`<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="off" />`
## 参考
- [Tomcat7优化配置](http://www.linuxprobe.com/tomcat7-configure-optimize.html)