首頁>Club>
每分鐘有2K使用者訪問,伺服器端處理請求選擇用多執行緒(每個使用者一個執行緒),還是用I/O複用?
1
回覆列表
  • 1 # 此生唯一

    選用多執行緒還是IO多路複用必須要看場景的!

    選擇select還是epoll也是需要看場景的!

    如果是短連線,伺服器使用執行緒池(多執行緒)處理完畢,馬上進行釋放,保證活躍的執行緒所需要的記憶體和CPU效率是在伺服器承受範圍之內,那麼多執行緒比IO多路複用效果要好,因為無論是select還是epoll都需要去額外的監聽,監聽到需要資料處理,才呼叫回撥函式,分配處理執行緒去執行,這段時間有效能和資源的消耗,這種情況無疑是多執行緒模型更有優勢!

    如果是長連線,因為連線長時間不釋放,服務端需要保持執行緒去維護連線,這時候所有空閒的連線都相當於一個阻塞的狀態,而且多執行緒需要的記憶體資源比較多,高併發的情況伺服器直接宕機了!而使用IO多路複用,用來維持連線的執行緒只有一個(或幾個),不會有多餘的記憶體開銷,這時候IO多路複用的優勢得以體現!

    如果確定選擇IO多路複用,又該選擇select/epoll哪種模型呢?

    首先來看下select和epoll的本質區別:都有一個監聽執行緒去監聽事件,但是select採取輪詢的方式,不管有多少連線過來都要一一輪詢,有通訊資料就處理,而epoll是把所有socket對應的檔案掛在紅黑樹上,而活躍的放在一張雙向連結串列中,只處理這個連結串列中的連線!如果有新的連線需要處理,從紅黑樹上塞到連結串列中進行處理!

    比如1000個連線中,只有十個有資料傳輸,select需要從1000箇中遍歷出這10個,然後進行處理,而epoll模型只需要從連結串列中取出來即可使用!

    由此可見,如果是少量連線,同時大量連線都是活躍的情況下,select可能稍微略勝一籌,但如果是大量連線,且活躍數佔比少的情況,epoll堪稱完美模型,在可預見的範圍中,epoll增加連線,效能幾乎不衰減!

    寫一個類似epoll的處理模型,會對以後的高併發,多執行緒處理大有助益,更多的技術分享,敬請關注。。。

  • 中秋節和大豐收的關聯?
  • 胖子怎樣才能健康減到正常體重?說說你的看法?