Tomcat7优化配置

札记

Posted by 0xl00se on September 1, 2017

1、内存优化:

优化内存,主要是在bin/catalina.bat或bin/catalina.sh 配置文件中进行。linux上,在catalina.sh中添加: JAVA_OPTS="-server -Xms1G -Xmx2G -Xss256K -Djava.awt.headless=true -Dfile.encoding=utf-8 -XX:PermSize=128M -XX:MaxPermSize=256M" 其中:

-server:启用JDK的server版本。-Xms:JVM初始化时的最小heap容量。
-Xmx:JVM可使用的最大heap容量。-Xms与-Xmx设成一样的值,避免JVM因为频繁的GC导致性能不稳定。
-XX:PermSize:设置非heap初始值,默认是物理内存的1/64。
-XX:MaxPermSize:Perm(俗称方法区)占整个heap的最大值,也称内存最大永久保留区域。

2、连接数优化:

优化连接数,主要是在conf/server.xml配置文件中进行修改。

2.1、优化线程数

找到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。

2.2、使用线程池

在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:线程优先级。

注:当tomcat并发用户量大的时候,单个jvm进程确实可能打开过多的文件句柄,这时会报java.net.SocketException:Too many open files错误。可使用下面步骤检查:

ps -ef |grep tomcat 查看tomcat的进程ID,记录ID号。
lsof -p 端口号 | wc -l 查看当前进程id号的文件操作数。
ulimit -a 查看每个用户允许打开的最大文件数。 

3、Tomcat Connector三种运行模式(BIO, NIO, APR)

3.1、三种模式比较:

1)BIO:一个线程处理一个请求。缺点:并发量高时,线程数较多,浪费资源。Tomcat7或以下在Linux系统中默认使用这种方式。

2)NIO:利用Java的异步IO处理,可以通过少量的线程处理大量的请求。Tomcat8在Linux系统中默认使用这种方式。Tomcat7必须修改Connector配置来启动(conf/server.xml配置文件):

<Connectorport="8080" protocol="org.apache.coyote.http11.Http11NioProtocol" connectionTimeout="20000" redirectPort="8443"/> 

3)APR(Apache Portable Runtime):从操作系统层面解决io阻塞问题。Linux如果安装了apr和native,Tomcat直接启动就支持apr。

3.2、apr模式

安装apr以及tomcat-native。

yum -y install apr apr-devel
cd /opt/local/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;

注意最新版本的tomcat自带tomcat-native.war.gz,不过其版本相对于yum安装的apr过高,configure的时候会报错。

解决方案:

yum remove apr apr-devel, –y 卸载yum安装的apr和apr-devel;

下载最新版本的apr源码包,编译安装,或者下载低版本的tomcat-native编译安装;

安装成功后还需要对tomcat设置环境变量,方法是在catalina.sh文件中增加1行: CATALINA_OPTS="-Djava.library.path=/usr/local/apr/lib"

apr下载地址:http://apr.apache.org/download.cgi

tomcat-native下载地址:http://tomcat.apache.org/download-native.cgi

修改8080端对应的conf/server.xml protocol=”org.apache.coyote.http11.Http11AprProtocol”

<Connector executor="tomcatThreadPool" port="8080" protocol="org.apache.coyote.http11.Http11AprProtocol" connectionTimeout=”20000″ enableLookups="false" redirectPort="8443" URIEncoding="UTF-8" /> 

PS:启动以后查看日志 显示如下表示开启 apr 模式 x xx,

xxxx xx:xx:xx PM org.apache.coyote.AbstractProtocol start INFO: Starting ProtocolHandler [“http-apr-8081”]