可伸縮的網絡編程(Scalable Network Programming)

可伸縮的網絡編程(Scalable Network Programming)中最重點的幾個因素在Linux2.4NetBSD 1.6.1Linux2.6FreeBSD 5.1OpenBSD3.4下的對比:

(1).fork()進程時的延時:Linux2.6FreeBSD 5.1性能更好,這兩個系統在fork新進程時的延時時間不會隨着進程數目的增大而有所變化。

 

(2).靜態聯接時的fork與動態聯接時fork的比較:靜態鏈接性能有顯著提高。Linux 2.6 static>FreeBsd 5.1 static > Linux 2.6 dynamic>FreeBSD 5.1 dynamic.

 

(3).進程調試比較:Linux10ms中斷一次當前進程,Alpha系統上是1ms中斷一次。Linux 2.6的進度調度器是O(1).

 

(4).進程與線程:fork是慢的,可以用thread代替。在Linux 2.6中的測試結果,400個左右的連接後fork()的性能要超過pthread_create()的性能。IBMLinux做過優化後,一個進程可以處理10萬個連接。fork()在每一個連接時都fork()一次成本太高,多線程在於線程安全(thread-safe)與死鎖(deadlock),以及內存泄露問題這些問題都要考慮。

 

(5).內存消耗:Apache2worker模型是一個比較好的方案,多線程(multithread)避免了內存消耗,多進程(multyprocess),解決了單一進程文件描述符上限的問題。

 

(6).超時(time-out)問題:使用select,其缺點是有打開文件描述符的限制。使用poll,根據linuxfreebsd的測試表明,基本於forkweb serverpoll更好。sun os中使用/dev/polllinux中使用epollFreeBSD中使用kqueue.kqueueepoll性能相當。

 

(7).其它高延時因素1POSIX規定每當新打開一個文件,內核必須使用最小,未被使用的描述符。這顯然是達不到O(1)的。Linux使用的是位向量。LinuxBSD在這點上相比“還算是”scales well的。

 

(8).其它高延時因素2:客戶端應用與proxy代理服務器在由內核選擇使用端口號時都有相同的問題。在LinuxFreeBSD上這點還可以算是scales well的。

 

(9).磁盤呑吐量(disk throughput):這也是一個主要必須面對的問題之一。一般磁盤在順序讀寫時是很快的,但是在移動磁頭進行seek時,就會很慢了。

 

(10).sendfile:避免了將文件數據copy到用戶空間,然後再copy回內核空間傳遞給write,即其中多了兩種不必要的copy操作。現在的gigabit的以太網卡都能支持scatter-gather I/O,也就是從kernel buffer取得packet header,而packet contentbuffer cache中取得(csum_partial_copy_from_user)。這就是所謂的Zero Copy TCP,這是其終極目標。LinuxFreeBSD支持sendfile

 

(11).內存映射I/O(Memory Mapped I/O),使用內存映射文件避免了buffercopy.mmap系統調用性能最好是Linux 2.6,再次是Linux 2.4,FreeBSD 5.1最差。隨着mmap頁面數目的增加,從mmap新頁面中讀取性能最好的是FreeBSD 5.1其次是Linux 2.6/2.4

 

(12).文件系統延時(filesystem latency),處理同一個目錄下大量文件使用XFSreiserfs這樣的文件系統比較好。

(13).異步IO(AIO-Async I/O),AIO僅對文件有意義,而不是socket。例如,如果希望從一個巨大的數據庫裏讀取1000個塊,使用lseekread來完成,那就意味着讓OS通過指定的順序讀取文件,而不論這些塊是在disk上如何排列的。通過AIO,OS可以基於這些塊在disk上的排列重新調整順序,然後磁頭一次性讀取這些數目而無需來回移動那道。但是問題是,you have no idea which of the queued requests was finished when you get the signal.FreeBSD提供了AIO的功能。

 

(14).writev,TCP_CORK(Linux),TCP_NOPUSH(BSD),以及FreeBSDsendfile.

 

(15).fork VS vfork:fork並不做真正的內容複製,而僅僅是複製表。於是linuxbsd都提供了vfork。在linux 2.6上測試靜態鏈接glibc表明vforkfork慢,250ms vs 320ms.

 

結論:linux 2.6是一個很優秀的系統,在所有的benchmark中都達到O(1)的水準。FreeBSD 6.1其次,除了mmap外,都是O(1)

詳細文檔參考:http://bulk.fefe.de/scalable-networking.pdf

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章