1. 服务器资源
- 对于高并发情况下会有大量的运算,那么CPU的速度会直接影响到处理速度。
- 内存在大量数据处理的情况下,将会有较大的内存容量需求,可以用-Xmx -Xms -XX:MaxPermSize等参数对内存不同功能块进行划分。我们之前就遇到过内存分配不足,导致虚拟机一直处于full GC,从而导致处理能力严重下降。
2. 开启内容压缩
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8181" compression="500"
compressableMimeType="text/html,text/xml,text/plain,application/octet-stream" />
3. 采用集群
单个服务器性能总是有限的,最好的办法自然是实现横向扩展,那么组建tomcat集群是有效提升性能的手段。
我们还是采用了Nginx来作为请求分流的服务器,后端多个tomcat协同工作。
4. 优化tomcat参数
这里以tomcat7的参数配置为例,需要修改conf/server.xml文件,主要是优化连接配置,关闭客户端dns查询。
<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol" executor="tomcatThreadPool" compression="on" compressionMinSize="2048" maxThreads="30000" <!--这个要看服务器内存多大了--> minSpareThreads="100" maxSpareThreads="2048" enableLookups="false" redirectPort="8443" acceptCount="35000" debug="0" connectionTimeout="40000" disableUploadTimeout="true" URIEncoding="UTF-8" useBodyEncodingForURI="true" />
Tomcat连接器池
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="1000" minSpareThreads="350" />
线程池名: name="tomcatThreadPool"
线程前缀: namePrefix="catalina-exec-"
最大产生线程数:maxThreads="1000"
最小初始现程数:minSpareThreads="350"
5. 改用APR库
tomcat默认采用的BIO模型,在几百并发下性能会有很严重的下降。tomcat自带还有NIO的模型,另外也可以调用APR的库来实现操作系统级别控制。
NIO模型是内置的,调用很方便,只需要将上面配置文件中protocol修改成org.apache.coyote.http11.Http11NioProtocol,重启即可生效。上面配置我已经改过了,默认的是HTTP/1.1。
APR则需要安装第三方库,在高并发下会让性能有明显提升。具体安装办法可以参考 下面红色内容。安装完成后重启即可生效。如使用默认protocal就是apr,但最好把将protocol修改成org.apache.coyote.http11.Http11AprProtocol,会更加明确。
在官方找到一个表格详细说明了这三种方式的区别:
Java Blocking Connector Java Nio Blocking Connector APR/native Connector BIO NIO APR Classname AjpProtocol AjpNioProtocol AjpAprProtocol Tomcat Version 3.x onwards 7.x onwards 5.5.x onwards Support Polling NO YES YES Polling Size N/A maxConnections maxConnections Read Request Headers Blocking Sim Blocking Blocking Read Request Body Blocking Sim Blocking Blocking Write Response Blocking Sim Blocking Blocking Wait for next Request Blocking Non Blocking Non Blocking Max Connections maxConnections maxConnections maxConnections
6. 优化网络
Joel也明确提出了优化网卡驱动可以有效提升性能,这个对于集群环境工作的时候尤为重要。由于我们采用了linux服务器,所以优化内核参数也是一个非常重要的工作。给一个参考的优化参数:
修改/etc/sysctl.cnf文件,在最后追加如下内容:
net.core.netdev_max_backlog = 32768 net.core.somaxconn = 32768 net.core.wmem_default = 8388608 net.core.rmem_default = 8388608 net.core.rmem_max = 16777216 net.core.wmem_max = 16777216 net.ipv4.ip_local_port_range = 1024 65000 net.ipv4.route.gc_timeout = 100 net.ipv4.tcp_fin_timeout = 30 net.ipv4.tcp_keepalive_time = 1200 net.ipv4.tcp_timestamps = 0 net.ipv4.tcp_synack_retries = 2 net.ipv4.tcp_syn_retries = 2 net.ipv4.tcp_tw_recycle = 1 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_mem = 94500000 915000000 927000000 net.ipv4.tcp_max_orphans = 3276800 net.ipv4.tcp_max_syn_backlog = 65536
7. 让测试说话
优化系统最忌讳的就是只调优不测试,有时不适当的优化反而会让性能更低。以上所有的优化方法都要在本地进行性能测试过后再不断调整参数,这样最终才能达到最佳的优化效果。
补充Bio、Nio、Apr模式的测试结果:
对于这几种模式,我用ab命令模拟1000并发测试10000词,测试结果比较意外,为了确认结果,我每种方式反复测试了10多次,并且在两个服务器上都测试了一遍。结果发现Bio和Nio性能差别非常微弱,难怪默认居然还是Bio。但是采用apr,连接建立的速度会有50%~100%的提升。直接调用操作系统层果然神速啊,这里强烈推荐apr方式!
--------------------------------------------------------↓------tomcat7.0.8的高级应用-apr1.4.2安装------↓-------------------------------------------------------------------
一 windows下安装
直接拷贝tcnative-1.dll到TOMCAT_HOME/bin目录下,启动即可
下载地址 http://archive.apache.org/dist/tomcat/tomcat-connectors/native/
二 linux centos4.8或者ubuntu10.10 server安装
1.下载包
到http://apr.apache.org/下载下面3个包
apr-1.4.2.tar.gz
apr-iconv-1.2.1.tar.gz
apr-util-1.3.10.tar.gz
java版本jdk-6u23-linux-x64-rpm.bin
tomcat版本apache-tomcat-7.0.8.tar.gz
三 安装JDK,tomcat
安装JDK并设置环境变量
vi /etc/profile #在他文件末尾处添加下面的变量
# java
JAVA_HOME=/usr/java/jdk1.6.0_23
PATH=$JAVA_HOME/bin:$PATH
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JAVA_HOME
export PATH
export CLASSPATH
执行
source /etc/profile
此时环境变量生效果
apache-tomcat-7.0.8.tar.gz解压缩到/usr/local/下面
四 安装apr插件
1)安装apr
tar zxvf apr-1.4.2.tar
cd apr-1.4.2
./configure --prefix=/usr/local/apr
make
make install
2)安装apr-iconv
程序代码
tar -zxvf apr-iconv-1.2.1.tar.gz
cd apr-iconv-1.2.1
./configure --prefix=/usr/local/apr-iconv --with-apr=/usr/local/apr
make
make install
3)安装apr-util
程序代码
tar zxvf apr-util-1.3.10.tar.gz
cd apr-util-1.3.10
./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr --with-apr-iconv=/usr/local/apr-iconv/bin/apriconv
make
make install
4)安装tomcat-native
程序代码
tar zxvf tomcat-native-1.1.20-src.tar.gz
cd tomcat-native-1.1.20-src/jni/native
./configure --with-apr=/usr/local/apr --with-java-home=/usr/java/jdk1.6.0_23
make
make install
5)添加环境变量
vi /etc/profile #在他文件末尾处添加下面的变量
# apr
export LD_LIBRARY_PATH=/usr/local/apr/lib
执行
source /etc/profile
此时环境变量生效果
启动tomcat
TOMCAT_HOME/bin/start.sh
more TOMCAT_HOME/logs/catalina.out
即可看到
Aug 29, 2010 3:47:32 PM org.apache.catalina.core.AprLifecycleListener init
INFO: Loaded APR based Apache Tomcat Native library 1.1.20.
优化完成