《大型網站技術架構》網站的高性能架構及優化

1、網站性能測試

(1)性能測試指標:①響應時間;②併發數;③吞吐量;④性能計數器; css

(2)性能測試方法:①性能測試;②負載測試;③壓力測試;④穩定性測試; html

(3)性能優化策略: 前端

  ①性能分析:檢查請求處理各個環節的日誌,分析哪一個環節響應時間不合理,檢查監控數據分析影響性能的因素; 算法

  ②性能優化:Web前端優化,應用服務器優化,存儲服務器優化; 數據庫

2、Web前端性能優化

(1)瀏覽器訪問優化: 瀏覽器

  ①減小http請求:由於http是無狀態的,每次請求的開銷都比較昂貴(須要創建通訊鏈路、進行數據傳輸,而服務器端對於每一個http請求都須要啓動獨立的線程去處理);減小http的主要手段是合併CSS、合併JS、合併圖片(CSS精靈,利用偏移定位image); 緩存

  ②使用瀏覽器緩存:設置http頭中Cache-Control和Expires屬性; 安全

  ③啓用壓縮:能夠對html、css、js文件啓用Gzip壓縮,能夠達到較高的壓縮效率,可是壓縮會對服務器及瀏覽器產生必定的壓力; 性能優化

  ④CSS放頁面最上面,JS放頁面最下面:瀏覽器會在下載徹底部CSS以後纔開始對整個頁面進行渲染,所以最好將CSS放在頁面最上面;而瀏覽器在加載JS後會當即執行,有可能會阻塞整個頁面,形成頁面顯示緩慢,所以最好將JS放在頁面最下面; 服務器

  ⑤減小Cookie傳輸:一方面,太大的Cookie會嚴重影響數據傳輸;另外一方面,對於某些靜態資源的訪問(如CSS、JS等)發送Cookie沒有意義;

(2)CDN加速:

  CDN(內容分發網絡)仍然是一個緩存,它將數據緩存在離用戶最近的地方,便於用戶以最快速度獲取數據。即所謂的「網絡訪問第一跳」,以下圖所示:

CDN

  CDN只將訪問頻度很高的熱點內容(例如:圖片、視頻、CSS、JS腳本等訪問頻度很高的內容)進行緩存,能夠極大地加快用戶訪問速度,減小數據中心負載。

(3)反向代理:

  反向代理服務器位於網站機房,代理網站Web服務器接收Http請求,對請求進行轉發,以下圖所示:

  反向代理服務器具備如下功能:

  ①保護網站安全:任何來自Internet的請求都必須先通過代理服務器;

  ②經過配置緩存功能加速Web請求:減輕真實Web服務器的負載壓力;

  ③實現負載均衡:均衡地分發請求,平衡集羣中各個服務器的負載壓力;

3、應用服務器性能優化

(1)分佈式緩存:

PS:網站性能優化第必定律:優先考慮使用緩存優化性能。緩存是指將數據存儲在相對較高訪問速度的存儲介質中(如內存),以供系統進行快速處理響應用戶請求。

  ①緩存本質是一個內存Hash表,數據以(Key,Value)形式存儲在內存中。

  ②緩存主要用來存放那些讀寫比很高、不多變化的數據,如商品的類目信息、熱門商品信息等。這樣,應用程序讀取數據時,先到緩存中取,如緩存中沒有或失效,再到數據庫中取出,從新寫入緩存以供下一次訪問。所以,能夠很好地改善系統性能,提升數據讀取速度,下降存儲訪問壓力

  ③分佈式緩存架構:一方面是以以JBoss Cache爲表明的互相通訊派;另外一方面是以Memcached爲表明的互不通訊派;

  JBoss Cache須要將緩存信息同步到集羣中的全部機器,代價比較大;而Memcached採用一種集中式的緩存集羣管理,緩存與應用分離部署,應用程序經過一致性Hash算法選擇緩存服務器遠程訪問緩存數據,緩存服務器之間互不通訊,於是集羣規模能夠輕易地擴容,具備良好的伸縮性。

  Memcached由兩個核心組件組成:服務端(ms)和客戶端(mc),在一個memcached的查詢中,mc先經過計算key的hash值來肯定kv對所處在的ms位置。當ms肯定後,客戶端就會發送一個查詢請求給對應的ms,讓它來查找確切的數據。由於這之間沒有交互以及多播協議,因此 memcached交互帶給網絡的影響是最小化的。

(2)異步操做:

  ①使用消息隊列將調用異步化,可改善網站的擴展性,還可改善網站性能;

  ②消息隊列具備削峯的做用->將短期高併發產生的事務消息存儲在消息隊列中,從而削平高峯期的併發事務;

PS:任何能夠晚點作的事情都應該晚點再作。前提是:這個事兒確實能夠晚點再作。

(3)使用集羣:

  ①在高併發場景下,使用負載均衡技術爲一個應用構建多臺服務器組成的服務器集羣;

  ②能夠避免單一服務器因負載壓力過大而響應緩慢,使用戶請求具備更好的響應延遲特性

  ③負載均衡能夠採用硬件設備,也能夠採用軟件負載。商用硬件負載設備(例如出名的F5)成本一般較高(一臺幾十萬上百萬很正常),因此在條件容許的狀況下咱們會採用軟負載,軟負載解決的兩個核心問題是:選誰、轉發,其中最著名的是LVS(Linux Virtual Server)。

PS:LVS是四層負載均衡,也就是說創建在OSI模型的第四層——傳輸層之上,傳輸層上有咱們熟悉的TCP/UDP,LVS支持TCP/UDP的負載均衡。

LVS的轉發主要經過修改IP地址(NAT模式,分爲源地址修改SNAT和目標地址修改DNAT)、修改目標MAC(DR模式)來實現。有關LVS的詳情請參考:http://www.importnew.com/11229.html

(4)代碼優化:

  ①多線程:使用多線程的緣由:一是IO阻塞,二是多CPU,都是爲了最大限度地利用CPU資源,提升系統吞吐能力,改善系統性能;

  ②資源複用:目的是減小開銷很大的系統資源的建立和銷燬,主要採用兩種模式實現:單例(Singleton)和對象池(Object Pool)。例如,在.NET開發中,常用到的線程池,數據庫鏈接池等,本質上都是對象池。

  ③數據結構:在不一樣場合合理使用恰當的數據結構,能夠極大優化程序的性能。

  ④垃圾回收:理解垃圾回收機制有助於程序優化和參數調優,以及編寫內存安安全的代碼。這裏主要針對Java(JVM)和C#(CLR)一類的具備GC(垃圾回收機制)的語言。

4、存儲性能優化

(1)機械硬盤 仍是 固態硬盤?

  ①機械硬盤:經過馬達驅動磁頭臂,帶動磁頭到指定的磁盤位置訪問數據。它可以實現快速順序讀寫,慢速隨機讀寫

  ②固態硬盤(又稱SSD):無機械裝置,數據存儲在可持久記憶的硅晶體上,所以能夠像內存同樣快速隨機訪問

  在目前的網站應用中,大部分應用訪問數據都是隨機的,這種狀況下SSD具備更好的性能表現,可是性價比有待提高(蠻貴的,麼麼嗒)。

(2)B+樹 vs LSM樹

  ①傳統關係型數據庫普遍採用B+樹,B+樹是對數據排好序後再存儲,加快數據檢索速度。

PS:目前大多數DB多采用兩級索引的B+樹,樹的層次最多三層。所以可能須要5次磁盤訪問才能更新一條記錄(三次磁盤訪問得到數據索引及行ID,一次數據文件讀操做,一次數據文件寫操做,終於知道數據庫操做有多麻煩多耗時了)

  ②NoSQL(例如:HBase)產品普遍採用LSM樹:

  具體思想是:將對數據的修改增量保持在內存中,達到指定的大小限制後將這些修改操做批量寫入磁盤不過讀取的時候稍微麻煩,須要合併磁盤中歷史數據和內存中最近的修改操做,因此寫入性能大大提高,讀取時可能須要先看是否命中內存,不然須要訪問較多的磁盤文件。

  LSM樹的原理是:把一棵大樹拆分紅N棵小樹,它首先寫入內存中,隨着小樹愈來愈大,內存中的小樹會被清除並寫入到磁盤中,磁盤中的樹按期能夠作合併操做,合併成一棵大樹,以優化讀性能。

  LSM樹的優點在於:在LSM樹上進行一次數據更新不須要磁盤訪問,在內存便可完成,速度遠快於B+樹。

參考文獻

(1)李智慧,《大型網站技術架構-核心原理與案例分析》,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基礎架構:負載均衡和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樹由來、設計思想以及應用到HBase的索引》,http://www.cnblogs.com/yanghuahui/p/3483754.html

相關文章
相關標籤/搜索