淘寶技術(shù)分享 HTTP長連接200萬嘗試及調(diào)優(yōu)

對于一個server积锅,我們一般考慮他所能支撐的qps江耀,但有那么一種應(yīng)用屈张, 我們需要關(guān)注的是它能支撐的連接數(shù)個數(shù)擒权,而并非qps,當然qps也是我們需要考慮的性能點之一阁谆。這種應(yīng)用常見于消息推送系統(tǒng)碳抄,也稱為comet應(yīng)用,比 如聊天室或即時消息推送系統(tǒng)等笛厦。comet應(yīng)用具體可見我之前的介紹纳鼎,在此不多講。對于這類系統(tǒng),因為很多消息需要到產(chǎn)生時才推送給客戶端贱鄙,所以當沒有消 息產(chǎn)生時劝贸,就需要hold住客戶端的連接,這樣逗宁,當有大量的客戶端時映九,就需要hold住大量的連接,這種連接我們稱為長連接瞎颗。

首先件甥,我們分析一下,對于這類服務(wù)哼拔,需消耗的系統(tǒng)資源有:cpu引有、網(wǎng)絡(luò)、內(nèi)存倦逐。所以譬正,想讓系統(tǒng)性能達到最佳,我們先找到系統(tǒng)的瓶頸所在檬姥。這樣的長連 接曾我,往往我們是沒有數(shù)據(jù)發(fā)送的,所以也可以看作為非活動連接健民。對于系統(tǒng)來說抒巢,這種非活動連接,并不占用cpu與網(wǎng)絡(luò)資源秉犹,而僅僅占用系統(tǒng)的內(nèi)存而已蛉谜。所 以,我們假想崇堵,只要系統(tǒng)內(nèi)存足夠悦陋,系統(tǒng)就能夠支持我們想達到的連接數(shù),那么事實是否真的如此筑辨?如果真能這樣俺驶,內(nèi)核來維護這相當大的數(shù)據(jù)結(jié)構(gòu),也是一種考 驗棍辕。

要完成測試暮现,我們需要有一個服務(wù)端,還有大量的客戶端楚昭。所以需要服務(wù)端程序與客戶端程序栖袋。為達到目標,我的想法是這樣的:客戶端產(chǎn)生一個連接抚太,向服務(wù)端發(fā)起一個請求塘幅,服務(wù)端hold住該連接昔案,而不返回數(shù)據(jù)。

  1. 服務(wù)端的準備
    對于服務(wù)端电媳,由于之前的假想踏揣,我們需要一臺大內(nèi)存的服務(wù)器,用于部署Nginx的comet應(yīng)用匾乓。下面是我用的服務(wù)端的情況:
Summary:        Dell R710, 2 x Xeon E5520 2.27GHz, 23.5GB / 24GB 1333MHz  
System:         Dell PowerEdge R710 (Dell 0VWN1R)  
Processors:     2 x Xeon E5520 2.27GHz 5860MHz FSB (16 cores)  
Memory:         23.5GB / 24GB 1333MHz == 6 x 4GB, 12 x empty  
Disk-Control:   megaraid_sas0: Dell/LSILogic PERC 6/i, Package 6.2.0-0013, FW 1.22.02-0612,  
Network:        eth0 (bnx2):Broadcom NetXtreme II BCM5709 Gigabit Ethernet,1000Mb/s  
OS:             RHEL Server 5.4 (Tikanga), Linux 2.6.18-164.el5 x86_64, 64-bit  

服務(wù)端程序很簡單捞稿,基于nginx寫的一個comet模塊,該模塊接受用戶的請求拼缝,然后保持用戶的連接娱局,而不返回。Nginx的status模塊咧七,可直接用于監(jiān)控最大連接數(shù)衰齐。
服務(wù)端還需要調(diào)整一下系統(tǒng)的參數(shù),在/etc/sysctl.conf中:

net.core.somaxconn = 2048  
net.core.rmem_default = 262144  
net.core.wmem_default = 262144  
net.core.rmem_max = 16777216  
net.core.wmem_max = 16777216  
net.ipv4.tcp_rmem = 4096 4096 16777216  
net.ipv4.tcp_wmem = 4096 4096 16777216  
net.ipv4.tcp_mem = 786432 2097152 3145728  
net.ipv4.tcp_max_syn_backlog = 16384  
net.core.netdev_max_backlog = 20000  
net.ipv4.tcp_fin_timeout = 15  
net.ipv4.tcp_max_syn_backlog = 16384  
net.ipv4.tcp_tw_reuse = 1  
net.ipv4.tcp_tw_recycle = 1  
net.ipv4.tcp_max_orphans = 131072  

/sbin/sysctl -p 生效

這里继阻,我們主要看這幾項:

net.ipv4.tcp_rmem用來配置讀緩沖的大小娇斩,三個值,第一個是這個讀緩沖的最小值穴翩,第三個是最大值,中間的是默認值锦积。我們可以在程序中修改讀緩沖的大小芒帕,但是不能超過最小與最大。為了使每個socket所使用的內(nèi)存數(shù)最小丰介,我這里設(shè)置默認值為4096背蟆。

net.ipv4.tcp_wmem用來配置寫緩沖的大小。

讀緩沖與寫緩沖在大小哮幢,直接影響到socket在內(nèi)核中內(nèi)存的占用带膀。

而net.ipv4.tcp_mem則是配置tcp的內(nèi)存大小,其單位是頁橙垢,而不是字節(jié)垛叨。當超過第二個值時,TCP進入 pressure模式柜某,此時TCP嘗試穩(wěn)定其內(nèi)存的使用嗽元,當小于第一個值時,就退出pressure模式喂击。當內(nèi)存占用超過第三個值時剂癌,TCP就拒絕分配 socket了,查看dmesg翰绊,會打出很多的日志“TCP: too many of orphaned sockets”佩谷。

另外net.ipv4.tcp_max_orphans這個值也要設(shè)置一下旁壮,這個值表示系統(tǒng)所能處理不屬于任何進程的 socket數(shù)量,當我們需要快速建立大量連接時谐檀,就需要關(guān)注下這個值了抡谐。當不屬于任何進程的socket的數(shù)量大于這個值時,dmesg就會看 到”too many of orphaned sockets”稚补。

另外童叠,服務(wù)端需要打開大量的文件描述符,比如200萬個课幕,但我們設(shè)置最大文件描述符限制時厦坛,會遇到一些問題,我們在后面詳細講解乍惊。

  1. 客戶端的準備
    由于我們需要構(gòu)建大量的客戶端杜秸,而我們知道,在一臺系統(tǒng)上润绎,連接到一個服務(wù)時的本地端口是有限的撬碟。由于端口是16位整數(shù),也就只能是0到 65535莉撇,而0到1023是預(yù)留端口呢蛤,所以能分配的只是1024到65534,也就是64511個棍郎。也就是說其障,一臺機器只能創(chuàng)建六萬多個長連接。要達到 我們的兩百萬連接涂佃,需要大概34臺客戶端励翼。

當然,我們可以采用虛擬ip的方式來實現(xiàn)這么多客戶端辜荠,如果是虛擬ip汽抚,則每個ip可以綁定六萬多個端口,34個虛擬ip就可以搞定伯病。而我這里呢造烁,正好申請到了公司的資源,所以就采用實體機來做了午笛。

由于系統(tǒng)默認參數(shù)膨蛮,自動分配的端口數(shù)有限,是從32768到61000季研,所以我們需要更改客戶端/etc/sysctl.conf的參數(shù):

net.ipv4.ip_local_port_range = 1024 65535  

/sbin/sysctl -p 

客戶端程序是基于libevent寫的一個測試程序敞葛,不斷的建立新的連接請求。

  1. 由于客戶端與服務(wù)端需要建立大量的socket与涡,所以我們需要調(diào)速一下最大文件描述符惹谐。
    客戶端持偏,需要創(chuàng)建六萬多個socket,我設(shè)置最大為十萬好了氨肌,的在/etc/security/limits.conf中添加:
admin    soft    nofile  100000  
admin    hard    nofile  100000  

服務(wù)端鸿秆,需要創(chuàng)建200萬連接,那我想設(shè)置nofile為200萬怎囚,好卿叽,問題來了。

當我設(shè)置nofile為200萬時恳守,系統(tǒng)直接無法登陸了考婴。嘗試幾次,發(fā)現(xiàn)最大只能設(shè)置到100萬催烘。在查過源碼后沥阱,才知道,原來在2.6.25內(nèi)核之前有個 宏定義伊群,定義了這個值的最大值考杉,為1024*1024,正好是100萬舰始,而在2.6.25內(nèi)核及其之后崇棠,這個值是可以通過/proc/sys/fs /nr_open來設(shè)置。于是我升級內(nèi)核到2.6.32丸卷。

升級內(nèi)核后枕稀,繼續(xù)我們的調(diào)優(yōu),如下:

sudo bash -c 'echo 2000000 > /proc/sys/fs/nr_open'
現(xiàn)在再設(shè)置nofile就可以了:

admin    soft    nofile  2000000  
admin    hard    nofile  2000000 

最后及老,在測試的過程中,根據(jù)dmesg的系統(tǒng)打出的信息不斷調(diào)整服務(wù)端/sbin/sysctl中的配置范抓,最后我們的測試完成了200萬的長連接骄恶。

為了使內(nèi)存占用盡量減少,我將Nginx的request_pool_size從默認的4k改成1k了匕垫。另外僧鲁,net.ipv4.tcp_wmem與net.ipv4.tcp_rmem中的默認值也設(shè)置成4k。

兩百萬連接時象泵,通過nginx的監(jiān)控得到數(shù)據(jù):

Paste_Image.png

兩百萬連接時系統(tǒng)內(nèi)存情況:

Paste_Image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末寞秃,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子偶惠,更是在濱河造成了極大的恐慌春寿,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件忽孽,死亡現(xiàn)場離奇詭異绑改,居然都是意外死亡谢床,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進店門厘线,熙熙樓的掌柜王于貴愁眉苦臉地迎上來识腿,“玉大人,你說我怎么就攤上這事造壮《伤希” “怎么了?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵耳璧,是天一觀的道長成箫。 經(jīng)常有香客問我,道長楞抡,這世上最難降的妖魔是什么伟众? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮召廷,結(jié)果婚禮上凳厢,老公的妹妹穿的比我還像新娘。我一直安慰自己竞慢,他們只是感情好先紫,可當我...
    茶點故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著筹煮,像睡著了一般遮精。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上败潦,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天本冲,我揣著相機與錄音,去河邊找鬼劫扒。 笑死檬洞,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的沟饥。 我是一名探鬼主播添怔,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼贤旷!你這毒婦竟也來了广料?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤幼驶,失蹤者是張志新(化名)和其女友劉穎艾杏,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體盅藻,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡糜颠,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年汹族,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片其兴。...
    茶點故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡顶瞒,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出元旬,到底是詐尸還是另有隱情榴徐,我是刑警寧澤,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布匀归,位于F島的核電站坑资,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏穆端。R本人自食惡果不足惜袱贮,卻給世界環(huán)境...
    茶點故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望体啰。 院中可真熱鬧攒巍,春花似錦、人聲如沸荒勇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽沽翔。三九已至兢孝,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間仅偎,已是汗流浹背跨蟹。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留橘沥,地道東北人窗轩。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像威恼,于是被迫代替她去往敵國和親品姓。 傳聞我的和親對象是個殘疾皇子寝并,可洞房花燭夜當晚...
    茶點故事閱讀 45,033評論 2 355

推薦閱讀更多精彩內(nèi)容