I/O :
I/O Stack的流程(內核3.3版本的I/O Stack):
I/O Stack流圖分爲幾大部分:
1>.direct I/O 的O_Direct調用
2>.Page Cache;
3>.VFS,也即文件系統、網絡通信等
4>.Block I/O層
5>.I/O調度方式;
6>.SCSI處理層;
7>.磁盤硬件設備;
(來自thomas-krenn.com的圖片)
TCP/UDP:
UDP就不同了, 面向報文形式, 系統是不會緩衝的, 也不會做優化的, Send的時候, 就會直接Send到網絡上, 對方收不收到也不管, 所以這塊數據總是能夠能一包一包的形式接收到, 而不會出現前一個包跟後一個包都寫到緩衝然後一起Send.
C10K問題的最大特點是:設計不夠良好的程序,其性能和連接數及機器性能的關係往往 是非線性的。舉個例子:如果沒有考慮過C10K問題,一個經典的基於select的程序能在 舊服務器上很好處理1000併發的吞吐量,它在2倍性能新服務器上往往處理不了併發2000的吞吐量。 這是因爲在策略不當時,大量操作的消耗和當前連接數n成線性相關。會導致單個任務的資源消耗和當前連接數的關係會是O(n)。而服務程序需要同時對數以萬計的socket進 行I/O處理,積累下來的資源消耗會相當可觀,這顯然會導致系統吞吐量不能和機器性 能匹配。爲解決這個問題,必須改變對連接提供服務的策略。
主要有兩方面的策略:
1. Serve one client with each thread/process, and use blocking I/O 。Apache、ftpd等都是這種工作模式。
2. Serve many clients with single thread, and use nonblocking I/O and readiness notification 。優點在於實現較簡單,方便移植,也 能提供足夠的性能;缺點在於無法充分利用多CPU的機器。尤其是程序本身沒有複雜的 業務邏輯時。
3. Serve many clients with each thread, and use nonblocking I/O and readiness notification 對經典模型2的簡單改進,缺點是容易在多線程併發上出bug,甚至某些OS不支持多線程 操作readiness notification。
4. Serve many clients with each thread, and use asynchronous I/O 在有AI/O支持的OS上,能提供相當高的性能。不過AI/O編程模型和經典模型差別相當 大,基本上很難寫出一個框架同時支持AI/O和經典模型,降低了程序的可移植性。