高併發WEB伺服器設計
目標:考慮設計一個高併發WEB伺服器框架,有哪些慣用的手法?希望在本篇文章給出一個標準答案。
關鍵詞: 迭代模型,併發模型,I/O多路複用,執行緒池,協程
參考:Apache/MySQL,Nginx,
待補充:Redis的執行緒模型
只有將一個連線的互動流程劃分地足夠細,才能做到高併發,這是一項細節的技術。
WEB伺服器步驟:
1. accept
2. read:又稱為recv
3. decode:反序列化
4. compute:並不一定是計算,也可能是讀寫檔案、讀寫資料庫等I/O操作。
5. encode:序列化
6. write:又稱為send
效能瓶頸:
1. read
2. compute
網路事件無非如下:
1. accept:新連線
2. read:連線可讀
3. 連線可寫
4. 連線斷開
WEB伺服器程式設計模型:
1. 迭代模型:序列;
2. 併發模型:Apache/MySQL模型;
3. 多路複用模型;
4. “多路複用+併發”模型:Nginx/Muduo模型;
慣用手法(簡稱“三板斧”):
1. 併發:開多個程序或執行緒,充分利用多核CPU的優勢;
2. 多路複用:讓核心告訴我們哪個連線可讀了,減少阻塞在讀socket上的時間,提高CPU的利用率;
3. 事件機制(即協程思想):這個名詞來自於Nginx,可以認為是多路複用的升級版,就是把其他可能阻塞的事件也放進多路複用裡,讓程序(或執行緒)一直處在忙碌狀態,更進一步地提高CPU的利用率。
各個模型的執行緒/程序模型:
1. 迭代模型:毫無疑問是單執行緒(程序);
2. 併發模型:多執行緒(程序),數量沒有上限,來多少個連線就開多少執行緒,導致CPU忙於上下文切換;
3. 多路複用模型:單執行緒(程序),沒有利用CPU多核的優點,浪費資源;
4. 併發+多路複用:固定數量的多執行緒,數量通常是根據CPU的核數進行推算,Nginx就是這樣做的。
【參考文獻】
1. Richard Stevens
2. 陳碩