李寶林
(西華師范大學(xué) 四川 南充 637000)
隨著互聯(lián)網(wǎng)技術(shù)的飛速發(fā)展和用戶(hù)對(duì)服務(wù)質(zhì)量需求的提高,網(wǎng)站在性能方面的要求越來(lái)越高,如何較好的解決這一問(wèn)題是本文的關(guān)鍵,文中從分析HTTP請(qǐng)求流入手,然后從前端和后端性能優(yōu)化技術(shù)分別進(jìn)行詳細(xì)的分析和描述,并針對(duì)不同的情況給出了相應(yīng)的建議。
HTTP屬于TCP/IP模型中的應(yīng)用層協(xié)議,而兩個(gè)應(yīng)用程序(我們這里指的就是瀏覽器與服務(wù)器)之間要進(jìn)行互相通信,首先得建立TCP連接,然后瀏覽器 才能向服務(wù)器發(fā)送請(qǐng)求信息,服務(wù)器在接受到請(qǐng)求信息后,返回相應(yīng)的應(yīng)答信息,瀏覽器接收到來(lái)自服務(wù)器的應(yīng)答信息后,對(duì)這些數(shù)據(jù)進(jìn)行解釋執(zhí)行。詳情如圖1所示。
根據(jù)Http請(qǐng)求過(guò)程可知,當(dāng)用戶(hù)或搜索引擎向一個(gè)網(wǎng)站服務(wù)器發(fā)出網(wǎng)頁(yè)瀏覽請(qǐng)求時(shí),該服務(wù)器首先將通過(guò)域名服務(wù)器(DNS)將域名轉(zhuǎn)換為網(wǎng)站的 IP地址,然后返回給客戶(hù);緊接著打開(kāi)一個(gè)該IP套接口連接,并記下通過(guò)該套接口的一個(gè)HTTP數(shù)據(jù)流;然后再?gòu)腤EB服務(wù)器接收一個(gè)響應(yīng)請(qǐng)求的HTTP數(shù)據(jù)流。該數(shù)據(jù)流包含狀態(tài)碼,狀態(tài)碼的值由HTTP協(xié)議所決定。這里所說(shuō)的 “HTTP數(shù)據(jù)流”信息也叫“頭信息(Header)”。頭信息中包括了日期,服務(wù)器類(lèi)型,通常還會(huì)有一條“200 OK”信息。如果一切良好,那么網(wǎng)絡(luò)服務(wù)器就會(huì)將“200 OK”信息以及請(qǐng)求頁(yè)面發(fā)送出去。如果網(wǎng)站在這時(shí)候已經(jīng)建立了重定向,那么服務(wù)器就會(huì)在頭信息中包含一個(gè)“302 Moved Temporarily”或“301 Moved Permanent”之類(lèi)的響應(yīng)信息。根據(jù)上述流程可知要做到網(wǎng)站的基本性能優(yōu)化,必須從前端和后端兩個(gè)方面優(yōu)化才能解決問(wèn)題。
圖1 Http請(qǐng)求過(guò)程示意圖Fig.1 The schematic diagram of HTTP request process
1)前端負(fù)載均衡,通過(guò)DNS的負(fù)載均衡器可以把用戶(hù)的訪問(wèn)均勻地分散在多個(gè)Web服務(wù)器上。這樣可以減少Web服務(wù)器的請(qǐng)求負(fù)載。根據(jù)http的請(qǐng)求是短作業(yè)的特點(diǎn)。故可以采用簡(jiǎn)單的負(fù)載均衡器來(lái)完成這一功能。
2)減少前端鏈接數(shù),目前瀏覽器都是并發(fā)請(qǐng)求,一般的網(wǎng)站,特別是訪問(wèn)量很大的網(wǎng)站,要求主頁(yè)包含盡量少的HTTP鏈接,頁(yè)面包含盡量少的HTTP請(qǐng)求。如何做到這一點(diǎn),這就要求我們?cè)O(shè)計(jì)人員和程序編寫(xiě)人員在寫(xiě)程序是充分考慮到環(huán)節(jié)。另外就是走到減少網(wǎng)頁(yè)大小,增加帶寬。假設(shè)一個(gè)網(wǎng)站的首頁(yè)需要下載的總文件大小約在500 kB左右,如果你訪問(wèn)過(guò)了,瀏覽器會(huì)幫你緩存很大一部分,再次訪問(wèn)就只需下載幾十K的文件。而訪問(wèn)量也大,節(jié)約的帶寬越多。
3)前端頁(yè)面盡量靜態(tài)化,盡量做到直接從內(nèi)存中把文件讀出來(lái)返回,這樣可以減少昂貴的磁盤(pán)I/O。
4)優(yōu)化查詢(xún)很多人查詢(xún)都是在查一樣的,完全可以用反向代理合并這些并發(fā)的相同的查詢(xún)。這樣的技術(shù)主要用查詢(xún)結(jié)果緩存來(lái)實(shí)現(xiàn),第一次查詢(xún)走數(shù)據(jù)庫(kù)獲得數(shù)據(jù),并把 數(shù)據(jù)放到緩存,后面的查詢(xún)統(tǒng)統(tǒng)直接訪問(wèn)高速緩存。為每個(gè)查詢(xún)做Hash,使用NoSQL的技術(shù)可以完成這個(gè)優(yōu)化。
5)緩存問(wèn)題:緩存可以用來(lái)緩存動(dòng)態(tài)頁(yè)面,也可以用來(lái)緩存查詢(xún)的數(shù)據(jù)。緩存通常有那么幾個(gè)問(wèn)題:1)緩存的更新。也叫緩存和數(shù)據(jù)庫(kù)的同步。有這么幾種方法,一是緩存time out,讓緩存失效,重查,二是,由后端通知更新,一量后端發(fā)生變化,通知前端更新。前者實(shí)現(xiàn)起來(lái)比較簡(jiǎn)單,但實(shí)時(shí)性不高,后者實(shí)現(xiàn)起來(lái)比較復(fù)雜 ,但實(shí)時(shí)性高。2)把一些不活躍的數(shù)據(jù)換出內(nèi)存,比如采取一些相應(yīng)的FIFO、LRU、LFU換頁(yè)算法進(jìn)行換頁(yè)。3)緩存的重建和持久化。緩存的持久化也嚴(yán)重的影響到網(wǎng)站的基本性能。
網(wǎng)站性能優(yōu)化僅僅靠前端優(yōu)化是不夠的,還需要后臺(tái)做大量的工作,比如數(shù)據(jù)的冗余、鏡像、分區(qū)和檢索等技術(shù)的處理。
1)數(shù)據(jù)冗余,如何對(duì)數(shù)據(jù)庫(kù)的數(shù)據(jù)冗余進(jìn)行處理,盡量減少表之間的連接開(kāi)銷(xiāo),但也要主要到數(shù)據(jù)之間的開(kāi)銷(xiāo)問(wèn)題。比如部分場(chǎng)合采取NoSQL來(lái)處理數(shù)據(jù)。但這一切要根據(jù)不同的業(yè)務(wù)進(jìn)行分析和處理。
2)數(shù)據(jù)鏡像,幾乎所有主流的數(shù)據(jù)庫(kù)都支持鏡像。數(shù)據(jù)庫(kù)的鏡像最大便利就是做負(fù)載均衡。把一臺(tái)數(shù)據(jù)庫(kù)的負(fù)載均分到多臺(tái)上,保證了數(shù)據(jù)一致性。同時(shí)也保證了高可用性,當(dāng)一臺(tái)服務(wù)器出現(xiàn)故障時(shí),還可以在另一條服務(wù)器上運(yùn)行。然而如何保證數(shù)據(jù)鏡像的數(shù)據(jù)一致性問(wèn)題,必須采取一些相應(yīng)的手段,比如在單條數(shù)據(jù)上對(duì)進(jìn)行數(shù)據(jù)分區(qū),如把某類(lèi)數(shù)據(jù)均分到不同的服務(wù)器上,假設(shè)某類(lèi)數(shù)據(jù)達(dá)10萬(wàn)條,我們可以設(shè)置10臺(tái)服務(wù)器,每臺(tái)服務(wù)器上均攤1萬(wàn)條,從而達(dá)到提高網(wǎng)站性能的效果。
3)數(shù)據(jù)分區(qū),數(shù)據(jù)鏡像對(duì)海量數(shù)據(jù)沒(méi)有好的解決辦法,而通常對(duì)于一個(gè)表中包含大量數(shù)據(jù)的情況下,采取數(shù)據(jù)分區(qū)的方式來(lái)進(jìn)行處理。通常采取如下處理辦法:①對(duì)數(shù)據(jù)實(shí)行邏輯分類(lèi)。比如按照時(shí)間維度、空間維度等進(jìn)行處理,目的是把一張表拆成多張字表,這樣就可以達(dá)到分擔(dān)負(fù)載的目的。②把數(shù)據(jù)按字段分,按照用途進(jìn)行劃分,把一張分成幾張表。③還可以根據(jù)需要對(duì)大的數(shù)據(jù)表進(jìn)行平準(zhǔn)劃分,或者負(fù)載均衡。不同的方法有不同的優(yōu)缺點(diǎn),具體情況具體對(duì)待。
4)后端系統(tǒng)負(fù)載均衡,對(duì)于訪問(wèn)量較大的數(shù)據(jù),通常采用一個(gè)任務(wù)分配系統(tǒng)來(lái)監(jiān)控各個(gè)服務(wù)器的負(fù)載情況。比如服務(wù)器什么時(shí)候忙、CPU使用率高、磁盤(pán)I/O及內(nèi)存使用情況等因素都要進(jìn)行綜合考慮,然后把這些信息要發(fā)送到任務(wù)分配器上,由任務(wù)分配器挑選一臺(tái)負(fù)載最小的服務(wù)器來(lái)處理。任務(wù)分配服務(wù)器上需要對(duì)任務(wù)隊(duì)列,不能丟任務(wù)啊,所以還需要持久化。并且可以以批量的方式把任務(wù)分配給計(jì)算服務(wù)器。
5)異步、throttle和 批量處理:異步、throttle(節(jié)流閥) 和批量處理都需要對(duì)并發(fā)請(qǐng)求數(shù)做隊(duì)列處理的。異步處理就是按照不同步的程序處理問(wèn)題,異步處理與同步處理是對(duì)立的,而產(chǎn)生它們的是多線程或者多進(jìn)程。異步處理的好處就是提高設(shè)備使用率;throttle技術(shù)是網(wǎng)絡(luò)流量的一種保護(hù)機(jī)制,其目的是防止系統(tǒng)流量過(guò)大。批量處理技術(shù),是把基本相同的請(qǐng)求批量處理。批量處理一般設(shè)置兩個(gè)閥值,作業(yè)量和timeout,當(dāng)滿(mǎn)足其中一個(gè)條件時(shí)就會(huì)提交處理。
網(wǎng)站性能優(yōu)化技術(shù)是一項(xiàng)細(xì)膩而又繁瑣的工作,如何才能讓網(wǎng)站達(dá)到最大的性能,必須從前端和后端兩個(gè)方面著手,在每個(gè)細(xì)節(jié)上都盡量做到精簡(jiǎn),優(yōu)化。然HTTP請(qǐng)求流在技術(shù)處理上還有很多未注意到的細(xì)節(jié),這就要求具體的操作人員在實(shí)際操作中進(jìn)行相應(yīng)優(yōu)化??傊?,從前端和后端兩個(gè)方面入手,是對(duì)網(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]萬(wàn)常選,鄧松,劉喜平,等.Web數(shù)據(jù)源選擇技術(shù)[J].軟件學(xué)報(bào),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)用性能評(píng)測(cè)[J].計(jì)算機(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]郝秀蕊,安 虹,李小強(qiáng),等.流處理器的相變存儲(chǔ)器主存性能優(yōu)化[J].計(jì)算機(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].計(jì)算機(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請(qǐng)求的ORM性能優(yōu)化研究[J].計(jì)算機(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.