《大型網(wǎng)站技術(shù)架構(gòu)》瞬時(shí)響應(yīng)之網(wǎng)站的高性能架構(gòu)(1)

一、網(wǎng)站性能測試

(1)性能測試指標(biāo):①響應(yīng)時(shí)間柔逼;②并發(fā)數(shù)吃挑;③吞吐量;④性能計(jì)數(shù)器遣鼓;

(2)性能測試方法:①性能測試;②負(fù)載測試重贺;③壓力測試骑祟;④穩(wěn)定性測試;

(3)性能優(yōu)化策略:

 ∑稀①性能分析:檢查請求處理各個(gè)環(huán)節(jié)的日志次企,分析哪個(gè)環(huán)節(jié)響應(yīng)時(shí)間不合理,檢查監(jiān)控?cái)?shù)據(jù)分析影響性能的因素潜圃;

 ∈愠病②性能優(yōu)化:Web前端優(yōu)化,應(yīng)用服務(wù)器優(yōu)化秉犹,存儲服務(wù)器優(yōu)化蛉谜;

二、Web前端性能優(yōu)化

(1)瀏覽器訪問優(yōu)化:

①減少http請求:因?yàn)閔ttp是無狀態(tài)的崇堵,每次請求的開銷都比較昂貴(需要建立通信鏈路型诚、進(jìn)行數(shù)據(jù)傳輸,而服務(wù)器端對于每個(gè)http請求都需要啟動獨(dú)立的線程去處理)鸳劳;減少http的主要手段是合并CSS狰贯、合并JS、合并圖片(CSS精靈赏廓,利用偏移定位image)涵紊;

  ②使用瀏覽器緩存:設(shè)置http頭中Cache-Control和Expires屬性幔摸;

 ∶③啟用壓縮:可以對html、css既忆、js文件啟用Gzip壓縮驱负,可以達(dá)到較高的壓縮效率,但是壓縮會對服務(wù)器及瀏覽器產(chǎn)生一定的壓力患雇;

④CSS放頁面最上面跃脊,JS放頁面最下面:瀏覽器會在下載完全部CSS之后才開始對整個(gè)頁面進(jìn)行渲染,因此最好將CSS放在頁面最上面苛吱;而瀏覽器在加載JS后會立即執(zhí)行酪术,有可能會阻塞整個(gè)頁面,造成頁面顯示緩慢翠储,因此最好將JS放在頁面最下面绘雁;

 ∠鹛邸⑤減少Cookie傳輸:一方面,太大的Cookie會嚴(yán)重影響數(shù)據(jù)傳輸咧七;另一方面衰齐,對于某些靜態(tài)資源的訪問(如CSS任斋、JS等)發(fā)送Cookie沒有意義继阻;

(2)CDN加速:

CDN(內(nèi)容分發(fā)網(wǎng)絡(luò))仍然是一個(gè)緩存,它將數(shù)據(jù)緩存在離用戶最近的地方废酷,便于用戶以最快速度獲取數(shù)據(jù)瘟檩。即所謂的“網(wǎng)絡(luò)訪問第一跳”,如下圖所示:

CDN只將訪問頻度很高的熱點(diǎn)內(nèi)容(例如:圖片澈蟆、視頻墨辛、CSS、JS腳本等訪問頻度很高的內(nèi)容)進(jìn)行緩存趴俘,可以極大地加快用戶訪問速度睹簇,減少數(shù)據(jù)中心負(fù)載。

(3)反向代理:

  反向代理服務(wù)器位于網(wǎng)站機(jī)房寥闪,代理網(wǎng)站W(wǎng)eb服務(wù)器接收Http請求太惠,對請求進(jìn)行轉(zhuǎn)發(fā),如下圖所示:

  反向代理服務(wù)器具有以下功能:

 ∑1铩①保護(hù)網(wǎng)站安全:任何來自Internet的請求都必須先經(jīng)過代理服務(wù)器凿渊;

  ②通過配置緩存功能加速Web請求:減輕真實(shí)Web服務(wù)器的負(fù)載壓力缚柳;

 “T唷③實(shí)現(xiàn)負(fù)載均衡:均衡地分發(fā)請求,平衡集群中各個(gè)服務(wù)器的負(fù)載壓力秋忙;

三彩掐、應(yīng)用服務(wù)器性能優(yōu)化

(1)分布式緩存:

PS:網(wǎng)站性能優(yōu)化第一定律:優(yōu)先考慮使用緩存優(yōu)化性能。緩存是指將數(shù)據(jù)存儲在相對較高訪問速度的存儲介質(zhì)中(如內(nèi)存)灰追,以供系統(tǒng)進(jìn)行快速處理響應(yīng)用戶請求佩谷。

①緩存本質(zhì)是一個(gè)內(nèi)存Hash表,數(shù)據(jù)以(Key,Value)形式存儲在內(nèi)存中监嗜。

②緩存主要用來存放那些讀寫比很高谐檀、很少變化的數(shù)據(jù),如商品的類目信息裁奇、熱門商品信息等桐猬。這樣,應(yīng)用程序讀取數(shù)據(jù)時(shí)刽肠,先到緩存中取溃肪,如緩存中沒有或失效免胃,再到數(shù)據(jù)庫中取出,重新寫入緩存以供下一次訪問惫撰。因此羔沙,可以很好地改善系統(tǒng)性能,提高數(shù)據(jù)讀取速度厨钻,降低存儲訪問壓力扼雏。

③分布式緩存架構(gòu):一方面是以以JBoss Cache為代表的互相通信派;另一方面是以Memcached為代表的互不通信派夯膀;

JBoss Cache需要將緩存信息同步到集群中的所有機(jī)器诗充,代價(jià)比較大;而Memcached采用一種集中式的緩存集群管理诱建,緩存與應(yīng)用分離部署蝴蜓,應(yīng)用程序通過一致性Hash算法選擇緩存服務(wù)器遠(yuǎn)程訪問緩存數(shù)據(jù),緩存服務(wù)器之間互不通信俺猿,因而集群規(guī)木ソ常可以輕易地?cái)U(kuò)容,具有良好的伸縮性押袍。

  Memcached由兩個(gè)核心組件組成:服務(wù)端(ms)和客戶端(mc)诵冒,在一個(gè)memcached的查詢中,mc先通過計(jì)算key的hash值來確定kv對所處在的ms位置伯病。當(dāng)ms確定后造烁,客戶端就會發(fā)送一個(gè)查詢請求給對應(yīng)的ms,讓它來查找確切的數(shù)據(jù)午笛。因?yàn)檫@之間沒有交互以及多播協(xié)議惭蟋,所以 memcached交互帶給網(wǎng)絡(luò)的影響是最小化的。

(2)異步操作:

①使用消息隊(duì)列將調(diào)用異步化药磺,可改善網(wǎng)站的擴(kuò)展性告组,還可改善網(wǎng)站性能;

②消息隊(duì)列具有削峰的作用->將短時(shí)間高并發(fā)產(chǎn)生的事務(wù)消息存儲在消息隊(duì)列中癌佩,從而削平高峰期的并發(fā)事務(wù)木缝;

PS:任何可以晚點(diǎn)做的事情都應(yīng)該晚點(diǎn)再做。前提是:這個(gè)事兒確實(shí)可以晚點(diǎn)再做围辙。

(3)使用集群:

①在高并發(fā)場景下我碟,使用負(fù)載均衡技術(shù)為一個(gè)應(yīng)用構(gòu)建多臺服務(wù)器組成的服務(wù)器集群;

②可以避免單一服務(wù)器因負(fù)載壓力過大而響應(yīng)緩慢姚建,使用戶請求具有更好的響應(yīng)延遲特性矫俺;

③負(fù)載均衡可以采用硬件設(shè)備,也可以采用軟件負(fù)載。商用硬件負(fù)載設(shè)備(例如出名的F5)成本通常較高(一臺幾十萬上百萬很正常)厘托,所以在條件允許的情況下我們會采用軟負(fù)載友雳,軟負(fù)載解決的兩個(gè)核心問題是:選誰、轉(zhuǎn)發(fā)铅匹,其中最著名的是LVS(Linux Virtual Server)押赊。

PS:LVS是四層負(fù)載均衡,也就是說建立在OSI模型的第四層——傳輸層之上包斑,傳輸層上有我們熟悉的TCP/UDP流礁,LVS支持TCP/UDP的負(fù)載均衡。

LVS的轉(zhuǎn)發(fā)主要通過修改IP地址(NAT模式舰始,分為源地址修改SNAT和目標(biāo)地址修改DNAT)崇棠、修改目標(biāo)MAC(DR模式)來實(shí)現(xiàn)咽袜。有關(guān)LVS的詳情請參考:http://www.importnew.com/11229.html

(4)代碼優(yōu)化:

 ⊥杈怼①多線程:使用多線程的原因:一是IO阻塞,二是多CPU询刹,都是為了最大限度地利用CPU資源谜嫉,提高系統(tǒng)吞吐能力,改善系統(tǒng)性能凹联;

②資源復(fù)用:目的是減少開銷很大的系統(tǒng)資源的創(chuàng)建和銷毀沐兰,主要采用兩種模式實(shí)現(xiàn):單例(Singleton)和對象池(Object Pool)。例如蔽挠,在.NET開發(fā)中住闯,經(jīng)常使用到的線程池,數(shù)據(jù)庫連接池等澳淑,本質(zhì)上都是對象池比原。

  ③數(shù)據(jù)結(jié)構(gòu):在不同場合合理使用恰當(dāng)?shù)臄?shù)據(jù)結(jié)構(gòu)杠巡,可以極大優(yōu)化程序的性能量窘。

  ④垃圾回收:理解垃圾回收機(jī)制有助于程序優(yōu)化和參數(shù)調(diào)優(yōu)氢拥,以及編寫內(nèi)存安安全的代碼蚌铜。這里主要針對Java(JVM)和C#(CLR)一類的具有GC(垃圾回收機(jī)制)的語言。

四嫩海、存儲性能優(yōu)化

(1)機(jī)械硬盤 還是 固態(tài)硬盤冬殃?

①機(jī)械硬盤:通過馬達(dá)驅(qū)動磁頭臂,帶動磁頭到指定的磁盤位置訪問數(shù)據(jù)叁怪。它能夠?qū)崿F(xiàn)快速順序讀寫审葬,慢速隨機(jī)讀寫

②固態(tài)硬盤(又稱SSD):無機(jī)械裝置,數(shù)據(jù)存儲在可持久記憶的硅晶體上耳璧,因此可以像內(nèi)存一樣快速隨機(jī)訪問成箫。

  在目前的網(wǎng)站應(yīng)用中,大部分應(yīng)用訪問數(shù)據(jù)都是隨機(jī)的旨枯,這種情況下SSD具有更好的性能表現(xiàn)蹬昌,但是性價(jià)比有待提升(蠻貴的,么么嗒)攀隔。

(2)B+樹 vs LSM樹

 ≡矸贰①傳統(tǒng)關(guān)系型數(shù)據(jù)庫廣泛采用B+樹,B+樹是對數(shù)據(jù)排好序后再存儲昆汹,加快數(shù)據(jù)檢索速度明刷。

PS:目前大多數(shù)DB多采用兩級索引的B+樹,樹的層次最多三層满粗。因此可能需要5次磁盤訪問才能更新一條記錄(三次磁盤訪問獲得數(shù)據(jù)索引及行ID辈末,一次數(shù)據(jù)文件讀操作,一次數(shù)據(jù)文件寫操作映皆,終于知道數(shù)據(jù)庫操作有多麻煩多耗時(shí)了)

 〖菲浮②NoSQL(例如:HBase)產(chǎn)品廣泛采用LSM樹:

具體思想是:將對數(shù)據(jù)的修改增量保持在內(nèi)存中,達(dá)到指定的大小限制后將這些修改操作批量寫入磁盤捅彻。不過讀取的時(shí)候稍微麻煩组去,需要合并磁盤中歷史數(shù)據(jù)和內(nèi)存中最近的修改操作,所以寫入性能大大提升步淹,讀取時(shí)可能需要先看是否命中內(nèi)存从隆,否則需要訪問較多的磁盤文件。

LSM樹的原理是:把一棵大樹拆分成N棵小樹缭裆,它首先寫入內(nèi)存中键闺,隨著小樹越來越大,內(nèi)存中的小樹會被清除并寫入到磁盤中幼驶,磁盤中的樹定期可以做合并操作艾杏,合并成一棵大樹,以優(yōu)化讀性能盅藻。

  LSM樹的優(yōu)勢在于:在LSM樹上進(jìn)行一次數(shù)據(jù)更新不需要磁盤訪問购桑,在內(nèi)存即可完成,速度遠(yuǎn)快于B+樹氏淑。

五勃蜘、學(xué)習(xí)總結(jié)

對于網(wǎng)站的高性能架構(gòu)這一章的閱讀,通過大牛的書籍我們學(xué)到了從三個(gè)主要方面的性能優(yōu)化策略假残,雖然都是理論缭贡,而且還只是淺顯地說明炉擅,但是對于我們這些廣大的開發(fā)菜鳥來說,擴(kuò)展知識面阳惹,了解一點(diǎn)優(yōu)化策略不是一件壞事谍失,我們可以從中注意到日常的代碼規(guī)范,如何寫出高效的代碼也是一件值得研究的事兒莹汤。在書中快鱼,看到了作者寫了這樣一句話,貼出來與各位正在學(xué)習(xí)途中的菜鳥們共享:“歸根結(jié)底纲岭,技術(shù)是為業(yè)務(wù)服務(wù)的抹竹,技術(shù)選型和架構(gòu)決策依賴業(yè)務(wù)規(guī)劃乃至企業(yè)戰(zhàn)略規(guī)劃,離開業(yè)務(wù)發(fā)展的支撐和驅(qū)動止潮,技術(shù)走不遠(yuǎn)窃判,甚至還會迷路”。出來實(shí)習(xí)了一年多喇闸,對這句話感慨頗多袄琳,也吃了很多的虧,在和客戶的溝通交流上也有了自己的一點(diǎn)感悟仅偎,所以貼出來與各位園友共勉跨蟹。最后雳殊,希望作為菜鳥的我們橘沥,在技術(shù)這條路上能夠走得遠(yuǎn)一些,迷路不重要夯秃,重要的是能夠迷途知返座咆,么么嗒!再過一個(gè)多月仓洼,就要開始找工作了介陶,希望在此期間能夠認(rèn)真閱讀完自己的計(jì)劃書單,加油色建!

參考文獻(xiàn)

(1)李智慧哺呜,《大型網(wǎng)站技術(shù)架構(gòu)-核心原理與案例分析》,http://item.jd.com/11322972.html

(2)周言之箕戳,《Memcached詳解》某残,http://blog.csdn.net/zlb824/article/details/7466943

(3)百度百科,CDN陵吸,http://baike.baidu.com/view/8689800.htm

(4)王晨純玻墅,《Web基礎(chǔ)架構(gòu):負(fù)載均衡和LVS》,http://www.importnew.com/11229.html

(5)輝之光壮虫,《B樹澳厢、B-樹、B+樹》,http://www.cnblogs.com/oldhorse/archive/2009/11/16/1604009.html

(6)yanghuahui's blog剩拢,《LSM樹由來线得、設(shè)計(jì)思想以及應(yīng)用到HBase的索引》,http://www.cnblogs.com/yanghuahui/p/3483754.html

本章思維導(dǎo)圖

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末徐伐,一起剝皮案震驚了整個(gè)濱河市框都,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌呵晨,老刑警劉巖魏保,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異摸屠,居然都是意外死亡谓罗,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進(jìn)店門季二,熙熙樓的掌柜王于貴愁眉苦臉地迎上來檩咱,“玉大人,你說我怎么就攤上這事胯舷】舔牵” “怎么了?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵桑嘶,是天一觀的道長炊汹。 經(jīng)常有香客問我,道長逃顶,這世上最難降的妖魔是什么讨便? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮以政,結(jié)果婚禮上霸褒,老公的妹妹穿的比我還像新娘。我一直安慰自己盈蛮,他們只是感情好废菱,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著抖誉,像睡著了一般殊轴。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上寸五,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天梳凛,我揣著相機(jī)與錄音,去河邊找鬼梳杏。 笑死韧拒,一個(gè)胖子當(dāng)著我的面吹牛淹接,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播叛溢,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼塑悼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了楷掉?” 一聲冷哼從身側(cè)響起厢蒜,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎烹植,沒想到半個(gè)月后斑鸦,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡草雕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年巷屿,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片墩虹。...
    茶點(diǎn)故事閱讀 40,675評論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡嘱巾,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出诫钓,到底是詐尸還是另有隱情旬昭,我是刑警寧澤,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布菌湃,位于F島的核電站问拘,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏慢味。R本人自食惡果不足惜场梆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望纯路。 院中可真熱鬧,春花似錦寞忿、人聲如沸驰唬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽叫编。三九已至,卻和暖如春霹抛,著一層夾襖步出監(jiān)牢的瞬間搓逾,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工杯拐, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留霞篡,地道東北人世蔗。 一個(gè)月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像朗兵,于是被迫代替她去往敵國和親污淋。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評論 2 360

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