from:http://passover.blog.51cto.com/2431658/732629
在線上環(huán)境中我們是采用了tomcat作為Web服務器,它的處理性能直接關系到用戶體驗,在平時的工作和學習中,歸納出以下七種調(diào)優(yōu)經(jīng)驗。
1. 服務器資源
服務器所能提供CPU、內(nèi)存、硬盤的性能對處理能力有決定性影響。
(1) 對于高并發(fā)情況下會有大量的運算,那么CPU的速度會直接影響到處理速度。
(2) 內(nèi)存在大量數(shù)據(jù)處理的情況下,將會有較大的內(nèi)存容量需求,可以用-Xmx -Xms -XX:MaxPermSize等參數(shù)對內(nèi)存不同功能塊進行劃分。我們之前就遇到過內(nèi)存分配不足,導致虛擬機一直處于full GC,從而導致處理能力嚴重下降。
(3) 硬盤主要問題就是讀寫性能,當大量文件進行讀寫時,磁盤極容易成為性能瓶頸。最好的辦法還是利用下面提到的緩存。
2. 利用緩存和壓縮
對于靜態(tài)頁面最好是能夠緩存起來,這樣就不必每次從磁盤上讀。這里我們采用了Nginx作為緩存服務器,將圖片、css、js文件都進行了緩存,有效的減少了后端tomcat的訪問。
另外,為了能加快網(wǎng)絡傳輸速度,開啟gzip壓縮也是必不可少的。但考慮到tomcat已經(jīng)需要處理很多東西了,所以把這個壓縮的工作就交給前端的Nginx來完成??梢詤⒖贾皩懙摹?a target="_blank" style="padding: 0px; margin: 0px; color: #4b0002; text-decoration: none;">利用nginx加速web訪問》。
除了文本可以用gzip壓縮,其實很多圖片也可以用圖像處理工具預先進行壓縮,找到一個平衡點可以讓畫質(zhì)損失很小而文件可以減小很多。曾經(jīng)我就見過一個圖片從300多kb壓縮到幾十kb,自己幾乎看不出來區(qū)別。
3. 采用集群
單個服務器性能總是有限的,最好的辦法自然是實現(xiàn)橫向擴展,那么組建tomcat集群是有效提升性能的手段。我們還是采用了Nginx來作為請求分流的服務器,后端多個tomcat共享session來協(xié)同工作??梢詤⒖贾皩懙摹?a target="_blank" style="padding: 0px; margin: 0px; color: #4b0002; text-decoration: none;">利用nginx+tomcat+memcached組建web服務器負載均衡》。
4. 優(yōu)化tomcat參數(shù)
這里以tomcat7的參數(shù)配置為例,需要修改conf/server.xml文件,主要是優(yōu)化連接配置,關閉客戶端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模型,在幾百并發(fā)下性能會有很嚴重的下降。tomcat自帶還有NIO的模型,另外也可以調(diào)用APR的庫來實現(xiàn)操作系統(tǒng)級別控制。
NIO模型是內(nèi)置的,調(diào)用很方便,只需要將上面配置文件中protocol修改成org.apache.coyote.http11.Http11NioProtocol,重啟即可生效。上面配置我已經(jīng)改過了,默認的是HTTP/1.1。
APR則需要安裝第三方庫,在高并發(fā)下會讓性能有明顯提升。具體安裝辦法可以參考http://www.cnblogs.com/huangjingzhou/articles/2097241.html。安裝完成后重啟即可生效。如使用默認protocal就是apr,但最好把將protocol修改成org.apache.coyote.http11.Http11AprProtocol,會更加明確。
在官方找到一個表格詳細說明了這三種方式的區(qū)別:
- 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. 優(yōu)化網(wǎng)絡
Joel也明確提出了優(yōu)化網(wǎng)卡驅(qū)動可以有效提升性能,這個對于集群環(huán)境工作的時候尤為重要。由于我們采用了linux服務器,所以優(yōu)化內(nèi)核參數(shù)也是一個非常重要的工作。給一個參考的優(yōu)化參數(shù):
- 1. 修改/etc/sysctl.cnf文件,在最后追加如下內(nèi)容:
-
- 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. 保存退出,執(zhí)行sysctl -p生效
7. 讓測試說話
優(yōu)化系統(tǒng)最忌諱的就是只調(diào)優(yōu)不測試,有時不適當?shù)膬?yōu)化反而會讓性能更低。以上所有的優(yōu)化方法都要在本地進行性能測試過后再不斷調(diào)整參數(shù),這樣最終才能達到最佳的優(yōu)化效果。
補充Bio、Nio、Apr模式的測試結(jié)果:
對于這幾種模式,我用ab命令模擬1000并發(fā)測試10000詞,測試結(jié)果比較意外,為了確認結(jié)果,我每種方式反復測試了10多次,并且在兩個服務器上都測試了一遍。結(jié)果發(fā)現(xiàn)Bio和Nio性能差別非常微弱,難怪默認居然還是Bio。但是采用apr,連接建立的速度會有50%~100%的提升。直接調(diào)用操作系統(tǒng)層果然神速啊,這里強烈推薦apr方式!
參考資料:
http://16.199.geisvps.com/bbs/2836/24238.html