隨著硬件技術(shù)的飛速發(fā)展,當前單臺PC 服務(wù)器的性能得到了顯著提升,反之,硬件成本卻在快速下降。另一方面,多數(shù)門戶網(wǎng)站、大型社區(qū)在建設(shè)WEB服務(wù)、郵件服務(wù)等網(wǎng)絡(luò)服務(wù)時,仍然傾向于通過簡單地擴充并行服務(wù)器數(shù)量、存儲子系統(tǒng)來支持用戶請求,而沒有考慮深入挖掘服務(wù)器本身的性能潛力!即使單臺硬件成本足夠的低廉,數(shù)量巨大的基礎(chǔ)硬件及其維護費用對任何企業(yè)而言仍然是一項沉重的負擔!
如果能夠在滿足大量用戶請求的同時,通過盡量提升服務(wù)器的整體性能,從而減少服務(wù)器的保有量,也同時減少了設(shè)備維護費用,企業(yè)是不是可以得到更大的收益呢?答案是肯定的!
就筆者看來,對于需要支持百萬級用戶并發(fā)訪問的WEB 服務(wù)而言,確實沒有必要采用多臺服務(wù)器,單單一臺普通的PC服務(wù)器就可以勝任! 個人認為當前許多WEB業(yè)務(wù)應(yīng)用都是對硬件投資的極大浪費!為什么這樣說呢?第一,當前PC服務(wù)器多數(shù)帶多個獨立的CPU,而且每個CPU還帶多個硬核,而許多WEB應(yīng)用服務(wù)器、數(shù)據(jù)庫服務(wù)器軟件根本就沒有對多核處理器進行支持和優(yōu)化,基本上是一個CPU在工作,其它都在休息,沒能充分發(fā)揮多CPU的能力;第二,雖然服務(wù)器安裝有高性能網(wǎng)卡,但是所采用的操作系統(tǒng)沒有對網(wǎng)絡(luò)吞吐進行優(yōu)化,無法支持巨大的網(wǎng)絡(luò)IO請求,沒能發(fā)揮出高性能網(wǎng)卡的優(yōu)勢;第三、服務(wù)器一般都支持4G或以上更大的內(nèi)存,而且在x86平臺下內(nèi)存條的價格就像大白菜,非常低廉。即使如此廉價豐富的內(nèi)存資源也沒有得到好好利用,多數(shù)應(yīng)用根本沒有考慮基于內(nèi)存的高速緩存方案,比如業(yè)務(wù)應(yīng)用中最常見的數(shù)據(jù)庫訪問操作,通常都是直接連接到數(shù)據(jù)庫進行SQL操作,其處理性能上不去是顯而易見的了;第四,應(yīng)用程序本身不夠優(yōu)化。不管存在何種原因,公認的一點是一個不優(yōu)化的業(yè)務(wù)應(yīng)用對系統(tǒng)整體性能表現(xiàn)有很大影響。高深的優(yōu)化技術(shù)我們不談,就舉兩個常見的優(yōu)化處理來說明,例子一,對于系統(tǒng)中保證唯一而且又不經(jīng)常變化的用戶ID,是否可以考慮不采用鏈表而采用MAP表存儲呢?后者比前者查詢快多了!;例子二,對于判斷一個表中是否存在某條記錄,通常使用這樣的SQL語句:“select * from xx_table where xx_id=xx”, 試問是否可以改成“select 1 from xx_table where xx_id=xx”?一字之差,在高頻度數(shù)據(jù)查詢過程中,后面的語句比前面的快很多呀。第五,一般服務(wù)器群前面都有一個或多個防火墻設(shè)備,用來進行包過濾和端口映射。如果服務(wù)器的自身安全性很強的話,這些防火墻設(shè)備也是可以被省略的。
基于上述理由,筆者及同事設(shè)計并實現(xiàn)了一款只需要單臺PC 服務(wù)器就可以支持百萬級用戶并發(fā)訪問的WEB服務(wù)器(硬件采用MS-9188主板,帶兩顆Intel(R) Xeon(R) E5410 CPU,每個CPU含4個核, 8G內(nèi)存, 320G SATA 硬盤, 板載8個Intel 82571EB 千兆網(wǎng)卡,一款非常普遍的PC服務(wù)器)。
現(xiàn)就我們的工作做一簡要介紹:
第一, 選用64位版本的Linux對稱多處理操作系統(tǒng),以便支持超過4G的內(nèi)存和多核心CPU。
第二,提高系統(tǒng)網(wǎng)絡(luò)IO性能。雖然Linux操作系統(tǒng)本身的網(wǎng)絡(luò)處理能力相對Windows系統(tǒng)表現(xiàn)更好,但要做到千兆級別的網(wǎng)絡(luò)吞吐還是力不從心。這一點可以通過Smartbits工具得到驗證。要支持百萬級的用戶請求,首先要考慮提高服務(wù)器的網(wǎng)絡(luò)吞吐能力!我們做過實驗,通過精簡內(nèi)核協(xié)議棧的方法是無法達到要求的,原因很簡單,網(wǎng)絡(luò)接收包和發(fā)送包的過程都必須經(jīng)歷多次內(nèi)核與用戶空間的拷貝,這嚴重占用CPU的處理時間。因此,我們設(shè)計采用“零拷貝”技術(shù),利用DMA機制和內(nèi)存映射技術(shù),實現(xiàn)網(wǎng)絡(luò)報文在內(nèi)核空間與用戶空間之間的快速傳遞,這個過程徹底解放了CPU,使得數(shù)據(jù)收發(fā)與業(yè)務(wù)處理可以并行進行。
第三,建立用戶空間TCP/IP協(xié)議棧,建立具有多級快速搜索能力的連接追蹤池,以滿足百萬級用戶并發(fā)訪問的要求。這是性能得以提升的關(guān)鍵所在。如果采用原始的 Linux操作系統(tǒng),單單打開百萬個文件描述符就是個耗時的操作!我們設(shè)計僅實現(xiàn)1~7層中必要的協(xié)議處理過程,去除原內(nèi)核中冗余的協(xié)議處理過程,實行 “精兵簡政”策略。整個協(xié)議處理過程采用CPU親和等手段實現(xiàn)多CPU、多核并行處理,提高多CPU的利用率。
第四,修改WEB應(yīng)用服務(wù)器軟件。設(shè)計采用開源的Apache服務(wù)器,在其基礎(chǔ)上增加了對“零拷貝”網(wǎng)絡(luò)IO的支持、用戶請求的多CPU并行處理支持、靜態(tài)頁面臨時文件系統(tǒng)存儲、內(nèi)存數(shù)據(jù)庫支持等技術(shù),充分利用“時間局部性原理和空間局部性原理”,顯著提升WEB服務(wù)器軟件的性能。
第五,提升服務(wù)器自身安全性。采用用戶態(tài)協(xié)議棧后,我們實現(xiàn)了對網(wǎng)絡(luò)報文的全面控制,自己解包自己打包,并加入對各種DDos攻擊的防御,而且有針對性地對包進行了內(nèi)容審查,其安全過濾標準遠高于單純的包過濾,完全做到了對業(yè)務(wù)內(nèi)容的過濾。這樣防火墻設(shè)備就顯得多余了,畢竟基于應(yīng)用軟件漏洞的入侵才是當前黑客攻擊的主要手段!而在這方面,包過濾防火墻基本上無所作為,反倒是一個網(wǎng)絡(luò)瓶頸!當然,如果防火墻作為負載均衡設(shè)備來使用又另當別論。
第六,基于具體的業(yè)務(wù)應(yīng)用進行優(yōu)化。我們對應(yīng)用系統(tǒng)的優(yōu)化主要從磁盤IO、數(shù)據(jù)庫訪問、業(yè)務(wù)算法等方面進行。一個精心優(yōu)化的業(yè)務(wù)系統(tǒng),其性能也會得到顯著提高。
由于我們采用了上述步驟,我們最終實現(xiàn)了利用一臺PC 服務(wù)器支持百萬WEB用戶并行訪問的要求。綜合來看,我們設(shè)計的思路主要是盡量提升系統(tǒng)潛能,通過采取多核并發(fā)、網(wǎng)絡(luò)吞吐優(yōu)化、業(yè)務(wù)系統(tǒng)優(yōu)化等手段,多管齊下來提升系統(tǒng)的整體性能,以求做到用好設(shè)備、用精設(shè)備的理念,最終達到在滿足用戶需求的前提下,減少設(shè)備投入,節(jié)約成本的目的。