大型網(wǎng)站優(yōu)化之高性能

網(wǎng)站從用戶(hù)提交請(qǐng)求到服務(wù)端響應(yīng)請(qǐng)求再到數(shù)據(jù)入庫(kù),這期間經(jīng)過(guò)了很多環(huán)節(jié)悼尾。要做到性能優(yōu)化傻铣,首先要排查到性能瓶頸的地方章贞,然后才能對(duì)癥下藥,提高性能非洲。

排查網(wǎng)站性能和排查程序的性能的手段基本相同鸭限,檢查請(qǐng)求處理各個(gè)環(huán)節(jié)的日志,分析哪個(gè)環(huán)節(jié)響應(yīng)時(shí)間不合理两踏、超過(guò)預(yù)期败京,然后檢查監(jiān)控?cái)?shù)據(jù),分析影響性能的主要因素是內(nèi)存梦染、網(wǎng)絡(luò)赡麦、磁盤(pán)還是CPU朴皆,是代碼問(wèn)題還是架構(gòu)問(wèn)題,或者的確是系統(tǒng)資源不足泛粹。

定位到問(wèn)題的原因后遂铡,就需要性能優(yōu)化,根據(jù)網(wǎng)站分層架構(gòu)晶姊,可分為web前端優(yōu)化扒接,應(yīng)用服務(wù)優(yōu)化,以及存儲(chǔ)服務(wù)優(yōu)化3大類(lèi)帽借。

一珠增、Web前端性能優(yōu)化

Web前端指網(wǎng)站具體業(yè)務(wù)邏輯之前的部分,包括頁(yè)面加載砍艾,視圖模型蒂教,圖片加載,CDN服務(wù)等脆荷,主要的優(yōu)化手段有優(yōu)化瀏覽器訪問(wèn)凝垛、使用反向代理、CDN等蜓谋。

瀏覽器訪問(wèn)優(yōu)化

1.減少http請(qǐng)求梦皮,http請(qǐng)求時(shí)無(wú)狀態(tài)的,每次請(qǐng)求都需要建立通信鏈路桃焕,而服務(wù)端對(duì)于每個(gè)http請(qǐng)求都需要啟動(dòng)獨(dú)立的線(xiàn)程去處理剑肯。這些通信和服務(wù)的開(kāi)銷(xiāo)都是很昂貴的,減少http請(qǐng)求观堂,能有效提高訪問(wèn)性能

減少http請(qǐng)求主要手段是合并資源让网,即合并css,合并圖片师痕,合并js腳本溃睹,瀏覽器把一次訪問(wèn)需要的資源合并成一個(gè)url。

2.使用瀏覽器緩存

對(duì)于網(wǎng)站而言胰坟,css和js腳本因篇,圖標(biāo)等靜態(tài)資源,變化的頻率比較低笔横,而這些文件有又是每次http請(qǐng)求必需的竞滓,如果將這些資源緩存起來(lái),可極好的改善性能吹缔。通過(guò)設(shè)置http頭中的cache-controll和expires屬性虽界,來(lái)設(shè)置瀏覽器緩存。

CDN加速

CDN(內(nèi)容分發(fā)網(wǎng)絡(luò))涛菠,本質(zhì)還是緩存莉御。CDN把數(shù)據(jù)緩存在離用戶(hù)最近的地方撇吞,使用戶(hù)以最快速度獲取數(shù)據(jù)。

CDN部署在網(wǎng)絡(luò)運(yùn)營(yíng)商的機(jī)房礁叔,這些運(yùn)營(yíng)商有是終端用戶(hù)的網(wǎng)絡(luò)服務(wù)提供商牍颈,因此用戶(hù)請(qǐng)求路由的第一跳就到達(dá)了CDN服務(wù)器,當(dāng)CDN存在瀏覽器請(qǐng)求的內(nèi)容琅关,就直接返回煮岁,最短路徑返回響應(yīng),加快用戶(hù)訪問(wèn)速度涣易,減少數(shù)據(jù)中心負(fù)載壓力画机。

CDN一般緩存都是css,js圖片新症,文件步氏,靜態(tài)頁(yè)面等資源,但是這些資源訪問(wèn)頻度很高徒爹,將其緩存在CDN中可極大改善網(wǎng)頁(yè)的打開(kāi)速度荚醒。

反向代理

講道理,對(duì)正反向代理概念一直不是很清楚隆嗅,直到我看了這個(gè)圖

正向代理和反向代理示意圖

反向代理服務(wù)器可以通過(guò)緩存功能加速web請(qǐng)求界阁,還能實(shí)現(xiàn)負(fù)載均衡功能,比如大名鼎鼎的nginx胖喳。

二泡躯、應(yīng)用服務(wù)器性能優(yōu)化

應(yīng)用服務(wù)器就是網(wǎng)站業(yè)務(wù)處理的服務(wù)器,網(wǎng)站的業(yè)務(wù)代碼都部署在這里丽焊,是網(wǎng)站開(kāi)發(fā)最復(fù)雜较剃,變化最多的地方。優(yōu)化主要手段有緩存粹懒、集群重付、異步顷级。

1.分布式緩存

網(wǎng)站性能優(yōu)化第一定律:優(yōu)先考慮使用緩存優(yōu)化性能凫乖。

在整個(gè)網(wǎng)站應(yīng)用中,緩存幾乎無(wú)處不在弓颈,既存在于瀏覽器帽芽,也存在于應(yīng)用服務(wù)器和數(shù)據(jù)庫(kù)服務(wù)器,即可以對(duì)數(shù)據(jù)緩存翔冀,也可以對(duì)文件緩存导街,還可以對(duì)頁(yè)面片段進(jìn)行緩存,合理使用緩存纤子,對(duì)網(wǎng)站性能優(yōu)化意義重大搬瑰。

數(shù)據(jù)緩存主要存放那些讀寫(xiě)比高款票、很少變化的數(shù)據(jù),如商品的條目信息泽论,熱門(mén)詞的搜索列表艾少,熱門(mén)商品信息等。應(yīng)用程序讀取數(shù)據(jù)時(shí)翼悴,先從緩存中去讀取缚够,如果讀取不到或數(shù)據(jù)已經(jīng)失效,再去數(shù)據(jù)庫(kù)中去讀鹦赎,同時(shí)將數(shù)據(jù)寫(xiě)入緩存谍椅。

網(wǎng)站數(shù)據(jù)訪問(wèn)通常遵循二八定律,即80%的訪問(wèn)落在20%的數(shù)據(jù)上古话,因次利用內(nèi)存的高速訪問(wèn)特性雏吭,將這20%的數(shù)據(jù)緩存起來(lái),可很好的改善系統(tǒng)性能煞额,提高數(shù)據(jù)讀取速度思恐,降低存儲(chǔ)系統(tǒng)壓力。

緩存好處很多膊毁,但要合理使用胀莹。不合理使用緩存不但不能提高系統(tǒng)性能,還會(huì)成為系統(tǒng)的累贅婚温,甚至是風(fēng)險(xiǎn)描焰。哪些是不合理的使用緩存呢?

頻繁修改的數(shù)據(jù)

如果緩存中的數(shù)據(jù)是需要頻繁修改的數(shù)據(jù)栅螟,就會(huì)出現(xiàn)數(shù)據(jù)寫(xiě)入緩存后荆秦,應(yīng)用還來(lái)不及讀取緩存,數(shù)據(jù)就已經(jīng)失效力图,緩存就沒(méi)有意義步绸,只會(huì)增加系統(tǒng)負(fù)擔(dān)。一般來(lái)說(shuō)吃媒,放入緩存中的數(shù)據(jù)瓤介,至少讀取兩次,緩存才有意義赘那。

數(shù)據(jù)不一致性

一般會(huì)對(duì)緩存的數(shù)據(jù)設(shè)置失效時(shí)間刑桑,一旦超過(guò)失效時(shí)間,就會(huì)從數(shù)據(jù)庫(kù)中重新加載募舟。因此祠斧,應(yīng)用也要容忍一定時(shí)間的數(shù)據(jù)不一致性。

緩存可用性

緩存是提高數(shù)據(jù)讀取性能的拱礁,緩存數(shù)據(jù)丟失或者緩存不可用不會(huì)影響到應(yīng)用程序的處理-它可以從數(shù)據(jù)庫(kù)直接獲取數(shù)據(jù)琢锋。但隨著業(yè)務(wù)的發(fā)展辕漂,緩存會(huì)承擔(dān)大部分?jǐn)?shù)據(jù)訪問(wèn)的壓力,緩存服務(wù)器有一定概率發(fā)生宕機(jī)吴超,不能因?yàn)榫彺娣?wù)器宕機(jī)钮热,然后把壓力全部傳給數(shù)據(jù)庫(kù)服務(wù)器,導(dǎo)致數(shù)據(jù)庫(kù)服務(wù)器也宕機(jī)烛芬。

通過(guò)分布式緩存服務(wù)器集群隧期,將緩存服務(wù)分布到多臺(tái)服務(wù)器上,一臺(tái)出現(xiàn)故障赘娄,不影響整個(gè)集群仆潮,不會(huì)對(duì)應(yīng)用產(chǎn)生影響,一定程度上提高緩存服務(wù)的高可用遣臼。

緩存穿透

如果因?yàn)椴磺‘?dāng)?shù)臉I(yè)務(wù)性置、或者惡意攻擊持續(xù)高并發(fā)第請(qǐng)求某個(gè)不存在的數(shù)據(jù),由于緩存中沒(méi)有保存該數(shù)據(jù)揍堰,所有的請(qǐng)求都會(huì)落到數(shù)據(jù)庫(kù)上鹏浅,會(huì)給數(shù)據(jù)庫(kù)服務(wù)器造成很大的壓力,甚至崩潰屏歹。一個(gè)很簡(jiǎn)單的策略是隐砸,把不存在的數(shù)據(jù)也緩存起來(lái)(其value為null)。

2.異步操作

使用消息隊(duì)列將調(diào)用異步化蝙眶,可改善網(wǎng)站的擴(kuò)展性季希。事實(shí)上,還可以改善網(wǎng)站的性能幽纷。

在不使用消息隊(duì)列的情況下式塌,用戶(hù)的請(qǐng)求數(shù)據(jù)直接寫(xiě)入數(shù)據(jù)庫(kù)。在高并發(fā)的情況下友浸,會(huì)對(duì)數(shù)據(jù)庫(kù)造成巨大的壓力峰尝,同時(shí)也使得響應(yīng)延遲加劇。在使用消息隊(duì)列后收恢,用戶(hù)請(qǐng)求的數(shù)據(jù)發(fā)送給消息隊(duì)列后立即返回武学,再由消息隊(duì)列的消費(fèi)者進(jìn)程從消息隊(duì)列中獲取數(shù)據(jù),異步寫(xiě)入數(shù)據(jù)庫(kù)派诬。由于消息隊(duì)列服務(wù)器處理速度要比數(shù)據(jù)庫(kù)服務(wù)器快劳淆,因此用戶(hù)的響應(yīng)延遲可有效得到緩解链沼。

消息隊(duì)列具有很好的削峰作用--即通過(guò)異步處理默赂,將短時(shí)間高并發(fā)產(chǎn)生的事務(wù)消息存儲(chǔ)在消息隊(duì)列中,從而削平高峰的并發(fā)事務(wù)括勺。電子商務(wù)網(wǎng)站在促銷(xiāo)活動(dòng)中缆八,合理使用消息隊(duì)列曲掰,可有效抵御促銷(xiāo)活動(dòng)開(kāi)始大量涌入的訂單對(duì)系統(tǒng)造成的沖擊。

需要注意的是奈辰,由于數(shù)據(jù)寫(xiě)入消息隊(duì)列后立即返回給用戶(hù)栏妖,數(shù)據(jù)在后續(xù)的業(yè)務(wù)校驗(yàn)、寫(xiě)數(shù)據(jù)庫(kù)等操作可能失敗奖恰,因此在使用消息隊(duì)列進(jìn)行業(yè)務(wù)異步處理后吊趾,需要適當(dāng)修改業(yè)務(wù)流程進(jìn)行配合,如訂單提交后瑟啃,訂單數(shù)據(jù)寫(xiě)入消息隊(duì)列论泛,不能立即返回用戶(hù)訂單提交成功,需要在消息隊(duì)列的訂單消費(fèi)者進(jìn)程真正處理完該訂單蛹屿,甚至商品出庫(kù)后屁奏,再通過(guò)電子郵件或短信告知用戶(hù)訂單成功,以免交易糾紛错负。

3.使用集群

在網(wǎng)站高并發(fā)訪問(wèn)的場(chǎng)景下坟瓢,使用負(fù)載均衡技術(shù)為一個(gè)應(yīng)用搭建一個(gè)有多臺(tái)服務(wù)器組成的服務(wù)器集群,將并發(fā)訪問(wèn)請(qǐng)求分發(fā)到多臺(tái)服務(wù)器上處理犹撒,避免單一服務(wù)器負(fù)載壓力過(guò)大而響應(yīng)緩慢折联。

4.代碼優(yōu)化

網(wǎng)站的業(yè)務(wù)邏輯實(shí)現(xiàn)代碼主要部署在用于應(yīng)用服務(wù)器上,合理優(yōu)化業(yè)務(wù)代碼识颊,可以很好地改善網(wǎng)絡(luò)性能崭庸。

多線(xiàn)程編程

這是一個(gè)老生常談的話(huà)題了,這里不多贅述谊囚。多線(xiàn)程變成需要注意的問(wèn)題是線(xiàn)程安全問(wèn)題怕享,解決該問(wèn)題的手段主要有以下幾點(diǎn):

把對(duì)象設(shè)計(jì)為無(wú)狀態(tài)對(duì)象,使用局部對(duì)象镰踏,并發(fā)訪問(wèn)資源時(shí)使用鎖(會(huì)對(duì)系統(tǒng)性能產(chǎn)生嚴(yán)重影響)

資源復(fù)用

系統(tǒng)運(yùn)行時(shí)函筋,要盡量減少那些開(kāi)銷(xiāo)很大的系統(tǒng)資源創(chuàng)建和銷(xiāo)毀,比如數(shù)據(jù)庫(kù)連接奠伪,文件讀寫(xiě)跌帐,網(wǎng)絡(luò)通信連接、線(xiàn)程绊率、復(fù)雜對(duì)象等谨敛。從編程角度講,資源復(fù)用主要有兩種模式:?jiǎn)卫唾Y源池滤否。

垃圾回收

以JVM為例脸狸,其內(nèi)存主要可分為堆和棧,棧主要用于存儲(chǔ)線(xiàn)程上下文信息,炊甲,如方法參數(shù)泥彤、局部變量等。堆則主要是對(duì)象的存儲(chǔ)空間卿啡,對(duì)象的創(chuàng)建和銷(xiāo)毀吟吝、垃圾回收就在這里進(jìn)行,發(fā)現(xiàn)大部分對(duì)象的生命周期都極其短暫颈娜,這部分對(duì)象產(chǎn)生的垃圾應(yīng)該被更快地收集剑逃,以釋放內(nèi)存。

小結(jié):

網(wǎng)站性能優(yōu)化對(duì)最終用戶(hù)而言是一種主觀感受官辽,性能優(yōu)化的終極目的就是改善用戶(hù)的體驗(yàn)炕贵,使他們感覺(jué)訪問(wèn)網(wǎng)站很快。離開(kāi)這個(gè)目的野崇,追求技術(shù)上的高性能称开,都是舍本逐末,沒(méi)有多大意義乓梨。

即使在技術(shù)層面鳖轰,性能優(yōu)化也需要全面考慮,綜合權(quán)衡:性能提升一倍扶镀,但服務(wù)器數(shù)量也要增加一倍蕴侣;或者響應(yīng)時(shí)間縮短,同時(shí)數(shù)據(jù)一致性下降臭觉,這樣的優(yōu)化是否可以接受昆雀?這類(lèi)問(wèn)題的答案不是技術(shù)團(tuán)隊(duì)能回答的。歸根結(jié)底蝠筑,技術(shù)是為業(yè)務(wù)服務(wù)的狞膘,技術(shù)選型和架構(gòu)決策依賴(lài)業(yè)務(wù)規(guī)劃乃至企業(yè)戰(zhàn)略規(guī)劃,離開(kāi)業(yè)務(wù)發(fā)展的支撐和驅(qū)動(dòng)什乙,技術(shù)走不遠(yuǎn)挽封,甚至還會(huì)迷路。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末臣镣,一起剝皮案震驚了整個(gè)濱河市辅愿,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌忆某,老刑警劉巖点待,帶你破解...
    沈念sama閱讀 222,590評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異弃舒,居然都是意外死亡癞埠,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)燕差,“玉大人,你說(shuō)我怎么就攤上這事坝冕⊥教剑” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,301評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵喂窟,是天一觀的道長(zhǎng)测暗。 經(jīng)常有香客問(wèn)我,道長(zhǎng)磨澡,這世上最難降的妖魔是什么碗啄? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,078評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮稳摄,結(jié)果婚禮上稚字,老公的妹妹穿的比我還像新娘。我一直安慰自己厦酬,他們只是感情好胆描,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,082評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著仗阅,像睡著了一般昌讲。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上减噪,一...
    開(kāi)封第一講書(shū)人閱讀 52,682評(píng)論 1 312
  • 那天短绸,我揣著相機(jī)與錄音,去河邊找鬼筹裕。 笑死醋闭,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的朝卒。 我是一名探鬼主播目尖,決...
    沈念sama閱讀 41,155評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼扎运!你這毒婦竟也來(lái)了瑟曲?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 40,098評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤豪治,失蹤者是張志新(化名)和其女友劉穎洞拨,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體负拟,經(jīng)...
    沈念sama閱讀 46,638評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡烦衣,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,701評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片花吟。...
    茶點(diǎn)故事閱讀 40,852評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡秸歧,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出衅澈,到底是詐尸還是另有隱情键菱,我是刑警寧澤,帶...
    沈念sama閱讀 36,520評(píng)論 5 351
  • 正文 年R本政府宣布今布,位于F島的核電站经备,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏部默。R本人自食惡果不足惜侵蒙,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,181評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望傅蹂。 院中可真熱鬧纷闺,春花似錦、人聲如沸份蝴。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,674評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)搞乏。三九已至波桩,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間请敦,已是汗流浹背镐躲。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,788評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留侍筛,地道東北人萤皂。 一個(gè)月前我還...
    沈念sama閱讀 49,279評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像匣椰,于是被迫代替她去往敵國(guó)和親裆熙。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,851評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容