李寶林
(西華師范大學(xué) 四川 南充 637000)
隨著互聯(lián)網(wǎng)技術(shù)的飛速發(fā)展和用戶對服務(wù)質(zhì)量需求的提高,網(wǎng)站在性能方面的要求越來越高,如何較好的解決這一問題是本文的關(guān)鍵,文中從分析HTTP請求流入手,然后從前端和后端性能優(yōu)化技術(shù)分別進行詳細的分析和描述,并針對不同的情況給出了相應(yīng)的建議。
HTTP屬于TCP/IP模型中的應(yīng)用層協(xié)議,而兩個應(yīng)用程序(我們這里指的就是瀏覽器與服務(wù)器)之間要進行互相通信,首先得建立TCP連接,然后瀏覽器 才能向服務(wù)器發(fā)送請求信息,服務(wù)器在接受到請求信息后,返回相應(yīng)的應(yīng)答信息,瀏覽器接收到來自服務(wù)器的應(yīng)答信息后,對這些數(shù)據(jù)進行解釋執(zhí)行。詳情如圖1所示。
根據(jù)Http請求過程可知,當(dāng)用戶或搜索引擎向一個網(wǎng)站服務(wù)器發(fā)出網(wǎng)頁瀏覽請求時,該服務(wù)器首先將通過域名服務(wù)器(DNS)將域名轉(zhuǎn)換為網(wǎng)站的 IP地址,然后返回給客戶;緊接著打開一個該IP套接口連接,并記下通過該套接口的一個HTTP數(shù)據(jù)流;然后再從WEB服務(wù)器接收一個響應(yīng)請求的HTTP數(shù)據(jù)流。該數(shù)據(jù)流包含狀態(tài)碼,狀態(tài)碼的值由HTTP協(xié)議所決定。這里所說的 “HTTP數(shù)據(jù)流”信息也叫“頭信息(Header)”。頭信息中包括了日期,服務(wù)器類型,通常還會有一條“200 OK”信息。如果一切良好,那么網(wǎng)絡(luò)服務(wù)器就會將“200 OK”信息以及請求頁面發(fā)送出去。如果網(wǎng)站在這時候已經(jīng)建立了重定向,那么服務(wù)器就會在頭信息中包含一個“302 Moved Temporarily”或“301 Moved Permanent”之類的響應(yīng)信息。根據(jù)上述流程可知要做到網(wǎng)站的基本性能優(yōu)化,必須從前端和后端兩個方面優(yōu)化才能解決問題。
圖1 Http請求過程示意圖Fig.1 The schematic diagram of HTTP request process
1)前端負載均衡,通過DNS的負載均衡器可以把用戶的訪問均勻地分散在多個Web服務(wù)器上。這樣可以減少Web服務(wù)器的請求負載。根據(jù)http的請求是短作業(yè)的特點。故可以采用簡單的負載均衡器來完成這一功能。
2)減少前端鏈接數(shù),目前瀏覽器都是并發(fā)請求,一般的網(wǎng)站,特別是訪問量很大的網(wǎng)站,要求主頁包含盡量少的HTTP鏈接,頁面包含盡量少的HTTP請求。如何做到這一點,這就要求我們設(shè)計人員和程序編寫人員在寫程序是充分考慮到環(huán)節(jié)。另外就是走到減少網(wǎng)頁大小,增加帶寬。假設(shè)一個網(wǎng)站的首頁需要下載的總文件大小約在500 kB左右,如果你訪問過了,瀏覽器會幫你緩存很大一部分,再次訪問就只需下載幾十K的文件。而訪問量也大,節(jié)約的帶寬越多。
3)前端頁面盡量靜態(tài)化,盡量做到直接從內(nèi)存中把文件讀出來返回,這樣可以減少昂貴的磁盤I/O。
4)優(yōu)化查詢很多人查詢都是在查一樣的,完全可以用反向代理合并這些并發(fā)的相同的查詢。這樣的技術(shù)主要用查詢結(jié)果緩存來實現(xiàn),第一次查詢走數(shù)據(jù)庫獲得數(shù)據(jù),并把 數(shù)據(jù)放到緩存,后面的查詢統(tǒng)統(tǒng)直接訪問高速緩存。為每個查詢做Hash,使用NoSQL的技術(shù)可以完成這個優(yōu)化。
5)緩存問題:緩存可以用來緩存動態(tài)頁面,也可以用來緩存查詢的數(shù)據(jù)。緩存通常有那么幾個問題:1)緩存的更新。也叫緩存和數(shù)據(jù)庫的同步。有這么幾種方法,一是緩存time out,讓緩存失效,重查,二是,由后端通知更新,一量后端發(fā)生變化,通知前端更新。前者實現(xiàn)起來比較簡單,但實時性不高,后者實現(xiàn)起來比較復(fù)雜 ,但實時性高。2)把一些不活躍的數(shù)據(jù)換出內(nèi)存,比如采取一些相應(yīng)的FIFO、LRU、LFU換頁算法進行換頁。3)緩存的重建和持久化。緩存的持久化也嚴重的影響到網(wǎng)站的基本性能。
網(wǎng)站性能優(yōu)化僅僅靠前端優(yōu)化是不夠的,還需要后臺做大量的工作,比如數(shù)據(jù)的冗余、鏡像、分區(qū)和檢索等技術(shù)的處理。
1)數(shù)據(jù)冗余,如何對數(shù)據(jù)庫的數(shù)據(jù)冗余進行處理,盡量減少表之間的連接開銷,但也要主要到數(shù)據(jù)之間的開銷問題。比如部分場合采取NoSQL來處理數(shù)據(jù)。但這一切要根據(jù)不同的業(yè)務(wù)進行分析和處理。
2)數(shù)據(jù)鏡像,幾乎所有主流的數(shù)據(jù)庫都支持鏡像。數(shù)據(jù)庫的鏡像最大便利就是做負載均衡。把一臺數(shù)據(jù)庫的負載均分到多臺上,保證了數(shù)據(jù)一致性。同時也保證了高可用性,當(dāng)一臺服務(wù)器出現(xiàn)故障時,還可以在另一條服務(wù)器上運行。然而如何保證數(shù)據(jù)鏡像的數(shù)據(jù)一致性問題,必須采取一些相應(yīng)的手段,比如在單條數(shù)據(jù)上對進行數(shù)據(jù)分區(qū),如把某類數(shù)據(jù)均分到不同的服務(wù)器上,假設(shè)某類數(shù)據(jù)達10萬條,我們可以設(shè)置10臺服務(wù)器,每臺服務(wù)器上均攤1萬條,從而達到提高網(wǎng)站性能的效果。
3)數(shù)據(jù)分區(qū),數(shù)據(jù)鏡像對海量數(shù)據(jù)沒有好的解決辦法,而通常對于一個表中包含大量數(shù)據(jù)的情況下,采取數(shù)據(jù)分區(qū)的方式來進行處理。通常采取如下處理辦法:①對數(shù)據(jù)實行邏輯分類。比如按照時間維度、空間維度等進行處理,目的是把一張表拆成多張字表,這樣就可以達到分擔(dān)負載的目的。②把數(shù)據(jù)按字段分,按照用途進行劃分,把一張分成幾張表。③還可以根據(jù)需要對大的數(shù)據(jù)表進行平準(zhǔn)劃分,或者負載均衡。不同的方法有不同的優(yōu)缺點,具體情況具體對待。
4)后端系統(tǒng)負載均衡,對于訪問量較大的數(shù)據(jù),通常采用一個任務(wù)分配系統(tǒng)來監(jiān)控各個服務(wù)器的負載情況。比如服務(wù)器什么時候忙、CPU使用率高、磁盤I/O及內(nèi)存使用情況等因素都要進行綜合考慮,然后把這些信息要發(fā)送到任務(wù)分配器上,由任務(wù)分配器挑選一臺負載最小的服務(wù)器來處理。任務(wù)分配服務(wù)器上需要對任務(wù)隊列,不能丟任務(wù)啊,所以還需要持久化。并且可以以批量的方式把任務(wù)分配給計算服務(wù)器。
5)異步、throttle和 批量處理:異步、throttle(節(jié)流閥) 和批量處理都需要對并發(fā)請求數(shù)做隊列處理的。異步處理就是按照不同步的程序處理問題,異步處理與同步處理是對立的,而產(chǎn)生它們的是多線程或者多進程。異步處理的好處就是提高設(shè)備使用率;throttle技術(shù)是網(wǎng)絡(luò)流量的一種保護機制,其目的是防止系統(tǒng)流量過大。批量處理技術(shù),是把基本相同的請求批量處理。批量處理一般設(shè)置兩個閥值,作業(yè)量和timeout,當(dāng)滿足其中一個條件時就會提交處理。
網(wǎng)站性能優(yōu)化技術(shù)是一項細膩而又繁瑣的工作,如何才能讓網(wǎng)站達到最大的性能,必須從前端和后端兩個方面著手,在每個細節(jié)上都盡量做到精簡,優(yōu)化。然HTTP請求流在技術(shù)處理上還有很多未注意到的細節(jié),這就要求具體的操作人員在實際操作中進行相應(yīng)優(yōu)化??傊瑥那岸撕秃蠖藘蓚€方面入手,是對網(wǎng)站性能優(yōu)化必須采取的重要策略。
[1]Cardellini V,Casalicchio E,Colajanni M,et al.The state of the art in locally distributed Web-server systems[J].ACM Computing Surveys,2002,34(2):263-311.
[2]萬常選,鄧松,劉喜平,等.Web數(shù)據(jù)源選擇技術(shù)[J].軟件學(xué)報,2013,24(4):781-797.
WANG Chang-xuan,DENG Song,LIU Xi-ping,et al.Web data source selection technologies[J].Journal of Software,2013,24(4):781-797.
[3]周鵬,周海鷹,左德承,等.基于Spirent的Web應(yīng)用性能評測[J].計算機工程,2012,38(24):57-61.
ZHOU Peng,ZHOU Hai-ying,ZUO De-cheng,et al.Spirentbased Web application performance evaluation[J].Journal of Computer Engineer,2012,38(24):57-61.
[4]郝秀蕊,安 虹,李小強,等.流處理器的相變存儲器主存性能優(yōu)化[J].計算機工程,2011,37(24):251-253.
HAO Xiu-rui,AN Hong,LI Xiao-qiang,et al.Main memory performance optimization of phase change RAM in stream processor[J].Journal of Computer Enginee,2011,37 (24):251-253.
[5]馬曉軒,林學(xué)練.WEB服務(wù)性能優(yōu)化的研究[J].計算機工程與應(yīng)用,2005(8):19-22.
MA Xiao-xuan,LIN Xue-lian.Research on web services performance optimization[J].ComputerEngineering and Application,2005(8):19-22.
[6]劉磊,倪宏,嵇智輝,等.基于HTTP請求的ORM性能優(yōu)化研究[J].計算機工程,2009,35(8):38-39.
LIU Lei,NI Hong,JI Zhi-hui,et al.Research on ORM performance optimization based on HTTP request[J].Journal of Computer Enginee,2009,35(8):38-39.