可伸縮的網絡編程(Scalable Network Programming)中最重點的幾個因素在Linux2.4,NetBSD 1.6.1,Linux2.6,FreeBSD 5.1,OpenBSD3.4下的對比:
(1).fork()進程時的延時:Linux2.6比FreeBSD 5.1性能更好,這兩個系統在fork新進程時的延時時間不會隨着進程數目的增大而有所變化。
(2).靜態聯接時的fork與動態聯接時fork的比較:靜態鏈接性能有顯著提高。Linux 2.6 static>FreeBsd 5.1 static > Linux 2.6 dynamic>FreeBSD 5.1 dynamic.
(3).進程調試比較:Linux每10ms中斷一次當前進程,Alpha系統上是1ms中斷一次。Linux 2.6的進度調度器是O(1).
(4).進程與線程:fork是慢的,可以用thread代替。在Linux 2.6中的測試結果,400個左右的連接後fork()的性能要超過pthread_create()的性能。IBM對Linux做過優化後,一個進程可以處理10萬個連接。fork()在每一個連接時都fork()一次成本太高,多線程在於線程安全(thread-safe)與死鎖(deadlock),以及內存泄露問題這些問題都要考慮。
(5).內存消耗:Apache2的worker模型是一個比較好的方案,多線程(multithread)避免了內存消耗,多進程(multyprocess),解決了單一進程文件描述符上限的問題。
(6).超時(time-out)問題:使用select,其缺點是有打開文件描述符的限制。使用poll,根據linux與freebsd的測試表明,基本於fork的web server比poll更好。sun os中使用/dev/poll,linux中使用epoll。FreeBSD中使用kqueue.kqueue比epoll性能相當。
(7).其它高延時因素1:POSIX規定每當新打開一個文件,內核必須使用最小,未被使用的描述符。這顯然是達不到O(1)的。Linux使用的是位向量。Linux與BSD在這點上相比“還算是”scales well的。
(8).其它高延時因素2:客戶端應用與proxy代理服務器在由內核選擇使用端口號時都有相同的問題。在Linux與FreeBSD上這點還可以算是scales well的。
(9).磁盤呑吐量(disk throughput):這也是一個主要必須面對的問題之一。一般磁盤在順序讀寫時是很快的,但是在移動磁頭進行seek時,就會很慢了。
(10).sendfile:避免了將文件數據copy到用戶空間,然後再copy回內核空間傳遞給write,即其中多了兩種不必要的copy操作。現在的gigabit的以太網卡都能支持scatter-gather I/O,也就是從kernel buffer取得packet header,而packet content從buffer cache中取得(csum_partial_copy_from_user)。這就是所謂的Zero Copy TCP,這是其終極目標。Linux與FreeBSD支持sendfile。
(11).內存映射I/O(Memory Mapped I/O),使用內存映射文件避免了buffer的copy.mmap系統調用性能最好是Linux 2.6,再次是Linux 2.4,FreeBSD 5.1最差。隨着mmap頁面數目的增加,從mmap新頁面中讀取性能最好的是FreeBSD 5.1其次是Linux 2.6/2.4。
(12).文件系統延時(filesystem latency),處理同一個目錄下大量文件使用XFS,reiserfs這樣的文件系統比較好。
(13).異步IO(AIO-Async I/O),AIO僅對文件有意義,而不是socket。例如,如果希望從一個巨大的數據庫裏讀取1000個塊,使用lseek和read來完成,那就意味着讓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),以及FreeBSD的sendfile.
(15).fork VS vfork:fork並不做真正的內容複製,而僅僅是複製表。於是linux與bsd都提供了vfork。在linux 2.6上測試靜態鏈接glibc表明vfork比fork慢,250ms vs 320ms.
結論:linux 2.6是一個很優秀的系統,在所有的benchmark中都達到O(1)的水準。FreeBSD 6.1其次,除了mmap外,都是O(1)。