第一行是記憶體使用狀態,讀取 /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