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

isware

驚群問題的思考

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

什么是驚群

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

        最常見的例子就是對于socket描述符的accept操作,當多個用戶進程/線程監聽在同一個端口上時,由于實際只可能accept一次,因此就會產生驚群現象,當然前面已經說過了,這個問題是一個古老的問題,新的操作系統內核已經解決了這一問題。

linux內核解決驚群問題的方法

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

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

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

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

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

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

服務器主進程:

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


服務器服務子進程:

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


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

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

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

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


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

“元兇”到底是誰?

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

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

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

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

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

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

Feedback

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

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

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

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


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   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ⅴ| 亚洲狼人综合| 亚洲精品资源美女情侣酒店| 国产视频久久网| 韩国在线一区| 一本色道久久综合亚洲精品婷婷 | 国产喷白浆一区二区三区| 亚洲香蕉成视频在线观看| 国产精品一区二区三区乱码| 欧美经典一区二区三区| 欧美日韩高清在线一区| 国产精品久久久久久久久久免费看| 欧美日韩国产小视频在线观看| 欧美日韩在线播放一区| 国产精品中文在线| 亚洲国产天堂网精品网站| 99视频+国产日韩欧美| 亚洲永久精品大片| 欧美高清视频在线播放| 亚洲精品久久久久中文字幕欢迎你| 亚洲六月丁香色婷婷综合久久| 亚洲午夜电影网| 久久久精品国产99久久精品芒果| 免费成人你懂的| 国产欧美韩日| 一区二区三区国产精品| 久久蜜臀精品av| 一本色道久久99精品综合| 欧美专区一区二区三区| 欧美日韩免费高清| 亚洲福利视频网| 久久精品视频免费观看| 亚洲高清精品中出| 亚洲午夜精品网| 亚洲国产天堂久久综合| 欧美在线视频导航| 国产精品卡一卡二| 亚洲乱码精品一二三四区日韩在线 | 国产精品久久一级| 日韩视频一区二区在线观看 | 欧美第一黄网免费网站| 一卡二卡3卡四卡高清精品视频| 亚洲图中文字幕| 欧美激情亚洲国产| 亚洲精品激情| 免费观看一级特黄欧美大片| 一本久久综合亚洲鲁鲁五月天| 久久国产视频网| 国产欧美一区二区精品性| 亚洲精品美女免费| 欧美成人乱码一区二区三区| 一区二区日韩| 欧美日韩一区视频| 一本大道av伊人久久综合| 麻豆成人91精品二区三区| 亚洲一级黄色片| 乱中年女人伦av一区二区| 久久av老司机精品网站导航| 欧美国产精品一区| 久久亚洲精品视频| 影音先锋亚洲电影| 老司机免费视频一区二区三区| 亚洲欧美www| 国产日本欧洲亚洲| 久久国产精品久久久| 亚洲香蕉在线观看| 国产日韩专区| 蜜臀av性久久久久蜜臀aⅴ四虎| 新67194成人永久网站| 国产精品美女久久久久久2018 | 午夜精品福利电影| 午夜精品久久久久久久99樱桃| 国产精品扒开腿做爽爽爽视频| 一区二区三区视频在线看| 亚洲大胆人体视频| 欧美人与性动交cc0o| 一个色综合av| 亚洲伊人色欲综合网| 国产精品午夜在线观看| 欧美在线一二三| 老司机aⅴ在线精品导航| 亚洲欧洲精品一区二区三区波多野1战4| 欧美激情久久久| 国产精品久久久久9999吃药| 亚洲精品在线免费观看视频| 免费观看亚洲视频大全| 欧美高清hd18日本| 香蕉久久夜色精品国产| 久久精品男女| 亚洲视频在线播放| 欧美一区二区在线免费观看 | 久久久久五月天| 一本色道久久99精品综合 | 欧美激情精品久久久久久黑人| 女女同性女同一区二区三区91| 99亚洲精品| 欧美一区二区在线免费观看| 国产综合色在线视频区| 亚洲高清久久网| 国产精品欧美激情| 欧美黄色大片网站| 国产日韩欧美在线播放| 欧美刺激午夜性久久久久久久| 欧美日精品一区视频| 久久久久久电影| 国产精品视频专区| 亚洲高清一二三区| 激情成人中文字幕| 亚洲自拍高清| 在线视频精品| 欧美精品乱码久久久久久按摩| 欧美一区二区三区视频免费| 久久se精品一区二区| 亚洲视频在线播放| 亚洲免费av网站| 欧美精品久久久久久久免费观看 | 久久久精品性| 亚洲女同同性videoxma| 农夫在线精品视频免费观看| 这里只有精品电影| 欧美激情综合五月色丁香| 久久久久久久久久久久久9999| 欧美日韩一二三区| 亚洲国产一成人久久精品| 狠狠入ady亚洲精品经典电影| 一区二区三区免费看| 亚洲免费精品| 欧美日韩国产三级| 99精品福利视频| 亚洲天堂av电影| 欧美日韩一区视频| 国产精品99久久99久久久二8| 亚洲日韩欧美视频一区| 久久视频这里只有精品| 久久精品国产亚洲精品| 国产精品人成在线观看免费| 亚洲黄色天堂| 亚洲视频成人| 欧美三日本三级少妇三99| 亚洲日本aⅴ片在线观看香蕉| 在线播放精品| 狂野欧美激情性xxxx欧美| 蜜臀av国产精品久久久久| 国产在线成人| 久久一二三国产| 亚洲电影在线观看| 一区二区三区四区五区视频| 欧美a级片网| 一本综合久久| 亚洲女女女同性video| 国产精品视频免费在线观看| 亚洲日本理论电影| 性高湖久久久久久久久| 国产精品一区二区三区观看| 亚洲作爱视频| 久久精品亚洲一区| 欧美一级免费视频| 国产精品色在线| 午夜精品一区二区三区电影天堂| 亚洲午夜羞羞片| 欧美视频在线视频| 午夜一区二区三区不卡视频| 亚洲一区二区视频| 国产一区二区三区在线观看视频 | 国产精品一区二区三区成人| 亚洲日韩第九十九页| 亚洲精品影视| 国产精品久久久久国产精品日日| 亚洲手机成人高清视频| 欧美在线一二三| 亚洲精品国久久99热| 久久久免费av| 亚洲一二三区视频在线观看| 欧美一区=区| 午夜在线观看免费一区| 91久久精品一区二区别| 欧美精品啪啪| 欧美在线视频a| 亚洲国产精品久久91精品| 亚洲视频自拍偷拍| 一区二区视频在线观看| 欧美日韩福利在线观看| 亚洲欧美日韩国产精品| 欧美成人性生活| 小黄鸭精品aⅴ导航网站入口| 国产一区二区无遮挡| 欧美freesex8一10精品| 在线中文字幕一区| 国产一区三区三区| 国产精品国产精品| 欧美精品导航| 久久手机免费观看| 欧美专区在线观看| 亚洲一区二区三区四区五区黄| 美女黄毛**国产精品啪啪| 欧美亚洲一区二区三区|