尋找當下 Linux OS 效能瓶頸
目錄
常常聽到一些客戶反映他們的系統速度很慢,但通常無法明確指出慢在哪里。這裡提供一個簡單的方法,當遇到當下
系統速度變慢的情況時,可以通過一些數字
來判斷瓶頸點(Bound)。這篇文章僅從操作系統層面進行說明,不涉及應用程序層級的效能問題。
系統壓力觀測目標
sar - Clliect, report, or save system activity information
本文將使用 sar
系統活動報告器來貫穿所有操作,主要觀測點有以下五個:
- CPU
- Disk I/O
- Network
- Memory
- Swap
選用 sar 的理由如下:
- 數據收集過程對系統本身造成的壓力最小
- 大多數 Linux 發行版均可使用
- 指令簡單易用
- 是目前 Linux 上較為全面的系統效能分析工具之一
環境介紹
- Archlinux
安裝
|
|
常常遇到的問題
[聲明] 如果以下的欄位解釋覺得翻譯得不好,可以參考
man sar
的英文版解釋
懷疑系統是不是真的忙?
|
|
- 指令解釋: 每隔 1 秒收集一次,一共收集 60 次平均常見的負載 (1m / 5m / 15m)數字
欄位解釋:
- runq-sz: 運行中的 Quene 長度 (等待運行的 Tasks 數)
- plist-sz: Tasks 列表中的 tasks 數量
- ldavg-1: 最後 1 分鐘的系統平均負載量
- ldavg-5: 最後 5 分鐘的系統平均負載量
- ldavg-15: 最後 15 分鐘的系統平均負載量
數字解讀:
- 現在都是支援多核 CPU,故
n
個 CPU Core,可接受的系統負荷最大n.0
- 確認系統核心數的指令是
grep -c 'model name' /proc/cpuinfo
- 通常來講是看
ldavg-15
,如果長期接近或大於 n 的話,就是系統負擔過大
- 現在都是支援多核 CPU,故
懷疑是 CPU Bound?
|
|
- 指令解釋: 每隔 2 秒收集一次,一共收集 10 次所有 CPU 的效能數據
欄位解釋
- %user: 於 User (Application) 等級之下,消耗的 CPU 時間比例
- %nice: 透過
nice
改變優先級,於 User (Application) 等級之下,消耗的 CPU 時間的比例 - %system: 於 System (Kernel) 等級之下,消耗的 CPU 時間比例
- %iowait: CPU 等待 Disk I/O 導致空閑狀態 (Idle) 消耗的時間比例
- %steal: 利用虛擬化技術,等待其他 vCPU 計算佔用的時間比例
- %idle: CPU 空閑時間比例
數字解讀
%iowait
過高,有可能是 Disk I/O 瓶頸,要改善 Disk%idle
過高,有可能是 CPU 等待分配 Memory,要看一下記憶體是不是不夠%idle
持續低於 10,則代表 CPU 處理效率低,需要解決 CPU 瓶頸
懷疑是 Network Bound?
|
|
- 指令解讀: 每隔 2 秒收集一次,一共收集 10 次所有網卡的效能數據
欄位解釋:
- rxpck/s: 每秒接收到的封包量
- txpck/s: 每秒傳送出的封包量
- rxkB/s: 每秒接收到的 bytes 數量
- txkB/s: 每秒傳送出的 bytes 數量
- rxcmp/s: 每秒接收到的壓縮後封包
- txcmp/s: 每秒傳送出的壓縮後封包
- rxmcst/s: 每秒接收到的群播封包
- %ifutil: 網路介面使用率
數字解讀:
rxpck/s
和txpck/s
是衡量一張網卡效能的指標,數字越大壓力越大rxkB/s
和txkB/s
是代表吞吐量效能,數字越大壓力越大
懷疑是 Memory?
|
|
- 指令解釋: 每隔 2 秒收集一次,一共收集 10 次記憶體的效能數據
欄位解釋
- kbmemfree: 閒置的 Free Memory 大小
- kbavail: 無需透過 Swapping 即可使用的 Memory 大小
- kbmemused: 使用中的 Memory
- %memused: 物理記憶體使用率
- kbbuffers: Kernel 拿去作為 Buffer 的大小
- kbcached: Kernel 拿取當作 Cached 的大小
- kbcommit: Kernel 當前工作負載所需要的量,這是預估需要多少 RAM/Swap,以保證不會有記憶體不足的估計值
- %commit: Kernel 當前工作負載所需記憶體佔記憶體總量 (RAM + Swap) 的百分比
- kbactive: 活躍中的記憶體,除非必要,通常不會回收 (Reclaimed)
- kbinact: 不活躍中的記憶體,最近被使用的次數較少,有可能會被回收
- kbdirty: 等待寫回至磁碟的記憶體內容
數字解讀
- 透過
%memused
kbbuffers
kbcached
可以了解到記憶體實際使用量 %commit
這是kbcommit
與記憶體總量 (包含swap) 的百分比數字,越小代表記憶體越足夠%commit
有可能會大於 100%,有可能 Kernel 使用過量記憶體
- 透過
懷疑是 Swap Page Bound?
|
|
- 指令解讀: 每隔 2 秒收集一次,一共收集 10 次 Swap page out/in 的效能數據
欄位解釋
- pswpin/s: 每秒系統 Swap page IN 的數量
- pswpout/s: 每秒系統 Swap page Out 的數量
數字解讀
- 這個只要有數字跳出來,伺服器處理吞吐量會大幅下降,這時候要先確定是不是記憶體夠不夠
懷疑是 Disk I/O Bound?
|
|
- 指令解讀: 每隔 2 秒收集一次,一共收集 10 次 Disk I/O 的效能數據
欄位解釋
- tps: 設備每秒數據傳輸量
- rkB/s: 每秒從設備讀取的資料量
- wkB/s: 每秒寫入到設備的資料量
- dkB/s: 每秒被設備丟棄的資料量
- areq-sz: 發出到設備 I/O 請求的平均資料大小
- aqu-sz: 發出到設備的 I/O 請求的平均 Queue 長度
- await: 發出到服務的設備請求 I/O 的平均反應時間
- %util: 向設備發出 I/O 請求的經過時間百分比
數字解讀
%util
數值越大越忙- 如果剛好有 raid 之類的話,
%util
有可能會大於 100% iostat
比較詳細,針對 Disk I/O 更建議使用
結語
當然,sar
並不是長期監控的最佳方案,更推薦使用 Performance Co-Pilot (PCP)
PCP 快速入門 來進行系統的長期監控與維護。
通過此篇文章,希望大家在遇到系統變慢的情況時,可以先利用 sar
進行快速的初步了解,建立一個基本的認識,然後再花時間規劃更長期的系統監控方式。