從操作系統(tǒng)機制淺談服務器平臺的選擇
在做一個系統(tǒng)分析及方案架構選擇時,很多人常會說我選擇Linux作為服務器是當然,為什么當然呢?為什么不選擇windows server呢?我試著從簡單個人的角度去理解描述它。個人淺見,拋磚引玉一下。
先從網(wǎng)上抄點市場數(shù)據(jù)吧(未經(jīng)證實),當然這些數(shù)據(jù)最終形成,不一定完全是純技術的原因,更多是商業(yè)市場方面的原因,說簡單點就是出于利益等原因,但我們做過簡單的用戶,我們只能接受適應,當然,有時還能發(fā)發(fā)牢騷。
Linux誕生,開發(fā),發(fā)展于網(wǎng)絡,所以對網(wǎng)絡應用的支持度是與生俱來的,集群,分布式都是他(如果算上Unix)率先實現(xiàn)支持的,在服務器OS占有量超過75%,國際TOP500的服務器91.8%使用Linux系的操作系統(tǒng)。Windows發(fā)跡于個人桌面系統(tǒng),真正的Server始于2000,系統(tǒng)消耗的性能比較大(其實大不了多少,隨著技術發(fā)展,微軟開始在server上做了更多的努力,現(xiàn)在額外性能消耗已沒有以前多了,呵呵),安全性方面也差于Linux(部分原因是由于windows黑客數(shù)量多,所以不能過于冤枉它,呵呵)。
一、從性能調優(yōu)方來考慮:
對高并發(fā)及海量數(shù)據(jù)的服務平臺,性能都是不斷優(yōu)化調整出來的。而不是什么的高超的架構設計就能一步到位的。
- Linux:遠遠勝出,因為linux是方便調優(yōu)的,方便定制,可以完全針對機器的配置設置優(yōu)化,也可針對你所要創(chuàng)建的服務特點來優(yōu)化。
- Windows:首先內(nèi)在支持消耗一定的資源比如在Windows下,gui是在內(nèi)核態(tài)運行的(參見Windows Internals)你是無法不要它的,呵呵,其實是對于常用的系統(tǒng)操作的支持而提供過多,不容易調整的功能及模塊。當然如果你是微軟的高級的開發(fā)人員,你完全可以做到非常到全的系統(tǒng)調優(yōu),但可惜的,這些人都不在你的公司,同時你從人力資源市場上批量獲得此類人才的可能性為零。
二、IO
我們這里不討論一般的IO模型,我們只討論一些操作系統(tǒng)中面向高并發(fā)高吞吐量的所用的IO模型進行討論
Linux 的IO模型為:
1.select /poll
- 基本上就是輪詢機制來查看每個IO句柄有無讀寫數(shù)據(jù),不足很明顯:
- 1024句柄限制,當然有辦法進行調整。
- 用戶空間的輪詢機制消耗過多不必要的資源,消耗會隨著IO句柄的增加而增加,特別對長鏈接應用的負面影響是最大的。
2.epoll:
a.機制:
基于“偽”AIO(異步IO).當有讀寫狀態(tài)時,事件通知用戶級。以內(nèi)核態(tài)實現(xiàn),以達到高效及節(jié)省資源。
b.優(yōu)點:
- 支持一個進程打開大數(shù)目的socket描述符(FD)
- IO效率不隨FD數(shù)目增加而線性下降
- 使用mmap加速內(nèi)核與用戶空間的消息傳遞
- 內(nèi)核微調提供的優(yōu)化可能性及靈活性
3.本地IO角度
windows IO
1.Windows的高效模型Completion IO 完成端口
a.機制:
重疊IO支持:其實就是AIO(異步IO),說白話一點就是從內(nèi)核級別在有數(shù)據(jù)讀寫可能時通過回調函數(shù)或事件來通知用戶空間進行數(shù)據(jù)處理。
對線程進行管理:
操作返回的方式:一般操作完成后要通知程序進行后續(xù)處理。但寫操作可以不通知用戶,此時如果用戶寫操作不能馬上完成,寫操作的相關數(shù)據(jù)會被暫存到非交換緩沖區(qū)中,在操作完成的時候,系統(tǒng)會自動釋放緩沖區(qū),此時發(fā)起完寫操作,使用的內(nèi)存就可以釋放了。但如果占用非交換緩沖太多會使系統(tǒng)停止響應。
三、進程,線程:
這個不做詳細分析,太多關于這方面的資料:這里我們只關注幾點:
1.簡單機制:
Windows:提供進程與線程接口,基于線程進行調度,進程提供資源共享空間。
Linux:內(nèi)核只提供進程,線程只是用戶級別的封裝接口,以進程方式實現(xiàn)線程,只是一個主進程以子進程方式創(chuàng)建了線程這些子進程共享一些資源罷了。
2.對比:
windows下的進程資源消耗大于linux 的進程。
3.安全機制:
歷史上看linux用戶管理比windows嚴格,顯得更安全:)不過隨著windows server的發(fā)展,linux在這優(yōu)勢不再明顯,但是windows是流行的桌面系統(tǒng),用戶群體太大,產(chǎn)生hacker有更好的環(huán)境土壤呀,呵呵……
四,操作系統(tǒng)機制對服務的影響:
1.高并發(fā)角度:
其實從最新的技術發(fā)展動態(tài)來看,如果單純從技術性能機制上比,linux,windows沒有太大的差別,高并發(fā)一般取決于連接對資源的消耗方式。但是在其上方案的提供上,卻有差別。比如Nginx,Node.JS,Apache,Lighttpd,Tomcat, J2EE相關的AApplication Server這些高并發(fā)Web或應用服務器在windows平臺上,有的是不支持。有的是運行效率不高。同時相關的組件提供在linux平臺上有更多的支持。
2.高吞吐量角度:
從吞吐量上處理,基于操作系統(tǒng)可提供的最大化資源,基于各種IO的效率,包括網(wǎng)絡IO,本地文件的IO效率。
3.緩存角度:
緩存角度有很多方案及級別。我們先從最簡單非方案級別,從IO角度分個類進行簡單描述:
1.本地文件緩存。這個有很多方案,但如果你了解操作系統(tǒng)的VFS層之后,你會發(fā)現(xiàn),如果你對服務器業(yè)務承載的合理劃分,提高命中率以后。你可以不用任何緩存方案,利用操作系統(tǒng)的自已的文件機制,你就能處理本地文件緩存,效率一點也不比第三方方案差,當然,你如果處理復雜的文件緩存的話,你要考慮目錄的文件數(shù)限制,小文件處理等,你要選擇相應的第三方文件緩存方案。其實數(shù)據(jù)庫從其內(nèi)部訪問機制來看,如果數(shù)據(jù)庫文件大小小于等于可用內(nèi)存總量大小,文件系統(tǒng)的緩存機制同樣可以加速數(shù)據(jù)庫的速度,你會發(fā)現(xiàn)數(shù)據(jù)是越來越快速的運行,很奇怪是吧?這里我會在專門的系統(tǒng)方案中進行分析。
2.邏輯緩存:
這個從操作系統(tǒng)層面沒有太大區(qū)別,區(qū)別在于第三方軟件對linux的支持度遠大于windows平臺,沒有辦法,技術歷史文化原因起更大作用:)
五、開發(fā)及運維平臺方案的角度
windows平臺:
.net 它只是一個能與J2EE進行對等對比的企業(yè)解決方案平臺,因為針對高并發(fā),高吞吐量,海量數(shù)據(jù)的Web或其它服務應用來說,太多優(yōu)于.net解決方案。所以我們現(xiàn)在只針對。.net與J2EE進行對比。
這是因為經(jīng)過歷史檢驗的服務系統(tǒng)及平臺方案不在windows平臺上,現(xiàn)在使用范圍最廣的平臺方案,最新發(fā)展有影響力的平臺也不在windows及.net平臺上,多是基于linux平臺上混合語言及平臺的整合與集成。當然造成這個因素很復雜,涉及商業(yè)運營,成本,技術的歷名及文化。
1.從多系統(tǒng)整合,平臺延展性上講:
.net顯然無法要提并論 。選擇了.net你就選定了windows操作系統(tǒng),選定了硬范圍比如在CPU上, 因為windows目前基本上是支持Intel,比如一些高端服務器設備windows server就無法支持,這就不方便(只是不方便沒有說不可能:))方案集成以前大型機上的各種舊系統(tǒng),同時也無法利用一些大型機高的硬件性能,大型機上一些專門服務型操作系統(tǒng)的安全性。也選定了SQL_Server數(shù)據(jù)庫,在數(shù)據(jù)庫方面,.Net 在自身的Microsoft SQL Server 上也會比其他數(shù)據(jù)庫運行得好。J2EE是一套通用標準,有諸多公司,諸多方案進行支持,系統(tǒng)互聯(lián),還有一些舊的系統(tǒng)的整合, 這些都是.net無法相提并論的。詳細討論會在系統(tǒng)方案分析文章中進行討論。
2.系統(tǒng)成熟度:
J2EE 在1999 年形成了其成熟的架構,并且到今天已經(jīng)有相當成熟的經(jīng)過檢驗的企業(yè)應用系統(tǒng)。而.net發(fā)展還顯稚嫩。而且從微軟企業(yè)歷史可以看出微軟從來不是一個老牌的企業(yè)級解決方案的提供者。
3. 工程管理角度:
目前人力資源市場上的對企業(yè)解決方案人才,J2EE及以前各種Linux,Unix,服務平臺上的人才的積累是遠遠大于windows 操作系統(tǒng)及.net平臺的。這是快速發(fā)展的互聯(lián)網(wǎng)企業(yè)面臨的最大工程管理問題,同時如今這幾年在移動互聯(lián)網(wǎng)大潮下,基于linux,及類linux底層的移動設備的瘋狂發(fā)展(如Android,IOS),不僅服務端,移動客戶端的非windows人才與windows平臺的比例也不在同一水平線上。
六、軟件工程角度:
其實這個角度常常是最重要的方案選擇角度。
1.舊系統(tǒng)的整合,
2.多系統(tǒng)平臺的兼容,發(fā)展推動力量,新技術的快速應用。
3.專業(yè)人力資源的快速配置與獲?。?/p>
首先要考慮目前公司組織方面的人力資源的技術特點,如果系統(tǒng)主要是基于企業(yè)級系統(tǒng),而且多是熟悉基于windows平臺的開發(fā),那首先.net及windows server服務器。如果不是這樣的特定條件,最好選擇linux平臺上的其它穩(wěn)定匹配的方案或方案整合。
4.商業(yè)服務方面:
有人說windows雖然付費但提供強大技術支持,真的是這樣嗎?一般情況下,得到的支持是兩個字“重啟” ,我有一些朋友在微軟做開發(fā)或做技術支持,聊下來的結果是,對一些桌面應用的支持還算到位,當然里面包括最多的一臺詞就是“先重啟試試”,慢了要重啟,Crash了要重啟,不能用一些東西了,要重啟。 對于服務器支持而言多是感嘆,但在linux社區(qū)上你倒反而可以得到更多有建設性的幫助。當然這個角度純是個人戲說,人人有自己的感受。
----未完----