so true

          心懷未來,開創(chuàng)未來!
          隨筆 - 160, 文章 - 0, 評論 - 40, 引用 - 0
          數(shù)據(jù)加載中……

          linux下高并發(fā)網(wǎng)絡(luò)應(yīng)用注意事項

          vi /etc/sysctl.conf,加入以下內(nèi)容:
          net.ipv4.tcp_tw_reuse=1 #表示開啟重用。允許將TIME-WAIT sockets重新用于新的TCP連接,默認(rèn)為0,表示關(guān)閉
          net.ipv4.tcp_tw_recycle=1 #表示開啟TCP連接中TIME-WAIT sockets的快速回收,默認(rèn)為0,表示關(guān)閉
          net.ipv4.tcp_fin_timeout=30 #修改系統(tǒng)默認(rèn)的TIMEWAIT時間
          net.ipv4.tcp_max_tw_buckets=3000 #限制TIMEWAIT的數(shù)量
          net.ipv4.tcp_timestamps=1 #啟用TCP的時間戳選項
          net.ipv4.ip_local_port_range=1024 65000 #這表明將系統(tǒng)對本地端口范圍限制設(shè)置為1024~65000之間。請注意,本地端口范圍的最小值必須大于或等于1024;而端口范圍的最大值則應(yīng)小于或等 于65535
          然后執(zhí)行 /sbin/sysctl -p 讓參數(shù)生效。

          實驗的結(jié)論:
          1.主動連接情況下,TIME_WAIT對性能的影響很大
          2.net.ipv4.tcp_tw_reuse和tcp_tw_recycle都設(shè)置為0時,在本地端口耗盡后負(fù)載會很高
          3.net.ipv4.tcp_tw_reuse=1和net.ipv4.tcp_tw_recycle=1 配置生效的前提條件是:TCP連接的兩端都要啟用TCP的時間戳選項, net.ipv4.tcp_timestamps=1。
          4.net.ipv4.tcp_tw_reuse設(shè)置為1后,會降低本地端口耗盡出現(xiàn)的概率,從而降低負(fù)載
          5.net.ipv4.tcp_tw_recycle設(shè)置為1后,會加速TIME_WAIT的回收,從而顯著降低系統(tǒng)中TIME_WAIT狀態(tài)的socket數(shù)量
          6.對于主動連接較多的服務(wù)器建議通過調(diào)整sysctl的net.ipv4.ip_local_port_range來增大本地端口范圍,以進(jìn)一步降低端口耗盡出現(xiàn)的概率

          除此之外,對于高并發(fā)的網(wǎng)絡(luò)應(yīng)用,還應(yīng)注意以下一些點:
          1。ulimit -n #看一下一個進(jìn)程可以打開的文件句柄數(shù)目,如果要修改系統(tǒng)默認(rèn)的hard nofile閾值,需要按照以下步驟進(jìn)行:
          第一步,修改/etc/security/limits.conf文件,在文件中添加如下行:
          admin soft nofile 10240
          admin hard nofile 10240
          其中admin指定了要修改哪個用戶的打開文件數(shù)限制,可用'*'號表示修改所有用戶的限制;soft或hard指定要修改軟限制還是硬限制;10240 則指定了想要修改的新的限制值,即最大打開文件數(shù)(請注意軟限制值要小于或等于硬限制)。修改完后保存文件。

          第二步,修改/etc/pam.d/login文件,在文件中添加如下行:
          session required /lib/security/pam_limits.so
          這是告訴Linux在用戶完成系統(tǒng)登錄后,應(yīng)該調(diào)用pam_limits.so模塊來設(shè)置系統(tǒng)對該用戶可使用的各種資源數(shù)量的最大限制(包括用戶可打開的 最大文件數(shù)限制),而pam_limits.so模塊就會從/etc/security/limits.conf文件中讀取配置來設(shè)置這些限制值。修改完 后保存此文件。
          2。cat /proc/sys/fs/file-max #這表明這臺Linux系統(tǒng)最多允許同時打開(即包含所有用戶打開文件數(shù)總和)XXXX個文件,是Linux系統(tǒng)級硬限制,不夠時將其調(diào)大
          3。還有一種無法建立TCP連接的原因可能是因為Linux網(wǎng)絡(luò)內(nèi)核的IP_TABLE防火墻對最大跟蹤的TCP連接數(shù)有限制。此時程序會表現(xiàn)為在 connect()調(diào)用中阻塞,如同死機(jī),如果用tcpdump工具監(jiān)視網(wǎng)絡(luò),也會發(fā)現(xiàn)根本沒有TCP連接時客戶端發(fā)SYN包的網(wǎng)絡(luò)流量。由于 IP_TABLE防火墻在內(nèi)核中會對每個TCP連接的狀態(tài)進(jìn)行跟蹤,跟蹤信息將會放在位于內(nèi)核內(nèi)存中的conntrackdatabase中,這個數(shù)據(jù)庫 的大小有限,當(dāng)系統(tǒng)中存在過多的TCP連接時,數(shù)據(jù)庫容量不足,IP_TABLE無法為新的TCP連接建立跟蹤信息,于是表現(xiàn)為在connect()調(diào)用 中阻塞。此時就必須修改內(nèi)核對最大跟蹤的TCP連接數(shù)的限制,方法同修改內(nèi)核對本地端口號范圍的限制是類似的:在/etc/sysctl.conf中添加net.ipv4.ip_conntrack_max=10240

          參考文章:
          http://hi.baidu.com/zzxap/blog/item/ab3f2aedbe6c3b5978f05587.html《Linux下突破限制實現(xiàn)高并發(fā)量服務(wù)器》
          http://kerry.blog.51cto.com/172631/105233/《發(fā)現(xiàn)大量的TIME_WAIT解決辦法》
          http://wenku.baidu.com/view/dd18767c1711cc7931b71616.html《操作系統(tǒng)性能優(yōu)化<1> Linux下TIME_WAIT對系統(tǒng)性能的影響》
          http://blog.csdn.net/kasagawa/article/details/6978890《TCP協(xié)議學(xué)習(xí)筆記》

          今天又遇到了CLOSE_WAIT的情況,google了一番,又對TIME_WAIT和CLOSE_WAIT的理解深了一層,參考的幾篇文章如下:
          http://www.360doc.com/content/10/0414/16/1484_23029426.shtml
          http://pengtyao.iteye.com/blog/829513
          http://shootyou.iteye.com/blog/1129507
          http://blog.csdn.net/shootyou/article/details/6615051
          http://hi.baidu.com/tantea/blog/item/580b9d0218f981793812bb7b.html
          大致說一下我的一些新的理解:
          TCP建立連接需要3次握手(就是發(fā)3個包),而終止連接需要發(fā)4個包(兩次FIN,兩次ACK),在終止的時候,調(diào)用close會觸發(fā)發(fā)送FIN包,通常我們說客戶端和服務(wù)器,但這都是相對而言的,更準(zhǔn)確的說法是“主動關(guān)閉方”和“被動關(guān)閉方”,主動關(guān)閉方會出現(xiàn)TIME_WAIT(出現(xiàn)在對方也調(diào)用了close之后,在對方調(diào)用close之前是FIN_WAIT2狀態(tài)),被動關(guān)閉方會出現(xiàn)CLOSE_WAIT(出現(xiàn)在收到對方關(guān)閉請求但自己又沒有調(diào)用close之前);主動關(guān)閉方的TIME_WAIT的等待是正常的,tcp/ip協(xié)議就是這么設(shè)計的,可以通過調(diào)整機(jī)器的內(nèi)核參數(shù)來控制,被動關(guān)閉方的CLOSE_WAIT的等待是應(yīng)用程序自己造成的,和系統(tǒng)沒有關(guān)系,通常是被動關(guān)閉方?jīng)]有調(diào)用close導(dǎo)致的;TIME_WAIT出現(xiàn)后,需要等待2個MSL時間才會釋放socket,CLOSE_WAIT出現(xiàn)后需要等待一個keepalive的時間,關(guān)于keepalive的控制主要有3個參數(shù):net.ipv4.tcp_keepalive_intvl(每次探測間隔)、net.ipv4.tcp_keepalive_probes(探測次數(shù))、net.ipv4.tcp_keepalive_time(TCP鏈路上空閑多長時間開始發(fā)送keep_alive),tcp_keepalive_time默認(rèn)為2小時,因此CLOSE_WAIT后最多有可能需要等待tcp_keepalive_time + tcp_keepalive_intvl * tcp_keepalive_probes;此外,不論是主動方還是被動方,只要程序退出(因為程序退出會關(guān)閉所有打開的fd),則相當(dāng)于調(diào)用了close函數(shù),那么對于被動方而言CLOSE_WAIT都會消失,對于主動方而言,退出前保持的FIN_WAIT2或TIME_WAIT狀態(tài)繼續(xù)保留;如果雙方都主動退出程序,那么誰先退出就相當(dāng)于是優(yōu)先調(diào)用了close的主動方。

          https://www.byvoid.com/blog/http-keep-alive-header

          http://www.jellythink.com/archives/705
          http://www.jellythink.com/archives/705

          posted on 2012-06-11 15:35 so true 閱讀(2029) 評論(0)  編輯  收藏 所屬分類: C&C++

          主站蜘蛛池模板: 湘潭市| 若尔盖县| 海兴县| 穆棱市| 藁城市| 宕昌县| 都昌县| 府谷县| 沅陵县| 汾西县| 阿巴嘎旗| 唐海县| 梨树县| 利津县| 潮安县| 新丰县| 九江县| 绍兴县| 交口县| 玉树县| 通城县| 溧水县| 麦盖提县| 图木舒克市| 巩义市| 敖汉旗| 商南县| 龙江县| 鲜城| 无为县| 新平| 灌云县| 会东县| 阜平县| 进贤县| 上犹县| 湛江市| 桃源县| 得荣县| 临高县| 沐川县|