Linux上沒有真正的非同步,為什麼伺服器還是用Linux的多?

本菜鳥知道以下幾個事實,也許錯誤,還望前輩們指正:

  • Linux上沒有真正的非同步IO,即使是高效的epoll,也是由multiplex通知程序,有註冊的事件到來,這個時候應用層才調用相應的handleEvent處理。比如讀事件,調用read從緩存區中讀取。
  • Windows下有真正的非同步IO(IOCP),對應的模式是Proactor,可以做到真正的非同步,當事件通知到來,投遞的請求操作已經完成。因此,應用層在poll時,不會浪費時間等待,而導致阻塞了別的IO操作。
  • Linux上網路模型實際上只能用Reactor。即使是多線程,擁有多個Reactor,在一個線程中,如果正在處理某個Socket的事件,其他Socket相當於被掛起,有一定地延時。

有上面的已知事實,是不是說明Windows下的網路模型更為高效,為什麼伺服器還是多數採用Linux?


Linux上也是真正的非同步!

epoll和iocp只是實現方式不同而已,詳細參見 (網址已經失效,自行google吧。。。) 。

正是體現了兩個系統的不同哲學,

windows: 隱藏底層,你最好只待在應用層,系統能幫你多做盡量多做,告訴你結果,中間步驟你就不要操心了。

linux: 簡潔利落,原子操作,一次只做一件事情,做完馬上告訴你結果,下一步要做什麼你可以發新的指令。如果你確定自己在做什麼,底層也可以修改。

這兩者沒有好壞之分,性能區別也要看場景。


原本的問題其實是很簡單的:「網路模型是否高效「並不是伺服器操作系統選型的決定因素。當然伺服器操作系統的選型是一個要考慮非常多的決定,但從最核心的生態角度考慮,Linux 是大部分場景下當前最好的選擇。

通過對比測試Linux平台和Windows平台的網路性能來評價Proactor模型與Reactor模型誰更高效,甚至進一步得出Proactor模型有沒有必要實現的結論,這是非常不嚴謹的。兩個系統從內核到驅動實現都相差太遠,影響最終性能的因素太多。要做對比也應該是在同環境下的不同模型之間進行對比。而且Proactor模型相對Reactor模型除了理論上能有更好的性能外,我其實更看重Proactor模型介面設計上的簡單性和一致性。

遺憾的是,沒人知道Linux什麼時候會實現《Unix 網路編程》里定義的非同步模型。而從目前Linux AIO 相關api的糟糕實現來看,預計還有一段很長的路要走。希望Linux社區早日完成這個任務,這樣就能幹掉全平台網路庫(按Proactor設計介面)在Linux下醜陋,笨拙的模擬實現了。


首先,我用google搜索了一下iocp與epoll的性能對比,只找到這個對比測試(測試代碼為asio,為protractor模式,對iocp更加友好),結果顯示epoll與iocp性能差異很小

http://www.slideshare.net/sm9kr/iocp-vs-epoll-perfor

題主中第二點與第三點提出epoll處理某個socket事件時,其他的socket相當於被掛起,這樣貌似會影響性能。實質上iocp和epoll的區別在於把recv和send這兩個操作放到os層,其他方面並沒有大的區別,所有要做的事情都要做,總共算下來沒多大差別。

題主通過模型的分析認為「Windows下的網路模型更為高效」,放大了一些細小差別的影響,也缺乏實驗數據的支持

而實際應用中,epoll對比iocp是有優勢的

  • IOCP模型中,讀取數據操作,需要預先分配緩衝區,如果分配的緩衝區較小,會導致更多的系統調用,影響效率;如果分配的緩衝區大一些,會佔用過多的內存。epoll對應的reactor模型在這方面是可以按需分配,及時釋放,合理利用內存。

  • epoll的api比iocp簡潔很多,通常一個完整的的epoll示例代碼約100行,而iocp的約200行。

  • 另外從目前的伺服器來看,linux比windows穩定許多。


其實從純理論來說,iocp這種真正的非同步,確實要比epoll+nbio這種半吊子方案的性能要高那麼一點點。但是實際影響的因素太多了,所以這一點點的純理論的性能差別,能不能在實際的測試或運行中體現出來,也很難說。

而且,現在伺服器裡面,除了極少數類似proxy等io流量佔比很高的服務類型,其餘的大多數瓶頸都不在io上。所以,io模塊的性能哪怕真的高那麼一點點,其實總體而言,基本上也是沒有吸引力的。

而作為伺服器,windows有很多其它的麻煩。

例如說遠程管理,別人可以ssh上去的,win就得弄個遠程桌面,而且這遠程桌面好像最多才同時兩個人連?那要在現網部署個開發機或者測試機,多兩個人上去看看都不行了?

還有,sh下,如果用上了expect,一切都可以腳本化。而windows下的腳本?先不說那批處理多難用了(powershell也不見得好多少),很多軟體的控制,還未必有批處理介面的。沒有批處理,就只能用類似autoit之類的去做。自己動動手,試試看就知道expect比autoit之類的圖形化腳本要方便多少了。


從什麼時候開始, 非同步=高性能=好?

你自己對比過Windows和Linux的網路性能嗎?誰快?快多少?


Linux有非同步io,aio系列函數就是


信仰加成,微軟是打敗不了Linux的


Windows要錢



不過呢,真正的非同步IO是windows上的IOCP和FreeBSD上的kqueue。epoll還差一點點,不算完全的非同步。但是,Linux就是好,就兩個字 ------ 「開源」!世界範圍內,新點子、新想法、新實踐、新項目全都先在Linux上播種,Linux是計算機智慧的最優最佳試驗田!


proacter和reacter區別僅僅是回調的時機不一樣,如果好在糾結於平台的話實在是沒必要,java上這兩種模型都有實現,有意思的是,proacter模型就是基於reacter模型的。


並沒有人證明非同步就一定好。。linux代表一個生態。。


linux操作容易,且在修改伺服器某些東西比windows輕鬆,代碼簡明。。。況且linux很明顯比windows穩定很多。。。


有aio,雖然我沒用過。

另,Linux下的網路編程模型很多,

Unix Network Programming第一卷有詳細介紹。


windows的IOCP確實很高效,但windows貴,體積龐大不易虛擬化,太封閉沒有安全感,出問題難解決


windows的gui吃資源而且要錢啊,linux雖然目前沒有實現真正的async,但是我們搞非同步的目的不就是為了省錢么?總不能這裡省了,那裡吐出去了

而且嘛,可以實現某種意義上的非同步,用戶線程降下來就行了,至於os的線程,那是os的事


不存在用linux的多這個事情,實際上Windows,unix全家族和Linux家族按照w3techs的統計各佔三分之一左右。Windows花足了錢他的服務好啊,一個電話過去,工程師上門解決,運氣好還能來個單身的帥哥,不僅養眼,而且有助於解決公司大齡女青年單身問題。

不過這個統計各個媒體也是有偏差,w3cook說Windows只佔2%,而IDC則信誓旦旦的說Windows dominate Linux on server,這個說法他們肯定要負責,我幫他們說一遍不代表我有任何責任。其實這種統計沒啥意思,畢竟世界上很有可能有無數台伺服器根本不接觸外網並且跑的是excited操作系統。總體來看,互聯網行業用Linux的多一點,傳統行業Linux Windows Unix都有,大型機Unix占絕對優勢,超算Linux居多。


現在使用Windows的硬體已經白菜價了。OEM系統已經超過開源軟體的低價擴散,IOCP的優質廉價時代已經來臨。linux成本奇高的特性已經逐漸為人所認識。


無一例外,windows的伺服器需要的配置比較高,那麼價格也高了,還有系統也要錢。。。


推薦閱讀:

RHCE证书的含金量怎么样,这个证好不好考,考出来以后做关于Linux的哪方面工作,或者在公司能够做什么
利用一年的時間,利用空餘的每天兩個小時,怎麼可以熟練掌握,python,mysql,伺服器,Linux?
要想完全放棄 Windows 使用 Linux 需要多少勇氣?
Linux 中鍵粘貼和Ctrl+V粘貼的區別是什麼?
UNIX/Linux最偉大的技術是什麼?

TAG:微軟Microsoft | Linux | 伺服器 |