so true

          心懷未來,開創(chuàng)未來!
          隨筆 - 160, 文章 - 0, 評(píng)論 - 40, 引用 - 0

          導(dǎo)航

          <2012年6月>
          272829303112
          3456789
          10111213141516
          17181920212223
          24252627282930
          1234567

          常用鏈接

          留言簿(8)

          隨筆分類(157)

          隨筆檔案(158)

          牛人博客

          搜索

          •  

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          linux下高并發(fā)網(wǎng)絡(luò)應(yīng)用注意事項(xià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時(shí)間
          net.ipv4.tcp_max_tw_buckets=3000 #限制TIMEWAIT的數(shù)量
          net.ipv4.tcp_timestamps=1 #啟用TCP的時(shí)間戳選項(xiàng)
          net.ipv4.ip_local_port_range=1024 65000 #這表明將系統(tǒng)對(duì)本地端口范圍限制設(shè)置為1024~65000之間。請(qǐng)注意,本地端口范圍的最小值必須大于或等于1024;而端口范圍的最大值則應(yīng)小于或等 于65535
          然后執(zhí)行 /sbin/sysctl -p 讓參數(shù)生效。

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

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

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

          參考文章:
          http://hi.baidu.com/zzxap/blog/item/ab3f2aedbe6c3b5978f05587.html《Linux下突破限制實(shí)現(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對(duì)系統(tǒng)性能的影響》
          http://blog.csdn.net/kasagawa/article/details/6978890《TCP協(xié)議學(xué)習(xí)筆記》

          今天又遇到了CLOSE_WAIT的情況,google了一番,又對(duì)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個(gè)包),而終止連接需要發(fā)4個(gè)包(兩次FIN,兩次ACK),在終止的時(shí)候,調(diào)用close會(huì)觸發(fā)發(fā)送FIN包,通常我們說客戶端和服務(wù)器,但這都是相對(duì)而言的,更準(zhǔn)確的說法是“主動(dòng)關(guān)閉方”和“被動(dòng)關(guān)閉方”,主動(dòng)關(guān)閉方會(huì)出現(xiàn)TIME_WAIT(出現(xiàn)在對(duì)方也調(diào)用了close之后,在對(duì)方調(diào)用close之前是FIN_WAIT2狀態(tài)),被動(dòng)關(guān)閉方會(huì)出現(xiàn)CLOSE_WAIT(出現(xiàn)在收到對(duì)方關(guān)閉請(qǐng)求但自己又沒有調(diào)用close之前);主動(dòng)關(guān)閉方的TIME_WAIT的等待是正常的,tcp/ip協(xié)議就是這么設(shè)計(jì)的,可以通過調(diào)整機(jī)器的內(nèi)核參數(shù)來控制,被動(dòng)關(guān)閉方的CLOSE_WAIT的等待是應(yīng)用程序自己造成的,和系統(tǒng)沒有關(guān)系,通常是被動(dòng)關(guān)閉方?jīng)]有調(diào)用close導(dǎo)致的;TIME_WAIT出現(xiàn)后,需要等待2個(gè)MSL時(shí)間才會(huì)釋放socket,CLOSE_WAIT出現(xiàn)后需要等待一個(gè)keepalive的時(shí)間,關(guān)于keepalive的控制主要有3個(gè)參數(shù):net.ipv4.tcp_keepalive_intvl(每次探測(cè)間隔)、net.ipv4.tcp_keepalive_probes(探測(cè)次數(shù))、net.ipv4.tcp_keepalive_time(TCP鏈路上空閑多長時(shí)間開始發(fā)送keep_alive),tcp_keepalive_time默認(rèn)為2小時(shí),因此CLOSE_WAIT后最多有可能需要等待tcp_keepalive_time + tcp_keepalive_intvl * tcp_keepalive_probes;此外,不論是主動(dòng)方還是被動(dòng)方,只要程序退出(因?yàn)槌绦蛲顺鰰?huì)關(guān)閉所有打開的fd),則相當(dāng)于調(diào)用了close函數(shù),那么對(duì)于被動(dòng)方而言CLOSE_WAIT都會(huì)消失,對(duì)于主動(dòng)方而言,退出前保持的FIN_WAIT2或TIME_WAIT狀態(tài)繼續(xù)保留;如果雙方都主動(dòng)退出程序,那么誰先退出就相當(dāng)于是優(yōu)先調(diào)用了close的主動(dòng)方。

          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 閱讀(2021) 評(píng)論(0)  編輯  收藏 所屬分類: C&C++

          主站蜘蛛池模板: 湖北省| 溧水县| 三河市| 聊城市| 安远县| 梅河口市| 文水县| 青冈县| 泊头市| 奉节县| 蓝山县| 日喀则市| 京山县| 新晃| 凤阳县| 宜章县| 双桥区| 张家口市| 赤峰市| 焦作市| 瑞昌市| 阜宁县| 象州县| 阳东县| 本溪| 墨脱县| 清新县| 怀安县| 万荣县| 留坝县| 嘉峪关市| 闻喜县| 仁寿县| 炎陵县| 博兴县| 仁怀市| 呼玛县| 郸城县| 彭水| 济南市| 河源市|