性能分析與優化

測試種類

在這裏插入圖片描述

在這裏插入圖片描述

壓力測試

  • 壓力測試是評估系統處於或超過預期負載時系統的運行情況
  • 在壓力級別逐漸增加時,系統性能應該按照預期緩慢下降,但是不應該崩潰
  • 壓力測試還可以發現系統崩潰的臨界點,從而發現系統中的薄弱環節

性能數值

IO

在這裏插入圖片描述

  • IO 讀寫延遲:一般是用 4KB 大小的 IO 做基準來測試
    • 如果一個隨機 8KB 或 16KB 數據的對硬盤的讀寫,測量出的延遲不到 1 毫秒,那就實在是“太快”了;可以肯定它是命中某種緩存了
  • IO 帶寬:一般是針對比較大的 IO 而言;
  • IOPS:就是每秒鐘可以讀寫多少個小的隨機 IO

緩存

在這裏插入圖片描述

操作系統

  • 指令分支預判錯誤:10ns
  • 互斥鎖加、解鎖:10ns
  • 上下文切換:1us

網絡

  • 200 毫秒延遲,是多數在線用戶可以忍受的最大延遲

  • RTT與距離的關係:每100公里增加1ms
    在這裏插入圖片描述

性能指標

在這裏插入圖片描述

在這裏插入圖片描述

  • 最核心的幾個個性能指標:TPS,RS和錯誤率
  • 服務延遲
    • 指的是客戶發出的請求被成功服務的時間
  • 吞吐率
    • 指的是單位時間(比如每秒鐘)可以成功處理的請求數或任務數
    • 如果吞吐率很低,服務延遲往往會非常穩定。當吞吐率增高時,訪問延遲一般會快速增加

在這裏插入圖片描述

  • 資源使用率
    • 直接決定了系統和服務的運營成本

性能瓶頸

在這裏插入圖片描述

CPU

  • 超線程
    • 當處理器在運行一個線程,執行指令代碼時,很多時候處理器並不會使用到全部的計算能力,部分計算能力就會處於空閒狀態
    • 比如一個線程運行過程中,必須要等待一些數據加載到緩存中以後才能繼續執行,此時 CPU 就可以切換到另一個線程,去執行其他指令,而不用去處於空閒狀態,等待當前線程的數據加載完畢
    • 一個傳統的處理器在線程之間切換,可能需要幾萬個時鐘週期
      • 而一個具有超線程技術的處理器只需要 1 個時鐘週期。因此就大大減小了線程之間切換的成本,從而最大限度地讓處理器滿負荷運轉
  • 因爲 CPU 架構的複雜性,以及和其他部件的交互,CPU 的使用率和負載的關係往往不是線性的
    • 如果 10% 的 CPU 使用率可以每秒處理 1 千個請求,那麼 80% 的 CPU 使用不太可能處理每秒 8 千個請求,往往會遠遠小於這個數字
  • 和 CPU 相關的性能問題,基本上就是表現爲 CPU 超載或者空閒
    • CPU 超載多數情況下都不一定是合理的超載,比如說多核之間的負載沒有平衡好,或者 CPU 幹了很多沒用的活
    • CPU 空閒或許是指令裏面太多內存數據操作,從而造成 CPU 停頓,也或許是太多的分支預測錯誤

內存

  • 內存訪問帶寬

    • 單位時間內,可以並行讀取或寫入內存的數據量,通常以字節 / 秒爲單位表示
    • 當內存帶寬較小時,內存訪問延遲很小,而且基本固定,最多緩慢上升。而當內存帶寬超過一定值後,訪問延遲會快速上升,最終增加到不能接受的程度
    • 內存總帶寬的大小一般是四個因素的乘積
      • DRAM 時鐘頻率、每時鐘的數據傳輸次數、內存總線帶寬(一般是 64 字節)、內存通道數量
  • L3緩存命中的失效不僅會導致內存訪問延遲,還會受限於內存帶寬
    在這裏插入圖片描述

  • 應用程序向操作系統申請內存時,系統需要查找可用內存並分配,這中間總要花些時間

    • 一個系統的空閒內存越多,應用程序向操作系統申請內存的時候,就越快地拿到所申請的內存。反之,應用程序就有可能經歷很大的內存請求分配延遲
    • 在系統空閒內存很少的時候,程序很可能會變得超級慢。因爲操作系統對內存請求進行(比如 malloc())處理時,如果空閒內存不夠,系統需要採取措施回收內存,這個過程可能會阻塞
  • 直接使用 new、malloc 等 API 申請分配內存,所申請內存塊的大小不定。當這樣的內存申請頻繁操作時,會造成大量的內存碎片;這些內存碎片會導致系統性能下降

    • 開發應用程序時,採用內存池(Memory Pool)可以看作是一種內存分配方式的優化
    • 這樣做的一個顯著優點是儘量避免了內存碎片,使得內存分配效率和系統的總體內存使用效率得到提升

網絡

  • 常用指標:可用性,響應時間,帶寬容量,吞吐量,網絡利用率
    在這裏插入圖片描述
  • 多層次網絡結構中,一般是越往上層,總的帶寬越少
    • 因爲多數的數據交換是在內部進行的,不會全部都和外部進行交換
    • 不要讓高層的網絡帶寬成爲性能瓶頸
      • 儘量讓有大量數據交換的服務在一起部署(比如部署在同一個機架內)
      • 比如假設兩個服務分別用不同的服務器,它們之間的數據交換如果很多的話,就儘量讓它們運行在同一個機櫃的服務器裏面;如果不能保證同一個機櫃,就儘量是同一個 POD 內部
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章