tomcat優化
?
在線上環境中我們是采用了tomcat作為Web服務器,它的處理性能直接關系到用戶體驗,在平時的工作和學習中,歸納出以下七種調優經驗。
1. 服務器資源
? ? 服務器所能提供CPU、內存、硬盤的性能對處理能力有決定性影響。
? ? (1) 對于高并發情況下會有大量的運算,那么CPU的速度會直接影響到處理速度。
? ? (2) 內存在大量數據處理的情況下,將會有較大的內存容量需求,可以用-Xmx -Xms -XX:MaxPermSize等參數對內存不同功能塊進行劃分。我們之前就遇到過內存分配不足,導致虛擬機一直處于full GC,從而導致處理能力嚴重下降。
? ? (3) 硬盤主要問題就是讀寫性能,當大量文件進行讀寫時,磁盤極容易成為性能瓶頸。最好的辦法還是利用下面提到的緩存。
2. 利用緩存和壓縮
? ? 對于靜態頁面最好是能夠緩存起來,這樣就不必每次從磁盤上讀。這里我們采用了Nginx作為緩存服務器,將圖片、css、js文件都進行了緩存,有效的減少了后端tomcat的訪問。
? ? 另外,為了能加快網絡傳輸速度,開啟gzip壓縮也是必不可少的。但考慮到tomcat已經需要處理很多東西了,所以把這個壓縮的工作就交給前端的Nginx來完成。可以參考之前寫的《利用nginx加速web訪問》。
? ? 除了文本可以用gzip壓縮,其實很多圖片也可以用圖像處理工具預先進行壓縮,找到一個平衡點可以讓畫質損失很小而文件可以減小很多。曾經我就見過一個圖片從300多kb壓縮到幾十kb,自己幾乎看不出來區別。
3. 采用集群
? ? 單個服務器性能總是有限的,最好的辦法自然是實現橫向擴展,那么組建tomcat集群是有效提升性能的手段。我們還是采用了Nginx來作為請求分流的服務器,后端多個tomcat共享session來協同工作。可以參考之前寫的《利用nginx+tomcat+memcached組建web服務器負載均衡》。
4. 優化tomcat參數
? ? 這里以tomcat7的參數配置為例,需要修改conf/server.xml文件,主要是優化連接配置,關閉客戶端dns查詢。
- <Connector?port="8080"???
- ???????????protocol="org.apache.coyote.http11.Http11NioProtocol"??
- ???????????connectionTimeout="20000"??
- ???????????redirectPort="8443"???
- ???????????maxThreads="500"???
- ???????????minSpareThreads="20"??
- ???????????acceptCount="100"?
- ???????????disableUploadTimeout="true"?
- ???????????enableLookups="false"???
- ???????????URIEncoding="UTF-8"?/>?
5. 改用APR庫
? ? tomcat默認采用的BIO模型,在幾百并發下性能會有很嚴重的下降。tomcat自帶還有NIO的模型,另外也可以調用APR的庫來實現操作系統級別控制。
? ? NIO模型是內置的,調用很方便,只需要將上面配置文件中protocol修改成org.apache.coyote.http11.Http11NioProtocol,重啟即可生效。上面配置我已經改過了,默認的是HTTP/1.1。
? ? APR則需要安裝第三方庫,在高并發下會讓性能有明顯提升。具體安裝辦法可以參考http://www.cnblogs.com/huangjingzhou/articles/2097241.html。安裝完成后重啟即可生效。如使用默認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服務器,所以優化內核參數也是一個非常重要的工作。給一個參考的優化參數:
- 1.?修改/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?
- ?
- 2.?保存退出,執行sysctl?-p生效?
7. 讓測試說話
? ? 優化系統最忌諱的就是只調優不測試,有時不適當的優化反而會讓性能更低。以上所有的優化方法都要在本地進行性能測試過后再不斷調整參數,這樣最終才能達到最佳的優化效果。
?
補充Bio、Nio、Apr模式的測試結果:
??? 對于這幾種模式,我用ab命令模擬1000并發測試10000詞,測試結果比較意外,為了確認結果,我每種方式反復測試了10多次,并且在兩個服務器上都測試了一遍。結果發現Bio和Nio性能差別非常微弱,難怪默認居然還是Bio。但是采用apr,連接建立的速度會有50%~100%的提升。直接調用操作系統層果然神速啊,這里強烈推薦apr方式!
?
參考資料:
http://16.199.geisvps.com/bbs/2836/24238.html
http://blog.csdn.net/super_marioli/article/details/27240639
?