您好,登錄后才能下訂單哦!
近期,發現WEB服務器netstat -nap時,超多TIME_WAIT 狀態的連接,每臺WEB超過 2萬,峰值超4萬;導致服務響應變慢 ;
WEB服務器跑的是PHP程序,這些程序需要調用后端的MemCache,mysql,Redis,mongodb以及后端的 http接口服務,其中MemCache、http接口服務的調用量相對較大;
根據BAIDU的結果,分析原因為,PHP為CGI方式,一個頁面請求可能會有幾十次的各種內部調用,程序執行完后,連接就斷開了,根據網絡協議,斷開的連接必然會保持一段時間的TIME_WAIT,默認是保持4分鐘;如果4分鐘內的請求數過高,如超過3萬,本機的TCP端口數必然會不夠用(默認情況下,linux臨時端口號范圍是(32768,61000),本機可用于調用的端口約3萬個),進而導致調用后端服務阻塞,頁面響應變慢;
處理方式:根據以上分析,對OS系統內核參數做修改,啟用TIME_WAIT連接重用,TIME_WAIT連接回收、縮短連接保持時間、增加可用端口數:
#vi /etc/sysctl.conf
net.ipv4.tcp_tw_reuse = 1 #啟用連接重用
net.ipv4.tcp_tw_recycle = 1 #啟用連接回收
net.ipv4.tcp_fin_timeout = 30 #縮短連接保持時間
net.ipv4.ip_local_port_range=1024 65000 #增加可用端口數,linux默認臨時端口號范圍是(32768,61000)
#sysctl -p #修改參數生效;
注意:這里有個坑,需要確認 net.ipv4.tcp_timestamps = 1(這是默認值),net.ipv4.tcp_tw_recycle = 1 這個參數才有效;
另外,net.ipv4.tcp_tw_recycle = 1 這個參數如果是在對公網用戶提供的服務器,不能啟用,如果啟用,會導致其它問題;具體參考 (http://blog.sina.com.cn/s/blog_781b0c850100znjd.html)
修改以上參數后,連接數大為降低!!
總結:從以上分析看,主要是內部調用過多,而且又基本上是短連接,導致了大量的TIME_WAIT;
從應用設計上看,應該盡量采用長連接,連接池,KEEPALIVE等技術減少對后端的連接次數,提高連接的效率,這樣可以大大減少連接數,問題也就不存在了!
當然,本案例中,前端調用程序為PHP程序,因PHP本身的特性(CGI試,一個頁面處理完成后,所有相關連接就斷了),導致不太好使用長連接,連接池,KEEPALIVE技術;但仍可以在本頁面請求內部使用,也可以一定程度上減少連接次數;
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。