天天看點

Tomcat 使用apr優化

      最近業務伺服器出現了一些問題,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,

Tomcat 使用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生效