在線上環境中咱們是採用了tomcat做爲Web服務器,它的處理性能直接關係到用戶體驗,在平時的工做和學習中,概括出如下七種調優經驗。css
服務器所能提供CPU、內存、硬盤的性能對處理能力有決定性影響。
(1) 對於高併發狀況下會有大量的運算,那麼CPU的速度會直接影響處處理速度。
(2) 內存在大量數據處理的狀況下,將會有較大的內存容量需求,能夠用-Xmx -Xms -XX:MaxPermSize等參數對內存不一樣功能塊進行劃分。咱們以前就遇到過內存分配不足,致使虛擬機一直處於full GC,從而致使處理能力嚴重降低。
(3) 硬盤主要問題就是讀寫性能,當大量文件進行讀寫時,磁盤極容易成爲性能瓶頸。最好的辦法仍是利用下面提到的緩存。html
對於靜態頁面最好是可以緩存起來,這樣就沒必要每次從磁盤上讀。這裏咱們採用了Nginx做爲緩存服務器,將圖片、css、js文件都進行了緩存,有效的減小了後端tomcat的訪問。前端
另外,爲了能加快網絡傳輸速度,開啓gzip壓縮也是必不可少的。但考慮到tomcat已經須要處理不少東西了,因此把這個壓縮的工做就交給前端的Nginx來完成。能夠參考以前寫的《利用nginx加速web訪問》。linux
除了文本能夠用gzip壓縮,其實不少圖片也能夠用圖像處理工具預先進行壓縮,找到一個平衡點可讓畫質損失很小而文件能夠減少不少。曾經我就見過一個圖片從300多kb壓縮到幾十kb,本身幾乎看不出來區別。nginx
單個服務器性能老是有限的,最好的辦法天然是實現橫向擴展,那麼組建tomcat集羣是有效提高性能的手段。咱們仍是採用了Nginx來做爲請求分流的服務器,後端多個tomcat共享session來協同工做。能夠參考以前寫的《利用nginx+tomcat+memcached組建web服務器負載均衡》。web
這裏以tomcat7的參數配置爲例,須要修改conf/server.xml文件,主要是優化鏈接配置,關閉客戶端dns查詢。shell
<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" />
tomcat默認採用的BIO模型,在幾百併發下性能會有很嚴重的降低。tomcat自帶還有NIO的模型,另外也能夠調用APR的庫來實現操做系統級別控制。apache
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,會更加明確。緩存
<Connector port="9906" URIEncoding="UTF-8" protocol="org.apache.coyote.http11.Http11AprProtocol" SSLEnabled="true" maxThreads="450" scheme="https" secure="true" sslProtocol="TLSv1+TLSv1.1+TLSv1.2" SSLCertificateKeyFile="D:/tomcats/tomcat-7.0.57-x64/conf/server.pem" SSLCertificateFile="D:/tomcats/tomcat-7.0.57-x64/conf/server.pem" SSLCACertificateFile="D:/tomcats/tomcat-7.0.57-x64/conf/ca.cer" SSLPassword="123456" SSLVerifyClient="require" /> 注:server.pem同樣時,SSLCertificateKeyFile能夠不用寫
在官方找到一個表格詳細說明了這三種方式的區別:
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
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生效
優化系統最忌諱的就是隻調優不測試,有時不適當的優化反而會讓性能更低。以上全部的優化方法都要在本地進行性能測試事後再不斷調整參數,這樣最終才能達到最佳的優化效果。
補充Bio、Nio、Apr模式的測試結果:
對於這幾種模式,我用ab命令模擬1000併發測試10000詞,測試結果比較意外,爲了確認結果,我每種方式反覆測試了10屢次,而且在兩個服務器上都測試了一遍。結果發現Bio和Nio性能差異很是微弱,難怪默認竟然仍是Bio。可是採用apr,鏈接創建的速度會有50%~100%的提高。直接調用操做系統層果真神速啊,這裏強烈推薦apr方式!