2021年10月23日 星期六

busybox top

第一行是記憶體使用狀態,讀取 /proc/meminfo 顯示 ...。

第二行是整體 CPU 使用率,讀取 /proc/stat 而來

第三行是系統負載,讀取 /proc/loadavg。

剩下部份是依資源使用多寡排行的 process 列表,主要資料是掃描每一個 /proc/<PID>/stat 整理而來。

原始碼 procps/top.c

  • 透過 libbb 函數 procps_scan(flags) 逐次讀取 /proc 下的 <PID> 目錄得知 pid,依據 flags 取得相關資訊。procps_scan() 用在 ps、top、pgrep、kill、和 find_pid_by_name()。
    • getpidcon()
    • /proc/<PID>/ 目錄的 Effective uid/gid,
    • /proc/<PID>/stat 得到 ppid、vsz (in KB)、ticks (stime+utime)、state 字串、comm 字串等。
  • 預設啟用 FEATURE_TOP_CPU_USAGE_PERCENTAGE 功能,顯示每個 process 的 CPU 使用比率,會執行 do_stats() 在 get_jiffy_counts() 讀取 /proc/stat
    • /proc/stat 第一行開頭是 cpu,是全部 cpu 的統計,後面有 8 個數字表示累積使用的 jiffy,分別是 usr、nic、sys、idle、iowait、irq、softirq、和 steal。這 8 個數字加起來是 total,busy 是 total 減去 idle 和 iowait。接下來是各個 cpu 的統計,有同樣格式。
    • 由於是統計是累積的 jiffy,需要保留上個週期讀取的結果,相減計算才是這個週期的比例。
  • /proc/meminfo (比較 free)
  • FEATURE_TOP_CPU_USAGE_PERCENTAGE 時能啟用 FEATURE_TOP_CPU_GLOBAL_PERCENTS_功能,顯示 CPU  用在 usr、sys、nic、idle、io、irq 和 sirq 比率 %,算法是 (這次的值 - 上次的值)/(這次的 total - 上次的 total)。
  • /proc/loadavg (比較 uptime)
參數
  • -d <秒數>:顯示週期,預設 5 秒。
  • -n <次數>:顯示次數,預設無限。
  • -b:batch mode,接續全部顯示,沒有 run-time 指令而無法離開。預設只顯示一整頁,有 run-time 指令。
  • -m:[FEATURE_TOPMEM] (busybox 特有選項)

run-time 指令

  • q:離開
  • n:pid 排序
  • m:記憶體排序優先
  • h
  • p:pcpuc 排序優先
  • t:time 排序優先
  • s:[FEATURE_TOPMEM]
  • r:[FEATURE_TOPMEM] 反向?
  • c 或 1:照 CPU 用量?

ENABLE_FEATURE_FAST_TOP:大約增加 100 bytes,但讓 top 快 20%。如果有上萬 processes 可能就很重要。

參考

  • top
  • /proc/loadavg:前面三個欄位分別是 1、5、15 分鐘平均 job 數目在 run queue (state R) 或等候 disk I/O (state D)。第四的欄位是所有 thread 中多少 runnable。第五個欄位是最後建立的 PID。
  • Linux Load Averages: Solving the Mystery

沒有留言:

張貼留言

SIP header Via

所有 SIP 訊息 都要有 Via,縮寫 v。一開始的 UAC 和後續途經的每個 proxy 都會疊加一個 Via 放傳送的位址,依序作為回應的路徑。 格式 sent-protocol sent-by [ ;branch= branch ][ ; 參數 ...] s...