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