服務(wù)項(xiàng)目
聯(lián)系方式
保定市遨游計(jì)算機(jī)服務(wù)有限公司
咨詢熱線:13313028229
售后:0312-6791400
售后:0312-6791126
網(wǎng)址:www.o4l6k.com
地址:保定朝陽(yáng)大街國(guó)貿(mào)大廈8樓808室
咨詢熱線:13313028229
售后:0312-6791400
售后:0312-6791126
網(wǎng)址:www.o4l6k.com
地址:保定朝陽(yáng)大街國(guó)貿(mào)大廈8樓808室
大型網(wǎng)站的靈魂——性能優(yōu)化
[來(lái)源:www.o4l6k.com]
[作者:網(wǎng)站建設(shè)]
[日期:15-10-10]
[瀏覽次數(shù):]
如果一個(gè)網(wǎng)站運(yùn)行速度慢,即使它內(nèi)容再豐富,UI設(shè)計(jì)更美觀,也算不上一個(gè)好網(wǎng)站。因?yàn)樗雎粤俗钪匾囊蛩兀盒阅?。運(yùn)行速度的快與慢是最直觀的說(shuō)法,也是用戶的真實(shí)體驗(yàn)。本文轉(zhuǎn)載博客園,講述大型網(wǎng)站中一個(gè)重要的要素,性能。
什么是性能
有人說(shuō)性能就是訪問(wèn)速度快慢,這是最直觀的說(shuō)法,也是用戶的真實(shí)體驗(yàn)。一個(gè)用戶從輸入網(wǎng)址到按下回車鍵,看到網(wǎng)頁(yè)的快慢,這就是性能。對(duì)于我們來(lái)說(shuō),需要去挖掘這個(gè)過(guò)程,因?yàn)檫@決定我們?cè)趺慈プ鲂阅軆?yōu)化。
這中間發(fā)生了什么?
用戶訪問(wèn)網(wǎng)站的整個(gè)流程:用戶輸入網(wǎng)站域名,通過(guò)DNS解析,找到目標(biāo)服務(wù)器IP,請(qǐng)求數(shù)據(jù)經(jīng)互聯(lián)網(wǎng)達(dá)到目標(biāo)服務(wù)器,目標(biāo)服務(wù)器收到請(qǐng)求數(shù)據(jù),進(jìn)行處理(執(zhí)行程序、訪問(wèn)數(shù)據(jù)庫(kù)、文件服務(wù)器等)。處理完成,將響應(yīng)數(shù)據(jù)又經(jīng)互聯(lián)網(wǎng)返回給用戶瀏覽器,瀏覽器得到結(jié)果進(jìn)行計(jì)算渲染顯示給用戶。
我們把整個(gè)過(guò)程,分為三段路徑:
第一段在用戶和瀏覽器端,主要負(fù)責(zé)發(fā)出用戶請(qǐng)求,以及接受響應(yīng)數(shù)據(jù)進(jìn)行計(jì)算渲染顯示給用戶;
第二段在網(wǎng)絡(luò)上,負(fù)責(zé)對(duì)請(qǐng)求數(shù)據(jù)、響應(yīng)數(shù)據(jù)的傳輸;
第三段在網(wǎng)站服務(wù)器端,負(fù)責(zé)對(duì)請(qǐng)求數(shù)據(jù)進(jìn)行處理(執(zhí)行程序、訪問(wèn)數(shù)據(jù)庫(kù)、文件等),并將結(jié)果返回;
第一路徑
第一路徑花費(fèi)的時(shí)間包括輸入域名發(fā)起請(qǐng)求的時(shí)間和瀏覽器收到響應(yīng)后計(jì)算渲染的時(shí)間。
輸入域名發(fā)起請(qǐng)求,實(shí)質(zhì)過(guò)程是:
用戶在瀏覽器輸入要訪問(wèn)的網(wǎng)站域名;
本地DNS請(qǐng)求網(wǎng)站授權(quán)的DNS服務(wù)器對(duì)域名進(jìn)行解析,并得到解析結(jié)果即IP地址(并將IP地址緩存起來(lái))。
向目標(biāo)IP地址發(fā)出請(qǐng)求。
從這個(gè)過(guò)程我們可以看到,優(yōu)化的地方主要是減少DNS解析次數(shù),而如果用戶瀏覽器設(shè)置了緩存,則再第二次訪問(wèn)相同域名的時(shí)候就不會(huì)去請(qǐng)求DNS服務(wù)器,直接用緩存中的IP地址發(fā)出請(qǐng)求。因此這個(gè)過(guò)程主要取決于瀏覽器的設(shè)置?,F(xiàn)在主流的瀏覽器默認(rèn)設(shè)置了DNS的預(yù)取功能(DNS Prefetch),當(dāng)然你也可以主動(dòng)告知瀏覽器我的網(wǎng)站需要做DNS預(yù)?。?
瀏覽器將數(shù)據(jù)進(jìn)行計(jì)算渲染的過(guò)程:
瀏覽器解析響應(yīng)數(shù)據(jù);
瀏覽器創(chuàng)建DOM樹(shù);
瀏覽器下載CSS樣式,并應(yīng)用到DOM樹(shù),進(jìn)行渲染;
瀏覽器下載JS文件,開(kāi)始解析執(zhí)行;
顯示給用戶。
從這個(gè)過(guò)程,我們可以找出不少可以優(yōu)化的地方。首先我們可以盡量控制頁(yè)面大小,使得瀏覽器解析的時(shí)間更短;并且將多個(gè)CSS文件、JS文件文件合并壓縮減少文件下載的次數(shù)和大小;另外注意將CSS放在頁(yè)面前面,JS訪問(wèn)頁(yè)面后面,這樣便于頁(yè)面首先能渲染出來(lái),再執(zhí)行js腳本,對(duì)于用戶來(lái)說(shuō)有更好的體驗(yàn)。最后我還可以設(shè)置瀏覽器緩存,下次訪問(wèn)時(shí)從緩存讀取內(nèi)容,減少http請(qǐng)求。
該代碼說(shuō)明了瀏覽器啟用了緩存并在5秒內(nèi)不會(huì)再次訪問(wèn)服務(wù)器。注意緩存的設(shè)置需要結(jié)合你的業(yè)務(wù)特性來(lái)適當(dāng)配置。
以下是京東商城的HTML簡(jiǎn)圖:
CSS樣式放在html前面,并且進(jìn)行了合并。
大多數(shù)的JS文件放在頁(yè)尾。
第二路徑
第二路徑在網(wǎng)絡(luò)上,花費(fèi)的時(shí)間同樣包括請(qǐng)求數(shù)據(jù)的傳輸時(shí)間和響應(yīng)數(shù)據(jù)的傳輸時(shí)間,這個(gè)兩個(gè)時(shí)間取決于數(shù)據(jù)傳輸?shù)乃俣?,這里我們要講一個(gè)名詞“帶寬”。什么是帶寬,我們經(jīng)常說(shuō)帶寬10M,20M是什么意思?我的帶寬20M,這意味著什么?我們知道帶寬速度分為上行、下行速度,也就是上傳和下載的速度。帶寬20M對(duì)于用戶來(lái)說(shuō)則是下載速度20M(20×1024×1024比特率),換算成字節(jié)20M/8=2.5M。也就是說(shuō)20M的帶寬下載速度理論可達(dá)2.5M/s,而對(duì)于家庭用戶而言上傳速度一般比下載速度小的多,大約是不到十分之一。而對(duì)于網(wǎng)站服務(wù)器(企業(yè)用戶)來(lái)說(shuō),則不然,一般上行速度等于下載速度。這也是運(yùn)營(yíng)商根據(jù)實(shí)際需求分配的,畢竟用戶的主要需求是下載數(shù)據(jù),而不是上傳數(shù)據(jù)。
整個(gè)流程從傳輸方式看就是:用戶發(fā)送請(qǐng)求數(shù)據(jù)(上傳),網(wǎng)站服務(wù)器接受請(qǐng)求數(shù)據(jù)(下載),網(wǎng)站服務(wù)器返回響應(yīng)數(shù)據(jù)(上傳),用戶接受響應(yīng)數(shù)據(jù)(下載)。對(duì)于用戶來(lái)說(shuō),上傳數(shù)據(jù)是很小的(Url參數(shù)),而下載數(shù)據(jù)是較大的(響應(yīng)數(shù)據(jù));對(duì)于服務(wù)器來(lái)說(shuō),下載數(shù)據(jù)是很小的(url參數(shù)),上傳數(shù)據(jù)是較大(響應(yīng)數(shù)據(jù))。理解了這個(gè),我們可以解釋為什么有時(shí)用戶反映為什么自己的帶寬足夠,但打開(kāi)某些網(wǎng)站仍然很慢,就是因?yàn)楸M管用戶的下載速度很快,但網(wǎng)站服務(wù)器的上傳速度很慢,這就像一個(gè)抽水管和一個(gè)出水管,不管抽水管再大,但出水管很小,同樣抽到的水量是有限的。了解了這個(gè)原理我們來(lái)看怎么提高數(shù)據(jù)傳輸?shù)乃俣?,首先用戶的上傳、下載速度我們是無(wú)法決定的,我們能決定的是網(wǎng)站服務(wù)器的上傳、下載速度,所以我們可以做的是適當(dāng)?shù)脑黾臃?wù)器帶寬(帶寬是很貴的,盲目的增加只會(huì)增加不必要成本)。購(gòu)買合適的帶寬需要根據(jù)網(wǎng)站業(yè)務(wù)特性、規(guī)模以及結(jié)合運(yùn)維人員的經(jīng)驗(yàn)來(lái)選擇。通??梢钥紤]的算法,即根據(jù)一次響應(yīng)數(shù)據(jù)的大小,乘以PV數(shù),除以對(duì)應(yīng)的高峰時(shí)間段,從而大致估算出網(wǎng)站帶寬的需求。
下面我們繼續(xù)進(jìn)一步研究第二路徑:
上圖表示用戶訪問(wèn)網(wǎng)站服務(wù)器時(shí)網(wǎng)絡(luò)的大致情況,從圖上可以看出假設(shè)網(wǎng)站服務(wù)器從電信網(wǎng)絡(luò)接入,而用戶A作為電信的寬帶用戶,則可以通過(guò)電信骨干網(wǎng)快速的訪問(wèn)到網(wǎng)站服務(wù)器。用戶B,用戶C作為移動(dòng)和聯(lián)通用戶需要通過(guò)運(yùn)營(yíng)商的互聯(lián)互通經(jīng)過(guò)較長(zhǎng)路徑才能訪問(wèn)到服務(wù)器。
針對(duì)這種情況,我們可以采取以下方法來(lái)優(yōu)化:
在各運(yùn)營(yíng)商發(fā)達(dá)的地區(qū)的IDC(互聯(lián)網(wǎng)數(shù)據(jù)中心,可以理解成機(jī)房)部署網(wǎng)站服務(wù)器,各運(yùn)營(yíng)商的用戶即可通過(guò)各自的骨干網(wǎng)訪問(wèn)服務(wù)器。
購(gòu)買代理服務(wù),也就是原來(lái)聯(lián)通用戶需要通過(guò)聯(lián)通骨干網(wǎng)——>聯(lián)通互聯(lián)互通路由器——>電信骨干網(wǎng)——>網(wǎng)站服務(wù)器的過(guò)程。通過(guò)代理服務(wù),代理服務(wù)器直連到電信骨干網(wǎng),訪問(wèn)網(wǎng)站服務(wù)器。
在主要地區(qū)城市購(gòu)買CDN服務(wù),緩存對(duì)應(yīng)的數(shù)據(jù),用戶可先從最近的CDN運(yùn)營(yíng)商獲取請(qǐng)求數(shù)據(jù)。
第三路徑
第三路徑主要是網(wǎng)站服務(wù)器內(nèi)部處理的過(guò)程,當(dāng)中包括執(zhí)行程序、訪問(wèn)文件、數(shù)據(jù)庫(kù)等資源。
這是對(duì)于我們來(lái)說(shuō)最可以發(fā)揮的地方:
使用緩存,根據(jù)需要使用本地緩存或分布式緩存;
使用異步操作,這種方式不僅可以提高性能,也提高了系統(tǒng)的擴(kuò)展性;
代碼優(yōu)化;
存儲(chǔ)優(yōu)化;
緩存
如果緩存數(shù)據(jù)較少,可以利用OSCache實(shí)現(xiàn)本地緩存:
當(dāng)緩存數(shù)據(jù)過(guò)多時(shí),利用Memcached實(shí)現(xiàn)分布式緩存:
Memcached實(shí)現(xiàn)分布式緩存,緩存服務(wù)器之間是互不通信的,也就是我們可以方便的通過(guò)增加Memcached服務(wù)器對(duì)系統(tǒng)進(jìn)行擴(kuò)展。
異步操作
使用同步請(qǐng)求的方式,在高并發(fā)的情況下,會(huì)對(duì)數(shù)據(jù)庫(kù)造成很大的壓力,也會(huì)讓用戶感覺(jué)響應(yīng)時(shí)間過(guò)長(zhǎng)。異步請(qǐng)求方式,則可以快速的對(duì)用戶做出響應(yīng),而具體的數(shù)據(jù)庫(kù)操作請(qǐng)求,則通過(guò)消息隊(duì)列服務(wù)器發(fā)送給數(shù)據(jù)庫(kù)服務(wù)器,做具體的插入操作。插入操作的結(jié)果則已其他方式通知客戶端。例如一般在訂票系統(tǒng)當(dāng)中,出票行為就是異步完成,最終的出票結(jié)果會(huì)以郵件或其他方式告知用戶。
代碼優(yōu)化
這里就不在詳細(xì)描述,另一篇隨筆《怎樣編寫(xiě)高質(zhì)量的java代碼》對(duì)代碼質(zhì)量和風(fēng)格做過(guò)大致的介紹,有興趣可以看一下。
存儲(chǔ)優(yōu)化
大型網(wǎng)站中海量的數(shù)據(jù)讀寫(xiě)對(duì)磁盤造成很大壓力,系統(tǒng)最大的瓶頸還是在磁盤的讀寫(xiě)??梢钥紤]使用磁盤陣列、分布式儲(chǔ)存來(lái)改善存儲(chǔ)的性能。
性能的指標(biāo)和測(cè)試
上面通過(guò)解析用戶訪問(wèn)網(wǎng)站的過(guò)程來(lái)思考怎么提高用戶感知的性能,對(duì)于用戶來(lái)言性能就是快和慢。但對(duì)于我們來(lái)說(shuō),不能這樣簡(jiǎn)單描述,我們需要去量化他,用一些數(shù)據(jù)指標(biāo)去衡量它。這里講到幾個(gè)名詞:響應(yīng)時(shí)間、并發(fā)量、吞吐量。
響應(yīng)時(shí)間:就是用戶發(fā)出請(qǐng)求到收到響應(yīng)數(shù)據(jù)的時(shí)間;
并發(fā)量:就是系統(tǒng)同時(shí)能處理多少用戶請(qǐng)求;
吞吐量:就是單位時(shí)間內(nèi)系統(tǒng)處理的請(qǐng)求數(shù)量;
為了通俗的了解這三個(gè)概念,我們以高速公路的收費(fèi)站為例子:響應(yīng)時(shí)間是指一輛車經(jīng)過(guò)收費(fèi)站的時(shí)間,也就是車輛從進(jìn)入收費(fèi)站、付錢、開(kāi)閘、離開(kāi)收費(fèi)站的時(shí)間;并發(fā)量是指這個(gè)收費(fèi)站同時(shí)能通行多少輛車,可以理解為收費(fèi)站的出口數(shù)量。吞吐量是指:在一段時(shí)間內(nèi),這個(gè)收費(fèi)站通往了多少了車。
這個(gè)例子不曉得恰不恰當(dāng)。
對(duì)于性能測(cè)試來(lái)說(shuō),基本也是圍繞這些方面來(lái)測(cè)試,下圖說(shuō)明了性能測(cè)試的過(guò)程:
左圖表示響應(yīng)時(shí)間和并發(fā)用戶量的二維坐標(biāo)圖,從圖上可以看出,并發(fā)用戶量在一定量增加時(shí),響應(yīng)時(shí)間很短,并且沒(méi)有太大的起伏,這表示系統(tǒng)目前處于日常運(yùn)行期,可以很快處理用戶請(qǐng)求(A點(diǎn)之前);隨著并發(fā)量的增加,系統(tǒng)處于請(qǐng)求高峰期,但仍然可以有序的處理用戶請(qǐng)求,響應(yīng)時(shí)間較日常有所增加(A、B之間);當(dāng)并發(fā)量增加到一定數(shù)量時(shí),超過(guò)了系統(tǒng)的負(fù)載能力,系統(tǒng)處于瀕臨崩潰的邊緣(B、C之間),響應(yīng)時(shí)間嚴(yán)重過(guò)長(zhǎng),直到系統(tǒng)崩潰。
右圖表示吞吐量與并發(fā)用戶量的二維坐標(biāo)圖,可以看出,隨著并發(fā)用戶量的增加,吞吐量逐漸增加;在并發(fā)量到達(dá)一定量時(shí),由于系統(tǒng)處理能力達(dá)到最大,吞吐量增加放緩;當(dāng)并發(fā)量超過(guò)系統(tǒng)負(fù)載時(shí)(E點(diǎn)),系統(tǒng)處理能力開(kāi)始下降,不能再請(qǐng)求增加的用戶請(qǐng)求,吞吐量反而降低。
下一頁(yè):網(wǎng)站優(yōu)化,三分析兩優(yōu)化