摘要:文章研究了大型并發(fā)高負(fù)載網(wǎng)站的系統(tǒng)架構(gòu)及服務(wù)器優(yōu)化問題中的一些關(guān)鍵問題,具體包括服務(wù)器整體性能考慮、Socket優(yōu)化、硬盤級(jí)緩存等,對(duì)于這些問題,我們給出了相應(yīng)低成本的一些解決方案。
關(guān)鍵詞:大型網(wǎng)站架構(gòu);服務(wù)器優(yōu)化;高負(fù)載網(wǎng)站
中圖分類號(hào):TP315文獻(xiàn)標(biāo)識(shí)碼:A
文章編號(hào):1674-1145(2009)11-0143-02
一、概述
一個(gè)小型的網(wǎng)站,比如個(gè)人網(wǎng)站,可以使用最簡單的html靜態(tài)頁面就實(shí)現(xiàn)了,配合一些圖片達(dá)到美化效果,所有的頁面均存放在一個(gè)目錄下,這樣的網(wǎng)站對(duì)系統(tǒng)架構(gòu)、性能的要求都很簡單,隨著互聯(lián)網(wǎng)業(yè)務(wù)的不斷豐富,網(wǎng)站相關(guān)的技術(shù)經(jīng)過這些年的發(fā)展,已經(jīng)細(xì)分到很細(xì)的方方面面,尤其對(duì)于大型網(wǎng)站來說,所采用的技術(shù)更是涉及面非常廣,從硬件到軟件、編程語言、數(shù)據(jù)庫、WebServer、防火墻等各個(gè)領(lǐng)域都有了很高的要求,已經(jīng)不是原來簡單的html靜態(tài)網(wǎng)站所能比擬的。
大型網(wǎng)站,比如甘肅聯(lián)合大學(xué)網(wǎng)站。在面對(duì)大量用戶訪問、高并發(fā)請(qǐng)求方面,基本的解決方案集中在這樣幾個(gè)環(huán)節(jié):使用高性能的服務(wù)器、高性能的數(shù)據(jù)庫、高效率的編程語言、還有高性能的Web容器。但是除了這幾個(gè)方面,還沒法根本解決大型網(wǎng)站面臨的高負(fù)載和高并發(fā)問題。下面我們從小成本的角度考慮服務(wù)器優(yōu)化措施,本文重點(diǎn)考慮大型高并發(fā)高負(fù)載網(wǎng)站的系統(tǒng)架構(gòu)中的關(guān)鍵技術(shù)——服務(wù)器優(yōu)化。
二、服務(wù)器優(yōu)化
(一)服務(wù)器整體性能考慮
對(duì)于價(jià)值昂貴的服務(wù)器來說,怎樣配置才能發(fā)揮它的最大功效,又不至于影響正常的服務(wù),這是在設(shè)計(jì)網(wǎng)站架構(gòu)的時(shí)候必須要考慮的。常見的影響服務(wù)器的處理速度的因素有:網(wǎng)絡(luò)連接,硬盤讀寫,內(nèi)存空間,CPU速度。如果服務(wù)器的某一個(gè)部件滿負(fù)荷運(yùn)轉(zhuǎn)仍然低于需要,而其他部件仍有能力剩余,我們將之稱為性能瓶頸。服務(wù)器想要發(fā)揮最大的功效,關(guān)鍵的是消除瓶頸,讓所有的部件都被充分地利用起來。
(二)Socket優(yōu)化
以標(biāo)準(zhǔn)的GNU/Linux 為例。GNU/Linux 發(fā)行版試圖對(duì)各種部署情況都進(jìn)行優(yōu)化,這意味著對(duì)具體服務(wù)器的執(zhí)行環(huán)境來說,標(biāo)準(zhǔn)的發(fā)行版可能并不是最優(yōu)化的。GNU/Linux 提供了很多可調(diào)節(jié)的內(nèi)核參數(shù),可以使用這些參數(shù)為服務(wù)器進(jìn)行動(dòng)態(tài)配置,包括影響Socket 性能的一些重要的選項(xiàng)。這些選項(xiàng)包含在 /proc 虛擬文件系統(tǒng)中。這個(gè)文件系統(tǒng)中的每個(gè)文件都表示一個(gè)或多個(gè)參數(shù),它們可以通過cat 工具進(jìn)行讀取,或使用echo 命令進(jìn)行修改。
(三)硬盤級(jí)緩存
硬盤級(jí)別的緩存是指將需要?jiǎng)討B(tài)生成的內(nèi)容暫時(shí)緩存在硬盤上,在一個(gè)可接受的延遲時(shí)間范圍內(nèi),同樣的請(qǐng)求不再動(dòng)態(tài)生成,以達(dá)到節(jié)約系統(tǒng)資源,提高網(wǎng)站承受能力的目的。Linux環(huán)境下硬盤級(jí)緩存一般使用Squid。
Squid是一個(gè)高性能的代理緩存服務(wù)器。和一般的代理緩存軟件不同,Squid用一個(gè)單獨(dú)的、非模塊化的、I/O驅(qū)動(dòng)的進(jìn)程來處理所有的客戶端請(qǐng)求。它接受來自客戶端對(duì)目標(biāo)對(duì)象的請(qǐng)求并適當(dāng)?shù)靥幚磉@些請(qǐng)求。比如說,用戶通過瀏覽器想下載(即瀏覽)一個(gè)web頁面,瀏覽器請(qǐng)求Squid為它取得這個(gè)頁面。Squid隨之連接到頁面所在的原始服務(wù)器并向服務(wù)器發(fā)出取得該頁面的請(qǐng)求。取得頁面后,Squid再將頁面返回給用戶端瀏覽器,并且同時(shí)在Squid本地緩存目錄里保存一份副本。當(dāng)下一次有用戶需要同一頁面時(shí),Squid可以簡單地從緩存中讀取它的副本,直接返回給用戶,而不用再次請(qǐng)求原始服務(wù)器。當(dāng)前的Squid可以處理HTTP,F(xiàn)TP,GOPHER,SSL和WAIS等協(xié)議。
Squid 運(yùn)行的時(shí)候,默認(rèn)會(huì)在硬盤上建兩層hash目錄,用來存儲(chǔ)緩存的Object。它還會(huì)在內(nèi)存中建立一個(gè)Hash Table,用來記錄硬盤中Object分布的情況。如果Squid配置成為一個(gè)Squid集群中的一個(gè)的話,它還會(huì)建立一個(gè)Digest Table(摘要表),用來存儲(chǔ)其他Squid 上的Object摘要。當(dāng)用戶端想要的資料本地硬盤上沒有時(shí),可以很快地知道應(yīng)該去集群中的哪一臺(tái)機(jī)器獲得。在硬盤空間快要達(dá)到配置限額的時(shí)候,可以配置使用某種策略(默認(rèn)使用LRU:Least Recently Used最近最少用)刪除一些Object,從而騰出空間。
默認(rèn)配置的Squid,沒有經(jīng)過任何優(yōu)化的時(shí)候,一般可以達(dá)到50% 的命中率。如果需要,還可以通過參數(shù)優(yōu)化,拆分業(yè)務(wù),優(yōu)化文件系統(tǒng)等辦法,使得Squid達(dá)到90% 以上的緩存命中率。Squid處理TCP連接消耗的服務(wù)器資源比真正的HTTP服務(wù)器要小得多,當(dāng)Squid分擔(dān)了大部分連接,網(wǎng)站的承壓能力就大大增強(qiáng)了。
(四)內(nèi)存級(jí)緩存
內(nèi)存級(jí)別的緩存是指將需要?jiǎng)討B(tài)生成的內(nèi)容暫時(shí)緩存在內(nèi)存里,在一個(gè)可接受的延遲時(shí)間范圍內(nèi),同樣的請(qǐng)求不再動(dòng)態(tài)生成,而是直接從內(nèi)存中讀取。Linux環(huán)境下內(nèi)存級(jí)緩存Memcached是一個(gè)不錯(cuò)的選擇。
(五)CPU與IO均衡
在一個(gè)網(wǎng)站提供的所有功能中,有的功能可能需要消耗大量的服務(wù)器端IO資源,像下載,視頻播放等,而有的功能則可能需要消耗大量的服務(wù)器CPU資源,像視頻格式轉(zhuǎn)換,LOG統(tǒng)計(jì)等。在一個(gè)服務(wù)器集群中,當(dāng)我們發(fā)現(xiàn)某些機(jī)器上CPU和IO的利用率相差很大的時(shí)候,例如CPU負(fù)載很高而IO負(fù)責(zé)很低,我們可以考慮將該服務(wù)器上的某些耗CPU資源的進(jìn)程換成耗IO的進(jìn)程,以達(dá)到均衡的目的。均衡每一臺(tái)機(jī)器的CPU和IO消耗,不僅可以獲得更充分的服務(wù)器資源利用,而且還能夠支持暫時(shí)的過載,遇到突發(fā)事件,訪問流量劇增的時(shí)候,實(shí)現(xiàn)得體的性能下降(Graceful performance degradation),而不是立即崩潰。如果有必要,可以通過選擇文件系統(tǒng),以及修改文件系統(tǒng)的配置參數(shù)來達(dá)到對(duì)特定文件的讀或?qū)懙男首畲蠡?/p>
三、結(jié)語
本文對(duì)大型高并發(fā)高負(fù)載網(wǎng)站的服務(wù)器優(yōu)化進(jìn)行了詳細(xì)的研究。對(duì)于一個(gè)高并發(fā)高流量的網(wǎng)站來說,任何一個(gè)環(huán)節(jié)的瓶頸都會(huì)造成網(wǎng)站性能的下降,影響用戶體驗(yàn),進(jìn)而造成巨大的經(jīng)濟(jì)損失。大型網(wǎng)站的架構(gòu)是一個(gè)非常有挑戰(zhàn)性的工作,本文中,我們列舉了服務(wù)器部分優(yōu)化方案,然而更全面的考慮是需要的。因而,這個(gè)領(lǐng)域需要更多的研究。
參考文獻(xiàn)
[1]Erich Gamma,Richard Helm,Ralph Johnson,John Vlissides,李英軍等(譯).設(shè)計(jì)模式:可復(fù)用面向?qū)ο筌浖幕A(chǔ)[M].機(jī)械工業(yè)出版社,2004.
[2]Alan Shalloway,James R.Trott,徐言聲譯.設(shè)計(jì)模式解析[M].人民郵電出版社,2006.
[3]白金鵬,謝曉竹.WINDOWS NT通用網(wǎng)站架構(gòu)實(shí)例[M].國防工業(yè)出版社,2002.
作者簡介:趙中鋒(1979- ),男,甘肅白銀人,甘肅聯(lián)合大學(xué)國資與后勤管理處助工,研究方向:資產(chǎn)管理及設(shè)備管理。