接上文。
大家都聽說了在Apache Tomcat6 中支持了Java語言的特性 NIO( New I/O),不管你對NIO的技術是否熟悉,但你肯定能想象的到NIO是一個好東西。的確,使用NIO在服務器端會有更好的性能,加強服務器端對並發處理的性能。 請注意:很抱歉,在tomcat6在默認的配置選項中是沒有把NIO功能打開。所以很多正在使用Tomcat6的朋友們本以為能快活的使用上NIO。
cd /usr/local/tomcat1/conf
vi server.xml
一、設置Tomcat連接器池。
黃海在配置文件中添加了如下配置:
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="1000" minSpareThreads="350" />
二、Linux下修改JVM內存大小
要添加在tomcat 的bin 下catalina.sh 里,位置cygwin=false前 。注意引號要帶上,紅色的為新添加的.
# OS specific support. $var _must_ be set to either true or false. JAVA_OPTS="-server -Xms512M -Xmx512M -Xss256K -Djava.awt.headless=true -Dfile.encoding=utf-8 -XX:PermSize=64M -XX:MaxPermSize=128m" cygwin=false
三、查看當前系統open files的默認值:
ulimit -a
沒改過是1024
文件系統最大可打開文件數:cat /proc/sys/fs/file-max
我的機器是396399
修改文件系統最大打開文件數:echo 396399 >/proc/sys/fs/file-max
此值只能往小的設置不能超過限制值。
1、 在vi /etc/security/limits.conf文件中設置最大打開文件數 添加:
* soft nofile 65535
* hard nofile 65535
最后用重啟ulimit -a再次查看,open files的值,如果改過來,則生效。
四、 安裝Tomcat的Apr,提升性能
發現 Tomcat 可以用 Apache Portable Runtime 來提供更強性能,提升Web靜態頁面的處理能力,不再需要專門的Web Server來處理靜態頁面了。apr 與 tomcat-native 提供更好的伸縮性、性能和集成到本地服務器技術。
如果沒有apr技術,啟動tomcat 時出現如下提示:
信息: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: /usr/java/jdk1.6.0_06/jre/lib/i386/client:/usr/java/jdk1.6.0_06/jre/lib/i386:/usr/java/jdk1.6.0_06/
jre/../lib/i386:/usr/java/packages/lib/i386:/lib:/usr/lib
按照官方說明需要:
APR library
OpenSSL libraries
openssl 可以用
yum install -y openssl-devel
apr還是下載*.gz來安裝。
(1)安裝apr
mkdir /root/software cd /root/software wget http://mirror.bit.edu.cn/apache/apr/apr-1.4.6.tar.gz tar zxvf apr-1.4.6.tar.gz cd apr-1.4.6 ./configure --prefix=/usr/local/apr make make install
安裝apr的時候出現
./configure --prefix=/usr/local/apr
rm: cannot remove `libtoolT': No such file or directory
解決辦法:
vim configure
在30048行 # $RM "$cfgfile" 前面加#注釋掉
在重新./configure
(2)安裝apr-iconv
cd /root/software wget http://mirror.bit.edu.cn/apache/apr/apr-iconv-1.2.1.tar.gz 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
cd /root/software wget http://mirror.bit.edu.cn/apache/apr/apr-util-1.4.1.tar.gz tar zxvf apr-util-1.4.1.tar.gz cd apr-util-1.4.1 ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr --with-apr-iconv=/usr/local/apr-iconv/bin/apriconv make make install
PS:我有經歷兩次不同裝apr,第一次是我的centos沒有升級,一個升級后,升級前會有一些雜七雜八的error說不成,一般都是少包什么的,你給它yum update就行了,建議升級后再裝,會比較正常一點點~~
(4)安裝tomcat-native
//tomcat-native-1.1.27-src.tar.gz 這個我裝的tomcat里邊就自己帶了,在bin目錄下,如果你們沒有找到,去網上下一個就行了。。具體哪下我也不知道⊙﹏⊙b汗,找apache的官網吧
cd /usr/local/tomcat1/bin tar zxvf tomcat-native.tar.gz cd tomcat-native-1.1.27-src/jni/native ./configure --with-apr=/usr/local/apr make make install
(5)設置 apr 的環境變量
cd /usr/local/tomcat1/bin
vi catalina.sh
在文件的#!/bin/sh下添加如下內容:
#!/bin/sh LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/apr/lib export LD_LIBRARY_PATH
這樣的話,我們只是把這個TOMCAT的APR添加上了,不破壞其它TOMCAT的配置信息。
啟動 tomcat 后, 看日志:
bin/startup.sh
head logs/catalina.out
可以看到以下結果:
好了,可以運行了,但沒有測試其性能提高多少。
在高並發下會讓性能有明顯提升。安裝完成后重啟即可生效。如使用默認protocal就是apr,但最好把將protocol修改成org.apache.coyote.http11.Http11AprProtocol,會更加明確。
cd /usr/local/tomcat1/conf
vi server.xml
替換Connector內容如下:
<Connector port="8080" protocol="org.apache.coyote.http11.Http11AprProtocol" executor="tomcatThreadPool" compression="on" compressionMinSize="2048" maxThreads="30000" minSpareThreads="512" maxSpareThreads="2048" enableLookups="false" redirectPort="8443" acceptCount="35000" debug="0" connectionTimeout="40000" disableUploadTimeout="true" URIEncoding="UTF-8" useBodyEncodingForURI="true" />
下面我們開始進行測試兩種協議的壓力情況:
centos安裝ab
yum install httpd-tools
准備之后我們就可以測試了
ab -kc 1000 -n 10000 http://localhost:8080/
這個指令會使用1000個並發,進行連接10000次。結果如下:
NIO最快的一次:
APR的最快一次:
差距是50%左右,強烈推薦使用APR協議!!!不要使用NIO協議+APR庫支持的行為!!!!!!!!
如果安裝不上APR或者真的沒有辦法啟用APR,那么用如下的備用方案:
<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol" executor="tomcatThreadPool" compression="on" compressionMinSize="2048" maxThreads="30000" minSpareThreads="512" maxSpareThreads="2048" enableLookups="false" redirectPort="8443" acceptCount="35000" debug="0" connectionTimeout="40000" disableUploadTimeout="true" URIEncoding="UTF-8" useBodyEncodingForURI="true" />