qileilove

          blog已經(jīng)轉(zhuǎn)移至github,大家請(qǐng)?jiān)L問 http://qaseven.github.io/

          優(yōu)化Linux下的內(nèi)核TCP參數(shù)以提高系統(tǒng)性能

           內(nèi)核的優(yōu)化跟服務(wù)器的優(yōu)化一樣,應(yīng)本著穩(wěn)定安全的原則。下面以64位的Centos5.5下的Squid服務(wù)器為例來(lái)說(shuō)明,待客戶端與服務(wù)器端建立TCP/IP連接后就會(huì)關(guān)閉SOCKET,服務(wù)器端連接的端口狀態(tài)也就變?yōu)門IME_WAIT了。那是不是所有執(zhí)行主動(dòng)關(guān)閉的SOCKET都會(huì)進(jìn)入TIME_WAIT狀態(tài)呢?有沒有什么情況使主動(dòng)關(guān)閉的SOCKET直接進(jìn)入CLOSED狀態(tài)呢?答案是主動(dòng)關(guān)閉的一方在發(fā)送最后一個(gè)ACK后就會(huì)進(jìn)入TIME_WAIT狀態(tài),并停留2MSL(Max Segment LifeTime)時(shí)間,這個(gè)是TCP/IP必不可少的,也就是“解決”不了的。

            TCP/IP的設(shè)計(jì)者如此設(shè)計(jì),主要原因有兩個(gè):

            防止上一次連接中的包迷路后重新出現(xiàn),影響新的連接(經(jīng)過(guò)2MSL時(shí)間后,上一次連接中所有重復(fù)的包都會(huì)消失)。

            為了可靠地關(guān)閉TCP連接。主動(dòng)關(guān)閉方發(fā)送的最后一個(gè)ACK(FIN)有可能會(huì)丟失,如果丟失,被動(dòng)方會(huì)重新發(fā)FIN,這時(shí)如果主動(dòng)方處于CLOSED狀態(tài),就會(huì)響應(yīng)RST而不是ACK。所以主動(dòng)方要處于TIME_WAIT狀態(tài),而不能是CLOSED狀態(tài)。另外,TIME_WAIT并不會(huì)占用很大的資源,除非受到攻擊。

            在Squid服務(wù)器中可輸入查看當(dāng)前連接統(tǒng)計(jì)數(shù)的命令,如下所示:

        1. netstat -n| awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'  
        2. LAST_ACK 14  
        3. SYN_RECV 348  
        4. ESTABLISHED 70  
        5. FIN_WAIT1 229  
        6. FIN_WAIT2 30  
        7. CLOSING 33  
        8. TIME_WAIT 18122
        9.   CLOSED:無(wú)連接是活動(dòng)的或正在進(jìn)行中的。

            LISTEN:服務(wù)器在等待進(jìn)入呼叫。

            SYN_RECV:一個(gè)連接請(qǐng)求已經(jīng)到達(dá),等待確認(rèn)。

            SYN_SENT:應(yīng)用已經(jīng)開始,打開一個(gè)連接。

            ESTABLISHED:正常數(shù)據(jù)傳輸狀態(tài)。

            FIN_WAIT1:應(yīng)用說(shuō)它已經(jīng)完成。

            FIN_WAIT2:另一邊已同意釋放。

            CLOSING:兩邊同時(shí)嘗試關(guān)閉。

            TIME_WAIT:另一邊已初始化一個(gè)釋放。

            LAST_ACK:等待所有分組死掉。

            也就是說(shuō),這條命令可以把當(dāng)前系統(tǒng)的網(wǎng)絡(luò)連接狀態(tài)分類匯總。

            在Linux下高并發(fā)的Squid服務(wù)器中,TCP TIME_WAIT套接字?jǐn)?shù)量經(jīng)常可達(dá)兩三萬(wàn),服務(wù)器很容易就會(huì)被拖死。不過(guò),我們可以通過(guò)修改Linux內(nèi)核參數(shù)來(lái)減少Squid服務(wù)器的TIME_WAIT套接字?jǐn)?shù)量,命令如下所示:

          vim /etc/sysctl.conf

            然后,增加以下參數(shù):

        10. net.ipv4.tcp_fin_timeout = 30 
        11. net.ipv4.tcp_keepalive_time = 1200 
        12. net.ipv4.tcp_syncookies = 1 
        13. net.ipv4.tcp_tw_reuse = 1 
        14. net.ipv4.tcp_tw_recycle = 1 
        15. net.ipv4.ip_local_port_range = 1024 65000  
        16. net.ipv4.tcp_max_syn_backlog = 8192 
        17. net.ipv4.tcp_max_tw_buckets = 5000



        18. 其中:

            net.ipv4.tcp_syncookies=1表示開啟SYN Cookies。當(dāng)出現(xiàn)SYN等待隊(duì)列溢出時(shí),啟用cookie來(lái)處理,可防范少量的SYN攻擊。默認(rèn)為0,表示關(guān)閉。

            net.ipv4.tcp_tw_reuse=1表示開啟重用。允許將TIME-WAIT套接字重新用于新的TCP連接。默認(rèn)為0,表示關(guān)閉。

            net.ipv4.tcp_tw_recycle=1表示開啟TCP連接中TIME-WAIT套接字的快速回收。默認(rèn)為0,表示關(guān)閉。

            net.ipv4.tcp_fin_timeout=30表示如果套接字由本端要求關(guān)閉,這個(gè)參數(shù)決定了它保持在FIN-WAIT-2狀態(tài)的時(shí)間。

            net.ipv4.tcp_keepalive_time=1200表示當(dāng)keepalive啟用時(shí),TCP發(fā)送keepalive消息的頻度。默認(rèn)是2小時(shí),這里改為20分鐘。

            net.ipv4.ip_local_port_range=1024 65000表示向外連接的端口范圍。默認(rèn)值很小:32768~61000,改為1024~65000。

            net.ipv4.tcp_max_syn_backlog=8192表示SYN隊(duì)列的長(zhǎng)度,默認(rèn)為1024,加大隊(duì)列長(zhǎng)度為8192,可以容納更多等待連接的網(wǎng)絡(luò)連接數(shù)。

            net.ipv4.tcp_max_tw_buckets=5000表示系統(tǒng)同時(shí)保持TIME_WAIT套接字的最大數(shù)量,如果超過(guò)這個(gè)數(shù)字,TIME_WAIT套接字將立刻被清除并打印警告信息。默認(rèn)為180000,改為5000。對(duì)于Apache、Nginx等服務(wù)器,前面介紹的幾個(gè)參數(shù)已經(jīng)可以很好地減少TIME_WAIT套接字?jǐn)?shù)量,但是對(duì)于Squid來(lái)說(shuō),效果卻不大。有了此參數(shù)就可以控制TIME_WAIT套接字的最大數(shù)量,避免Squid服務(wù)器被大量的TIME_WAIT套接字拖死。

            執(zhí)行以下命令使內(nèi)核配置立即生效:

          /sbin/sysctl -p

            如果是用于Apache或Nginx等的Web服務(wù)器,或Nginx的反向代理,則只需要更改以下幾項(xiàng)即可:

        19. net.ipv4.tcp_syncookies=1 
        20. net.ipv4.tcp_tw_reuse=1 
        21. net.ipv4.tcp_tw_recycle = 1 
        22. net.ipv4.ip_local_port_range = 1024 65000
        23.   執(zhí)行以下命令使內(nèi)核配置立即生效: /sbin/sysctl -p如果是郵件服務(wù)器,則建議內(nèi)核方案如下:

        24. net.ipv4.tcp_fin_timeout = 30 
        25. net.ipv4.tcp_keepalive_time = 300 
        26. net.ipv4.tcp_tw_reuse = 1 
        27. net.ipv4.tcp_tw_recycle = 1 
        28. net.ipv4.ip_local_port_range = 5000 65000  
        29. kernel.shmmax = 134217728
        30.   執(zhí)行以下命令使內(nèi)核配置立即生效: /sbin/sysctl -p當(dāng)然這些都只是最基本的更改,大家還可以根據(jù)自己的需求來(lái)更改內(nèi)核的設(shè)置,同樣也要本著穩(wěn)定的原則,如果服務(wù)器不穩(wěn)定的話,一切工作和努力都會(huì)白費(fèi)。如果以上優(yōu)化仍無(wú)法滿足你的要求,有可能你需要定制你的服務(wù)器內(nèi)核或升級(jí)服務(wù)器硬件。至于服務(wù)的配置優(yōu)化,超出了本章的內(nèi)容,大家可根據(jù)自己的需求有針對(duì)性地進(jìn)行更改。

          posted on 2011-12-08 14:30 順其自然EVO 閱讀(1146) 評(píng)論(0)  編輯  收藏


          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
          博客園   IT新聞   Chat2DB   C++博客   博問  
           
          <2011年12月>
          27282930123
          45678910
          11121314151617
          18192021222324
          25262728293031
          1234567

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 沁阳市| 榆社县| 讷河市| 巩留县| 绵阳市| 新建县| 建昌县| 彭阳县| 苍山县| 武安市| 江都市| 岗巴县| 密云县| 寿光市| 海南省| 武安市| 宜黄县| 荣昌县| 威信县| 玉屏| 彩票| 堆龙德庆县| 搜索| 巫山县| 滨海县| 吴桥县| 柯坪县| 东乡| 峨眉山市| 井研县| 遂平县| 曲松县| 新宁县| 邹城市| 偏关县| 台南市| 石门县| 万州区| 黑龙江省| 吉林省| 将乐县|