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