一.C10K的問題
C10K的問題在上個世紀90年代就被提出來了。大概的意思是當用戶數超過1萬時,很多設計不良好的網絡服務程序性能都將急劇下降、甚至癱瘓。並且,這個問題並不能通過升級硬件設備解決,是操作系統固有的問題,也就是說,如果你的服務器最高能支撐1000個並發,儘管你升級了計算能力高一倍的 cpu,內存再翻一番,硬盤轉速在快一倍,也無法支撐2000個並發。
經典的網絡編程模型有4個:
1. Serve one client with each thread/process, and use blocking I/O。
即對每個客戶都使用不同的線程或進程進行服務,在每個線程或進程中使用阻塞I/O。這是小程序和java常用的策略,對於交互式的應用也是常見的選擇,這種策略很能難滿足高性能程序的需求,好處是實現極其簡單,容易實現複雜的交互邏輯。我們常用的Apache、ftpd等都是這種工作。
2. Serve many clients with single thread, and use nonblocking I/O and readiness notification。
即對所有的客戶使用單一一個線程或進程進行服務,在這個線程或進程裡,採用異步IO的策略。這是經典模型,優點在於實現較簡單,方便移植,也能提供足夠的性能;缺點在於無法充分利用多CPU的資源。
3. Serve many clients with each thread, and use nonblocking I/O and readiness notification
對經典模型2的簡單改進,仍然採用異步IO的策略,但對所有的客戶使用多個線程或進程進行服務。缺點是容易在多線程並發上出bug,甚至某些OS不支持多線程進行readiness notification
4. Serve many clients with each thread, and use asynchronous I/O
在有AI/O支持的OS上,能提供相當高的性能。不過AI/O編程模型和經典模型差別相當大,基本上很難寫出一個框架同時支持AI/O和經典模型。這個模型主要是用於window平台上。
在linux上開發高性能的網絡應用,只能選著第2、3種方式。考慮到複雜性,我們往往只採用第2種。下面就討論一下第二種模型。
閱讀全文...