一、網(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)圖