如何提升網站的效能?

朱小廝發表於2016-02-18

概述

  效能是網站的一個重要指標,除非是沒得選擇(比如12306),否則使用者無法忍受一個響應緩慢的網站。一個開啟緩慢的網站會導致嚴重的使用者流失,很多時候網站效能問題是網站架構升級優化的觸發器。可以說效能是網站架構設計的一個重要方面,任何軟體架構設計方案都必須考慮可能會帶來的效能問題。
  也正是因為效能問題幾乎無處不在,所以優化網站效能的手段也非常多,從使用者瀏覽器到資料庫,影響使用者請求的所有環節都可以進行效能優化。
  在瀏覽器端,可以通過瀏覽器快取、使用頁面壓縮、合理分佈頁面、減少Cookie傳輸等改善效能。
  還可以使用CDN,將網站靜態內容分發至離使用者最近的網路服務商機房,使使用者通過最短訪問路徑獲取資料。可以在網站機房部署反向代理伺服器,快取熱點檔案,加快請求響應速度,減輕應用伺服器負載壓力。(Nigix)
  在應用伺服器端,可以使用伺服器本地快取和分散式快取,通過快取在記憶體中的熱點資料處理使用者請求,加快請求處理過程,減輕資料庫負載壓力。(Redis, Memecache, JBoss Cache, Ehcache)
  也可以通過非同步操作將使用者請求傳送至訊息佇列等待後續任務處理,而當前請求直接返回給使用者。(RabbitMq, Kafka)
  在網站有很多使用者高併發請求的情況下,可以將多臺應用伺服器組成一個叢集共同對外服務,提高整體處理能力,改善效能。
  在程式碼層面,也可以通過使用多執行緒、改善記憶體管理等手段優化效能。
  在資料庫伺服器端,索引、快取、SQL優化等效能優化手段都已經比較成熟。而方興未艾的NoSQL資料庫通過優化資料模型、儲存結構、伸縮特性等手段在效能方面的優勢也日趨明顯。(MongoDB, HBase)
  衡量網站效能有一系列指標,重要的有響應時間、TPS、系統效能計數器等,通過測試這些指標以確定系統設計是否達到目標。這些指標也是網站監控的重要引數,通過監控這些指標可以分析系統瓶頸,預測網站容量,並對異常指標進行報警,保障系統可用性。
  對於網站而言,效能符合預期僅僅是必要條件,因為無法預知網站可能會面臨的訪問壓力,所以必須要考察系統在高併發訪問情況下,超出負債設計能力的情況下可能會出現的效能問題。網站需要長時間持續執行,還必須保證系統在持久執行且訪問壓力不均勻的情況下保持穩定的效能特性。


效能測試指標

  1. 響應時間
  2. 併發數
  3. 吞吐量
  4. 效能計數器

效能測試方法

  效能測試是一個不斷對系統增加訪問壓力,以獲得系統效能指標、最大負載能力、最大壓力承受能力的過程。
  效能測試方法:

  1. 效能測試: 以系統設計初期規劃的效能指標為預期目標,對系統不斷施加壓力,驗證系統在資源可接受範圍內,是否能達到效能預期。
  2. 負載測試
    對系統不斷地增加併發請求以增加系統壓力,知道系統的某項或多項效能指標達到安全臨界值,如某種資源已經呈飽和狀態,這是繼續對系統施加壓力,系統的處理能力不但不提高,反而會下降。
  3. 壓力測試 超過安全負載的情況下,對系統繼續施加壓力,知道系統崩潰或不能再處理請求,一次獲得系統最大壓力承受能力。
  4. 穩定性測試
    被測試系統在特定硬體、軟體、網路環境條件下,給系統載入一定業務壓力,使系統執行一段較長時間,以此檢測系統是否穩定。在不同生成環境、不同時間點的請求壓力是不均勻的,呈波浪特性,因此為了更好地模擬生產環境,穩定性測試也不應均與地對系統施加壓力。

效能優化

  根據網站分層架構,效能優化可分為:web前端效能優化、應用伺服器效能優化、儲存伺服器效能優化。

  1. web前端效能優化
    • 瀏覽器訪問優化:減少http請求;使用瀏覽器快取;啟用壓縮;css放在頁面最上面、javaScript放在頁面最下面;減少Cookie傳輸
    • CDN加速
    • 反向代理
  2. 應用伺服器效能優化
    • 分散式快取(Redis等)
    • 非同步操作(訊息佇列)
    • 使用叢集(負載均衡)
    • 程式碼優化
  3. 儲存效能優化
    • 機械硬碟vs固態硬碟
    • B+樹 vs LSM樹
    • RAID vs HDFS

程式碼優化
– 多執行緒(Q:怎麼確保執行緒安全?無鎖機制有哪些?)
– 資源複用(單例模式,連線池,執行緒池)
– 資料結構
– 垃圾回收

多執行緒三大定律
1. Amdahl 定律
–Gene Amdahl 發現在計算機體系架構設計過程中,某個部件的優化對整個架構的優化和改善是有上限的。這個發現後來成為知名的Amdahl 定律。
比如:即使你有10個老婆,也不能一個月把孩子生下來。
2. Gustafson 定律
–Gustafson假設隨著處理器個數的增加,並行與序列的計算總量也是可以增加的。Gustafson定律認為加速係數幾乎跟處理器個數成正比,如果現實情況符合Gustafson定律的假設前提的話,那麼軟體的效能將可以隨著處理個數的增加而增加。
比如:當你有10個老婆,就會要生更多的孩子。
3. Sun-Ni 定律
–充分利用儲存空間等計算資源,儘量增大問題規模以產生更好/更精確的解。
比如:你要設法讓每個老婆都在幹活,別讓她們閒著。


相關文章