目錄

尋找當下 Linux OS 效能瓶頸

常常聽到一些客戶反映他們的系統速度很慢,但通常無法明確指出慢在哪里。這裡提供一個簡單的方法,當遇到當下系統速度變慢的情況時,可以通過一些數字來判斷瓶頸點(Bound)。這篇文章僅從操作系統層面進行說明,不涉及應用程序層級的效能問題。

/2024/08/20240802-identifying-linux-performance-bottlenecks/linux_observability_sar.png

系統壓力觀測目標

sar - Clliect, report, or save system activity information

本文將使用 sar 系統活動報告器來貫穿所有操作,主要觀測點有以下五個:

  1. CPU
  2. Disk I/O
  3. Network
  4. Memory
  5. Swap

選用 sar 的理由如下:

  1. 數據收集過程對系統本身造成的壓力最小
  2. 大多數 Linux 發行版均可使用
  3. 指令簡單易用
  4. 是目前 Linux 上較為全面的系統效能分析工具之一

環境介紹

  • Archlinux

安裝

1
sudo pacman -S sysstat

常常遇到的問題

[聲明] 如果以下的欄位解釋覺得翻譯得不好,可以參考 man sar 的英文版解釋

懷疑系統是不是真的忙?

1
sar -q 1 60
  • 指令解釋: 每隔 1 秒收集一次,一共收集 60 次平均常見的負載 (1m / 5m / 15m)數字

/2024/08/20240802-identifying-linux-performance-bottlenecks/sar-q.PNG

  • 欄位解釋:

    • 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 Bound?

1
2
sar -u 2 10 //看 CPU Overview 使用率 (與 mpstat 相同)
sar -P ALL 2 10 //看個別 CPU 使用率 (與 mpstat -P ALL 相同)
  • 指令解釋: 每隔 2 秒收集一次,一共收集 10 次所有 CPU 的效能數據

/2024/08/20240802-identifying-linux-performance-bottlenecks/sar-u.PNG

/2024/08/20240802-identifying-linux-performance-bottlenecks/sar-P.PNG

  • 欄位解釋

    • %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?

1
sar -n DEV 2 10
  • 指令解讀: 每隔 2 秒收集一次,一共收集 10 次所有網卡的效能數據

/2024/08/20240802-identifying-linux-performance-bottlenecks/sar-n.PNG

  • 欄位解釋:

    • rxpck/s: 每秒接收到的封包量
    • txpck/s: 每秒傳送出的封包量
    • rxkB/s: 每秒接收到的 bytes 數量
    • txkB/s: 每秒傳送出的 bytes 數量
    • rxcmp/s: 每秒接收到的壓縮後封包
    • txcmp/s: 每秒傳送出的壓縮後封包
    • rxmcst/s: 每秒接收到的群播封包
    • %ifutil: 網路介面使用率
  • 數字解讀:

    • rxpck/stxpck/s 是衡量一張網卡效能的指標,數字越大壓力越大
    • rxkB/stxkB/s 是代表吞吐量效能,數字越大壓力越大

懷疑是 Memory?

1
sar -r 2 10
  • 指令解釋: 每隔 2 秒收集一次,一共收集 10 次記憶體的效能數據

/2024/08/20240802-identifying-linux-performance-bottlenecks/sar-r.PNG

  • 欄位解釋

    • 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?

1
sar -W 2 10
  • 指令解讀: 每隔 2 秒收集一次,一共收集 10 次 Swap page out/in 的效能數據

/2024/08/20240802-identifying-linux-performance-bottlenecks/sar-W.PNG

  • 欄位解釋

    • pswpin/s: 每秒系統 Swap page IN 的數量
    • pswpout/s: 每秒系統 Swap page Out 的數量
  • 數字解讀

    • 這個只要有數字跳出來,伺服器處理吞吐量會大幅下降,這時候要先確定是不是記憶體夠不夠

懷疑是 Disk I/O Bound?

1
sar -d 2 10
  • 指令解讀: 每隔 2 秒收集一次,一共收集 10 次 Disk I/O 的效能數據

/2024/08/20240802-identifying-linux-performance-bottlenecks/sar-d.PNG

  • 欄位解釋

    • 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 進行快速的初步了解,建立一個基本的認識,然後再花時間規劃更長期的系統監控方式。

References