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