最近業務伺服器出現了一些問題,Nginx傲嬌了,準備把加Nginx插件上的一些處理邏輯扔到後端的Tomcat的業務處理裡面去,考慮到tomcat目前本來就壓力山大,是以弄了弄apr庫來優化tomcat的并發能力。(雖然不是很懂具體原理,不過并發能力确實得到了提高~\(≧▽≦)/~)
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
安裝步驟:
下載下傳包
到http://apr.apache.org/下載下傳下面3個包
apr,apr-iconv,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
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
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
5)添加環境變量
vi /etc/profile #在他檔案末尾處添加下面的變量
# apr
export LD_LIBRARY_PATH=/usr/local/apr/lib
執行
source /etc/profile
此時環境變量生效果
6)修改server.xml
配置檔案中protocol修改成org.apache.coyote.http11.Http11AprProtocol
重新開機Tomcat,看到
Aug 29, 2010 3:47:32 PM org.apache.catalina.core.AprLifecycleListener init
INFO: Loaded APR based Apache Tomcat Native library 1.1.20.
即可,在最後的端口資訊方面也可以看到http-apr-8080
PS:可能會出現SSL的錯誤,這個是加密連接配接的配置,如果tomcat處理的業務沒有使用SSL(利用Https來連接配接)的話,設定
效果:
對于這幾種模式,我用ab指令模拟1000并發測試10000次,測試結果比較意外,為了确認結果,我每種方式反複測試了10多次,并且在兩個伺服器上都測試了一遍。結果發現Bio和Nio性能差别不大。但是采用apr,連接配接建立的速度會有50%~100%的提升。
業務上的話,tomcat的數量減少了40%
再PS:由于我們采用了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
儲存退出,執行sysctl -p生效