1. 程式人生 > >高併發WEB伺服器設計

高併發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. 陳碩