天天看點

04 高性能架構

壓力測試, 不斷地增加并發數量.

性能測試: 日常的營運 a - b, b點是日常的最高值.

負載測試: b-c, 模拟的是通路高峰, 可以看到系統最大負載是 c 點.

壓力測試: 超過 c 點, 系統資源繼續增加, 但是TPS卻在走下坡路. 直到 d 點(耗費資源到達極限, 系統崩潰)

04 高性能架構
04 高性能架構
04 高性能架構

性能優化政策

如果性能測試結果不能滿足設計或業務需求,就需要尋找系統瓶頸,分而治之,逐漸優化。

1. 性能分析

必須對請求經曆的各個環節進行分析,排查可能存在的性能瓶頸。

檢查請求處理的各個環節的日志,分析哪個環節響應時間不合理,監控資料,分析主要因素 如 記憶體,磁盤I/O, 網絡, CPU, 還是代碼架構不合理。

定位到問題後,要進行優化

2. web 前端優化

浏覽器加載,網站視圖模型,圖檔服務,CDN服務,主要優化手段有 浏覽器通路,反向代理,CDN等.

浏覽器優化
  1. 減少 http 請求次數, HTTP是無狀态的應用協定,意味着每次 HTTP 請求都需要建立通信鍊路,資料傳輸,而在伺服器端都需要獨立線程去處理.減少 http 的主要手段是 合并 css, 合并 javascript, 合并圖檔, 将浏覽器一次通路需要的 javascript, css 合并成一個檔案,這樣浏覽器隻需要請求一次 圖檔也可以合并,多張圖檔合并成一張.
  2. 用浏覽器緩存, 對一個網站, css, javascript, Logo, 圖示這些靜态資源更新頻率比較低,而這些檔案幾乎是每次 HTTP 請求都需要的,如果将這些檔案緩存在浏覽器中,可以極好的改善性能,通過設定 HTTP 頭中 Cache-Control 和 Expires 的屬性, 可設定浏覽器緩存.
  3. 啟用壓縮, 在伺服器端對檔案進行壓縮,在浏覽器端對檔案解壓縮,可有效減少通信傳輸的資料量. 
  4. CSS 放在網頁最上面,javascript 放在最下面,浏覽器會在下載下傳完全部 CSS 之後才對整個頁面進行渲染
  5. 減少 Cookie 傳輸,哪些資料需要寫入 Cookie 需要慎重考慮,減少 Cookie 中傳輸的資料量, 另外, 對于某些靜态資源的通路, 如 CSS, JavaScript 等,發送 Cookie 沒有意義,可以考慮靜态資源使用獨立域名通路,避免請求靜态資源時發送Cookie, 減少 Cookie傳送的次數.
CDN 加速

CDN 能夠緩存靜态資源,如圖檔,檔案,css, JavaScript腳本,靜态網頁等, 但這些檔案通路頻度很高,将其緩存在 CDN可極大改善網頁的打開速度。

反向代理

反向代理也可以緩存靜态資源.

3. 應用伺服器性能優化

這部分是我們的優化範圍(重點), 主要手段有 緩存,叢集,異步

分布式緩存

對資料緩存,對檔案緩存,對頁面片段緩存(網站性能優化第一定律:優先考慮緩存優化性能)

網站資料通路通常遵循二八定律, 即80%的通路落在20%的資料上. 

合理使用緩存, 頻繁修改的資料,沒有熱度通路的資料 都不适合使用緩存. 另外緩存有可能造成資料的不一緻性(髒讀),一般會設定緩存的有效期

緩存高可用, 可以通過緩存伺服器叢集, 當一台緩存伺服器當機時,隻有部分緩存資料丢失,重新從資料庫加載對資料庫影響不大。

緩存預熱: 在緩存啟動時,加載熱點資料。

緩存穿透: 在緩存中沒有,請求都是直接通路DB.

04 高性能架構
異步操作 

使用消息隊列

04 高性能架構

消息隊列具有很好的削峰作用-異步處理, 将高并發儲存在消息隊列裡。

使用叢集 

利用負載均衡,将任務發送到不同的web伺服器上(組成叢集)

優化代碼

業務邏輯主要在應用伺服器上,合理優化代碼,可以很好改善性能。

  1. 多線程 (注意線程安全,并發通路資源時加鎖)
  2. 資源複用 (盡量減少哪些開銷很大的系統資源的建立和銷毀,比如資料庫連接配接,網絡通信連接配接 等) 從程式設計角度,複用主要有兩個形式: 單例(Singleton) 和 對象池(Object Pool). 對于資料庫連接配接對象,每次建立連接配接,資料庫服務端都需要建立專門資源以應對,是以頻繁的關閉資料庫連接配接,對資料庫伺服器而言是災難性的,是以實踐中,應用程式的資料庫連接配接基本都使用連接配接池(connection pool)的方式,資料庫連接配接對象建立好後,将連接配接對象放入對象池容器中,應用程式要連接配接的時候,就從對象池中擷取一個空閑的連接配接使用,使用完畢歸還對象到對象池中,不需要重新建立連接配接. (也不需要關閉連接配接), 對于每一個 Web請求, Web 應用伺服器都需要建立一個獨立的線程去處理,應用伺服器也是采用線程池的方式,本質上都是對象池.
  3. 資料結構
  4. 垃圾回收, JVM 合理設定各個記憶體區域的大小,減少 Full GC 的運作次數,某些 Web應用在整個運作期間可以做到從不 Full GC.

4. 存儲優化

存儲媒體的速度(機械硬碟, 普通硬碟, SAN,NAS)等, 存儲備援備份的優化( RAID0, HDFS 等)

繼續閱讀