青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

isware

驚群問題的思考

“據(jù)說”驚群問題已經(jīng)是一個很古老的問題了,并且在大多數(shù)系統(tǒng)中已經(jīng)得到有效解決,但對我來說,仍舊是一個比較新的概念,因此有必要記錄一下。

什么是驚群

        舉一個很簡單的例子,當(dāng)你往一群鴿子中間扔一塊食物,雖然最終只有一個鴿子搶到食物,但所有鴿子都會被驚動來爭奪,沒有搶到食物的鴿子只好回去繼續(xù)睡覺,等待下一塊食物到來。這樣,每扔一塊食物,都會驚動所有的鴿子,即為驚群。對于操作系統(tǒng)來說,多個進(jìn)程/線程在等待同一資源是,也會產(chǎn)生類似的效果,其結(jié)果就是每當(dāng)資源可用,所有的進(jìn)程/線程都來競爭資源,造成的后果:
1)系統(tǒng)對用戶進(jìn)程/線程頻繁的做無效的調(diào)度、上下文切換,系統(tǒng)系能大打折扣。
2)為了確保只有一個線程得到資源,用戶必須對資源操作進(jìn)行加鎖保護(hù),進(jìn)一步加大了系統(tǒng)開銷。

        最常見的例子就是對于socket描述符的accept操作,當(dāng)多個用戶進(jìn)程/線程監(jiān)聽在同一個端口上時,由于實(shí)際只可能accept一次,因此就會產(chǎn)生驚群現(xiàn)象,當(dāng)然前面已經(jīng)說過了,這個問題是一個古老的問題,新的操作系統(tǒng)內(nèi)核已經(jīng)解決了這一問題。

linux內(nèi)核解決驚群問題的方法

        對于一些已知的驚群問題,內(nèi)核開發(fā)者增加了一個“互斥等待”選項。一個互斥等待的行為與睡眠基本類似,主要的不同點(diǎn)在于:
        1)當(dāng)一個等待隊列入口有 WQ_FLAG_EXCLUSEVE 標(biāo)志置位, 它被添加到等待隊列的尾部. 沒有這個標(biāo)志的入口項, 相反, 添加到開始.
        2)當(dāng) wake_up 被在一個等待隊列上調(diào)用時, 它在喚醒第一個有 WQ_FLAG_EXCLUSIVE 標(biāo)志的進(jìn)程后停止。
        也就是說,對于互斥等待的行為,比如如對一個listen后的socket描述符,多線程阻塞accept時,系統(tǒng)內(nèi)核只會喚醒所有正在等待此時間的隊列的第一個,隊列中的其他人則繼續(xù)等待下一次事件的發(fā)生,這樣就避免的多個線程同時監(jiān)聽同一個socket描述符時的驚群問題。

根據(jù)以上背景信息,我們來比較一下常見的Server端設(shè)計方案。
方案1:listen后,啟動多個線程(進(jìn)程),對此socket進(jìn)行監(jiān)聽(僅阻塞accept方式不驚群)。
方案2:主線程負(fù)責(zé)監(jiān)聽,通過線程池方式處理連接。(通常的方法)
方案3:主線程負(fù)責(zé)監(jiān)聽,客戶端連接上來后由主線程分配實(shí)際的端口,客戶端根據(jù)此端口重新連接,然后處理數(shù)據(jù)。

先考慮客戶端單連接的情況
方案1:每當(dāng)有新的連接到來時,系統(tǒng)內(nèi)核會從隊列中以FIFO的方式選擇一個監(jiān)聽線程來服務(wù)此連接,因此可以充分發(fā)揮系統(tǒng)的系能并且多線程負(fù)載均衡。對于單連接的場景,這種方案無疑是非常優(yōu)越的。遺憾的是,對于select、epoll,內(nèi)核目前無法解決驚群問題。(nginx對于驚群問題的解決方法)
方案2:由于只有一個線程在監(jiān)聽,其瞬時的并發(fā)處理連接請求的能力必然不如多線程。同時,需要對線程池做調(diào)度管理,必然涉及資源共享訪問,相對于方案一來說管理成本要增加不少,代碼復(fù)雜度提高,性能也有所下降。
方案3:與方案2有不少類似的地方,其優(yōu)勢是不需要做線程調(diào)度。缺點(diǎn)是增加了主線程的負(fù)擔(dān),除了接收連接外還需要發(fā)送數(shù)據(jù),而且需要兩次連接,孰優(yōu)孰劣,有待測試。

再考慮客戶端多連接的情況:
對于數(shù)據(jù)傳輸類的應(yīng)用,為了充分利用帶寬,往往會開啟多個連接來傳輸數(shù)據(jù),連接之間的數(shù)據(jù)有相互依賴性,因此Server端要想很好的維護(hù)這種依賴性,把同一個客戶端的所有連接放在一個線程中處理是非常有必要的。
A、同一客戶端在一個線程中處理
方案1:如果沒有更底層的解決方案的話,Server則需要維護(hù)一個全局列表,來記錄當(dāng)前連接請求該由哪個線程處理。多線程需要同時競爭一個全局資源,似乎有些不妙。
方案2:主線程負(fù)責(zé)監(jiān)聽并分發(fā),因此與單連接相比沒有帶來額外的性能開銷。僅僅會造成主線程忙于更多的連接請求。
方案3:較單線程來說,主線程工作量沒有任何增加,由于多連接而造成的額外開銷由實(shí)際工作線程分擔(dān),因此對于這種場景,方案3似乎是最佳選擇。

B、同一客戶端在不同線程中處理
方案1:同樣需要競爭資源。
方案2:沒理由。
方案3:不可能。

另外:
(《UNIX網(wǎng)絡(luò)編程》第三版是在第30章)
讀《UNIX網(wǎng)絡(luò)編程》第二版的第一卷時,發(fā)現(xiàn)作者在第27章“客戶-服務(wù)器程序其它設(shè)計方法”中的27.6節(jié)“TCP預(yù)先派生子進(jìn)程服務(wù)器程序,accept無上鎖保護(hù)”中提到了一種由子進(jìn)程去競爭客戶端連接的設(shè)計方法,用偽碼描述如下:

服務(wù)器主進(jìn)程:

listen_fd = socket(...);
bind(listen_fd, ...);
listen(listen_fd, ...);
pre_fork_children(...);
close(listen_fd);
wait_children_die(...);


服務(wù)器服務(wù)子進(jìn)程:

while (1) {
conn_fd = accept(listen_fd, ...);
do_service(conn_fd, ...);
}


初 識上述代碼,真有眼前一亮的感覺,也正如作者所說,以上代碼確實(shí)很少見(反正我讀此書之前是確實(shí)沒見過)。作者真是構(gòu)思精巧,巧妙地繞過了常見的預(yù)先創(chuàng)建 子進(jìn)程的多進(jìn)程服務(wù)器當(dāng)主服務(wù)進(jìn)程接收到新的連接必須想辦法將這個連接傳遞給服務(wù)子進(jìn)程的“陷阱”,上述代碼通過共享的傾聽套接字,由子進(jìn)程主動地去向內(nèi) 核“索要”連接套接字,從而避免了用UNIX域套接字傳遞文件描述符的“淫技”。

不過,當(dāng)接著往下讀的時候,作者談到了“驚群” (Thundering herd)問題。所謂的“驚群”就是,當(dāng)很多進(jìn)程都阻塞在accept系統(tǒng)調(diào)用的時候,即使只有一個新的連接達(dá)到,內(nèi)核也會喚醒所有阻塞在accept上 的進(jìn)程,這將給系統(tǒng)帶來非常大的“震顫”,降低系統(tǒng)性能。

除了這個問題,accept還必須是原子操作。為此,作者在接下來的27.7節(jié)講述了加了互斥鎖的版本:

while (1) {
lock(...);
conn_fd = accept(listen_fd, ...);
unlock(...);
do_service(conn_fd, ...);
}


原 子操作的問題算是解決了,那么“驚群”呢?文中只是提到在Solaris系統(tǒng)上當(dāng)子進(jìn)程數(shù)由75變成90后,CPU時間顯著增加,并且作者認(rèn)為這是因?yàn)檫M(jìn) 程過多,導(dǎo)致內(nèi)存互換。對“驚群”問題回答地十分含糊。通過比較書中圖27.2的第4列和第7列的內(nèi)容,我們可以肯定“真兇”絕對不是“內(nèi)存對換”。

“元兇”到底是誰?

仔 細(xì)分析一下,加鎖真的有助于“驚群”問題么?不錯,確實(shí)在同一時間只有一個子進(jìn)程在調(diào)用accept,其它子進(jìn)程都阻塞在了lock語句,但是,當(dāng) accept返回并unlock之后呢?unlock肯定是要喚醒阻塞在這個鎖上的進(jìn)程的,不過誰都沒有規(guī)定是喚醒一個還是喚醒多個。所以,潛在的“驚 群”問題還是存在,只不過換了個地方,換了個形式。而造成Solaris性能驟降的“罪魁禍?zhǔn)?#8221;很有可能就是“驚群”問題。

崩潰了!這么說所有的鎖都有可能產(chǎn)生驚群問題了?

似乎真的是這樣,所以減少鎖的使用很重要。特別是在競爭比較激烈的地方。

作者在27.9節(jié)所實(shí)現(xiàn)的“傳遞文件描述符”版本的服務(wù)器就有效地克服了“驚群”問題,在現(xiàn)實(shí)的服務(wù)器實(shí)現(xiàn)中,最常用的也是此節(jié)所提到的基于“分配”形式。

把“競爭”換成“分配”是避免“驚群”問題的有效方法,但是也不要忽視“分配”的“均衡”問題,不然后果可能更加嚴(yán)重哦!

posted on 2011-07-20 12:44 艾斯維亞 閱讀(6465) 評論(2)  編輯 收藏 引用

Feedback

# re: 驚群問題的思考 2013-01-22 22:20 longzhiri

多個進(jìn)程都accept同一個socket,這和你之前說的多線程accept同一個socket一樣嗎?怎么被你說的新奇了。  回復(fù)  更多評論   

# re: 驚群問題的思考 2013-09-09 20:13 sunf

我想問一下,UNP中提到的方法,和你說的第一種方案好像沒差別?  回復(fù)  更多評論   


只有注冊用戶登錄后才能發(fā)表評論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            激情欧美丁香| 亚洲自拍高清| 久久乐国产精品| 亚洲伦理在线观看| 欧美成人免费全部观看天天性色| 亚洲男人的天堂在线aⅴ视频| 国产麻豆午夜三级精品| 欧美日韩国产成人| 久久久999| 亚洲天堂免费在线观看视频| 久久野战av| 欧美在线网址| 久久激情综合| 久久久国产91| 欧美a级大片| 欧美+日本+国产+在线a∨观看| 久久久最新网址| 久久久高清一区二区三区| 欧美一区二区黄| 亚洲三级免费电影| 一区二区三区无毛| 亚洲国产日韩美| 亚洲精品在线视频| 在线视频欧美日韩| 午夜电影亚洲| 久久视频在线看| 欧美激情欧美狂野欧美精品| 亚洲区一区二| 亚洲人屁股眼子交8| 在线看无码的免费网站| 永久域名在线精品| 日韩视频免费观看| 亚洲一区二区三区视频| 午夜精品剧场| 久久亚洲春色中文字幕| 欧美福利影院| 99视频精品| 欧美一区二区成人6969| 老司机凹凸av亚洲导航| 欧美激情视频一区二区三区不卡| 欧美视频国产精品| 久久在线观看视频| 欧美久久久久久蜜桃| 国产精品久久久久aaaa九色| 国产一区二区日韩精品| 99精品欧美一区二区三区综合在线| 欧美激情一区二区三级高清视频| 欧美欧美全黄| 国产一区观看| 亚洲视频碰碰| 麻豆精品视频在线| 一区二区久久久久久| 久久精品卡一| 欧美午夜激情视频| 亚洲日本视频| 久久黄金**| 亚洲日韩视频| 性久久久久久久久| 欧美精品一区二区三区在线看午夜 | 久久久国产精品一区| 亚洲欧洲视频在线| 亚洲电影中文字幕| 亚洲欧美综合国产精品一区| 欧美影院在线播放| 久久综合影视| 国产精品www| 一区二区激情小说| 亚洲国产成人一区| 午夜精品免费在线| 久久久在线视频| 亚洲午夜国产成人av电影男同| 久久躁日日躁aaaaxxxx| 国产日韩亚洲欧美| 性8sex亚洲区入口| 一区二区三区视频在线| 欧美精品一卡二卡| 亚洲毛片播放| 亚洲国产精品嫩草影院| 久久久综合精品| 国产综合香蕉五月婷在线| 亚洲欧美日产图| 一本久久a久久免费精品不卡| 久久综合久色欧美综合狠狠| 国内精品免费午夜毛片| 久久精品国产欧美亚洲人人爽| 亚洲一区二区三区四区视频| 欧美视频在线不卡| 在线视频亚洲欧美| 99亚洲视频| 国产精品久久二区| 亚洲欧美日韩久久精品| 中文久久乱码一区二区| 国产精品久久久久77777| 亚洲欧美日韩直播| 欧美与欧洲交xxxx免费观看| 好看的日韩视频| 免费不卡在线视频| 免费成人黄色av| 亚洲每日更新| 久久经典综合| 欧美主播一区二区三区| 在线观看一区二区精品视频| 欧美刺激午夜性久久久久久久| 能在线观看的日韩av| 一区二区三区四区五区精品视频| 一区二区三区 在线观看视| 久久av在线| 亚洲肉体裸体xxxx137| 亚洲欧洲精品一区二区三区不卡 | 亚洲在线中文字幕| 亚洲女女女同性video| 国产专区欧美精品| 亚洲第一毛片| 欧美亚男人的天堂| 久热精品视频在线免费观看 | 西西裸体人体做爰大胆久久久| 欧美激情aaaa| 欧美日韩综合网| 久久久综合免费视频| 欧美激情国产精品| 性欧美18~19sex高清播放| 久久久蜜臀国产一区二区| 日韩亚洲欧美一区二区三区| 亚洲欧美激情四射在线日 | 久久国产精品久久久久久| 久久免费国产| 亚洲视频欧洲视频| 浪潮色综合久久天堂| 亚洲午夜激情| 久久久久久久久久久久久久一区| 日韩视频一区二区三区在线播放免费观看| 中文亚洲免费| 亚洲精品欧洲| 久久久精品tv| 欧美一进一出视频| 欧美日韩不卡合集视频| 久久亚洲免费| 国产精品腿扒开做爽爽爽挤奶网站| 欧美成人精品一区二区三区| 国产精品久久久爽爽爽麻豆色哟哟| 欧美不卡视频一区| 国产日产欧美精品| 亚洲深夜福利网站| av成人福利| 女生裸体视频一区二区三区| 欧美中文在线视频| 欧美亚州一区二区三区| 亚洲国产精彩中文乱码av在线播放| 国产区亚洲区欧美区| 一区二区三区四区国产| 日韩午夜视频在线观看| 老司机久久99久久精品播放免费| 久久超碰97中文字幕| 国产精品激情偷乱一区二区∴| 亚洲精品乱码久久久久| 欧美福利电影网| 噜噜噜噜噜久久久久久91| 国产精品蜜臀在线观看| 夜夜精品视频| 亚洲性夜色噜噜噜7777| 欧美日韩国产在线看| 亚洲国产一区二区三区在线播| 亚洲国产欧美日韩| 久久男女视频| 欧美激情视频一区二区三区免费| 尤物精品国产第一福利三区| 久久av二区| 蜜臀av在线播放一区二区三区 | 欧美中文字幕| 国产丝袜一区二区三区| 亚洲欧美日韩综合国产aⅴ| 欧美一区国产二区| 国产亚洲激情视频在线| 久久久久久亚洲精品不卡4k岛国| 蜜桃av一区| 亚洲精品免费一二三区| 欧美高清在线精品一区| 日韩亚洲欧美成人一区| 亚洲欧美国产精品专区久久| 国产精品青草久久| 欧美在线视频播放| 欧美黑人在线观看| 一区二区欧美在线观看| 国产精品夜夜夜| 久久精品国产v日韩v亚洲| 亚洲风情亚aⅴ在线发布| 亚洲欧美日韩电影| 亚洲第一页在线| 欧美在线网址| 亚洲激情偷拍| 午夜在线一区| 亚洲国产一区二区三区在线播| 欧美激情一区二区| 欧美一二三视频| 亚洲激情校园春色| 久久国产天堂福利天堂| 亚洲精品免费在线播放| 国产情人节一区| 欧美调教视频| 欧美色综合网|