1.常用伺服器模型
a.疊代伺服器
隻有一個程序/線程處理請求
設計方法:
一般為單程序,加上select多路複用,非阻塞socket
b.疊代/并發混合型伺服器
平時疊代處理,對消耗大的請求并發處理
平時是疊代型的伺服器
處理請求時設定一個逾時,當請求的處理時間逾時時,建立一個程序/線程,把處理轉給新的程序/線程處理,主程序/線程繼續處理其他請求
c.并發伺服器
多個程序/線程并發處理請求
設計方法: 多程序,多線程
2.以上三類的伺服器比較
疊代伺服器:最簡單,性能不高
并發伺服器:性能較高,但結構相對比較複雜,開發難度中等
疊代/并發混合型伺服器:性能不錯,但結構通常比單純的并發伺服器更複雜
3.多程序的并發伺服器
a.每個連接配接fork一個程序
主程序accpet連接配接,有新連接配接到來時fork一個程序,然後繼續accept,等待新的連接配接
資料傳輸由子程序處理,處理完後子程序exit
每個子程序隻處理一個連接配接
b.Prefork程序,各個子程序競争accept
主程序預先fork一些程序
各個子程序競争accept,然後處理資料傳輸
一個子程序可以處理一個連接配接,也可以同時處理多個連接配接(通過select等)
驚群現象
c.Prefork程序,由父程序accept請求,通過流管道轉發fd到子程序
主程序accept,通過流管道轉發fd到子程序
子程序收到fd後,處理資料傳輸,處理結束後通知父程序
父程序處理的事情比較簡單,容易監控子程序
以上3種方式性能比較:
a.每個連接配接fork一個程序:處理smtp等狀态較多,資料量比較大時比較簡單實用,總體性能不大好
b.Prefork程序,各個子程序競争accept:比較簡單,性能不錯
c.Prefork程序,由父程序accept請求,通過流管道轉發fd到子程序:代碼複雜,性能一般不如上一種
4.多線程的并發伺服器
每個連接配接一個線程
Prethread多個線程,各個線程互斥accept
Prethread多個線程,主線程accept并分發連接配接給子線程
5.多程序與多線程的比較
使用線程的模型:性能比使用程序要高,但代碼比較複雜,對代碼品質要求更高
線程出錯後可能會影響到所有線程,多程序的模式一個程序出錯一般不會影響其他程序
多線程模型共享資料比較簡單有效,多程序模型共享資料比較麻煩,效率也不如線程
6.一些流行的網絡伺服器采用的模型
Sendmail: 采用多程序,每個連接配接fork一個程序.
每個連接配接fork一個子程序
子程序隻處理一個連接配接
子程序fork一個localmail程序(可以由使用者自己編寫),通過管道把資料轉給localmail處理,把郵件處理業務邏輯獨立出來
優點:結構簡單,不用維護複雜的狀态機
Apache1.3:采用多程序, prefork程序,各個子程序競争accept
Prefork一些子程序
子程序競争accept,每次隻處理一個連接配接
主程序不accept,根據負載情況調整子程序數量
子程序運作一段時間後,主程序會讓它退出,然後建立一個新的程序,防止記憶體洩漏等
主程序通過shared memory監控子程序
7.Tencent自己的一些網絡伺服器采用的模型
移動QQ: Prefork多個程序,競争accept,
典型的一問一答TCP伺服器,結構簡單
Prefork多個程序,競争accept
每個程序通過select可以同時處理多個連接配接
采用這種結構的原因有:
每秒請求<1000,可以滿足要求
結構簡單,容易開發、維護
sylar MAIL: [email protected]