top


整理 Linux 效能工具 top 的一些資訊,範例是在 ubuntu 16.04, AWS EC2 c5.large 上的資訊。


top

  • 上半部
  • 下半部
  • 控制指令

上半部

1
2
3
4
5
top - 12:46:35 up 6 days,  2:54,  1 user,  load average: 0.03, 0.01, 0.00
Tasks: 112 total, 1 running, 69 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.2 us, 0.0 sy, 0.0 ni, 99.8 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 3794276 total, 375408 free, 1904048 used, 1514820 buff/cache
KiB Swap: 0 total, 0 free, 0 used. 1600528 avail Mem

第一行資訊:

  1. 12:45:14: 系統目前的時間
  2. up 6 days, 2:52: 已經開機多久
  3. user: 目前系統有多少使用者登入
  4. load average: 系統負載狀況,分成每分鐘、每五分鐘、每十五分鐘

第二行:描述 Task 的狀態

  1. 112 個 Task
  2. 1 個在 running
  3. 69 個在 sleeping
  4. 0 個 stopped
  5. 0 個 zombie

第三行:描述 CPU 使用狀況

  • 0.2 us: user CPU time, User Space CPU 使用佔比
  • 0.0 sy: system CPU time, Kernel Space CPU 使用佔比
  • 0.0 ni: nice CPU time
  • 99.8 id: idle
  • 0.0 wa: iowait
  • 0.0 hi: Hardware IRQ, 硬體中斷 CPU 使用佔比
  • 0.0 si: Software Interrupts CPU 使用佔比
  • 0.0 st: steal time

Nice: Unix/Linux 裡程序 (Process) 的靜態優先級,範圍從 -20 ~ +19-20 最高優先,+19 最後,預設是 0。Nice 意思是『友好』,越高表示給予越多時間。更多參閱 Wikipedia: Nice

檢查 CPU 工具:

  1. apt-get install sysstat
  2. mpstat
  3. mpstat -P ALL
1
2
3
4
5
6
7
~$ mpstat -P ALL
Linux 4.15.0-1045-aws (ip-10-2-9-114) 09/09/19 _x86_64_ (2 CPU)

13:41:11 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
13:41:11 all 0.26 0.00 0.09 0.06 0.00 0.04 0.00 0.00 0.00 99.54
13:41:11 0 0.26 0.00 0.09 0.10 0.00 0.04 0.00 0.00 0.00 99.51
13:41:11 1 0.26 0.00 0.09 0.03 0.00 0.04 0.00 0.00 0.00 99.58

第四行:描述記憶體狀況

  • KiB Mem: 單位是 KiB
  • 3794276 total: 實體記憶體大小
  • 375408 free: 剩餘的記憶體大小
  • 1904048 used: 使用記憶體大小
  • 1514820 buff/cache: 緩衝、快取區大小

第五行:描述 SWAP (暫存記憶體) 狀況

  • KiB Swap:
  • 0 total: SWAP 總量
  • 0 free: SWAP 剩下的量
  • 0 used: SWAP 使用的量
  • 1600528 avail Mem: 可用的記憶體大小

下半部

下半部顯示的是 process 的狀態

1
2
3
4
5
6
7
8
9
10
11
12
13
 PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
4076 200 20 0 4168712 1.638g 25108 S 0.3 45.3 58:04.16 java
1 root 20 0 225240 9192 6908 S 0.0 0.2 0:05.62 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.01 kthreadd
4 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 kworker/0:0H
6 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 mm_percpu_wq
7 root 20 0 0 0 0 S 0.0 0.0 0:05.56 ksoftirqd/0
8 root 20 0 0 0 0 I 0.0 0.0 0:10.57 rcu_sched
9 root 20 0 0 0 0 I 0.0 0.0 0:00.00 rcu_bh
10 root rt 0 0 0 0 S 0.0 0.0 0:00.01 migration/0
11 root rt 0 0 0 0 S 0.0 0.0 0:00.44 watchdog/0
12 root 20 0 0 0 0 S 0.0 0.0 0:00.00 cpuhp/0
13 root 20 0 0 0 0 S 0.0 0.0 0:00.00 cpuhp/1

欄位的說明:

  • PID: ProcessID
  • USER: 使用者
  • PR: Process 優先序
  • NI: Nice 值,越小優先序越高
  • VIRT: virtual memory usage 虛擬記憶體使用,單位 KiB
    • 應用程式需要的虛擬記憶體大小,不是真實的使用記憶體。
    • man: The total amount of virtual memory used by the task. It includes all code, data and shared libraries plus pages that have been swapped out and pages that have been mapped but not used.
    • VIRT = SWAP + RES
  • RES: resident memory usage,該程序使用的、未被使用的記憶體大小。
    • man: A subset of the virtual address space (VIRT) representing the non-swapped physical memory a task is currently using. It is also the sum of the RSan, RSfd and RSsh fields. It can include private anonymous pages, private pages mapped to files (including program images and shared libraries) plus shared anonymous pages. All such memory is backed by the swap file represented separately under SWAP
    • RES = CODE + DATA
  • SHR: Share Memory 共享記憶體大小
  • S: 程序狀態
    • D: 不可中斷的睡眠狀態
    • R: 執行中
    • S: 睡眠中
    • T: 跟蹤/停止
    • Z: Zombie 程序
  • %CPU: 上次更新到現在的 CPU 佔比
  • %MEM: 程序使用的記憶體百分比
  • TIME+: 程序使用的 CPU 時間總計,單位為 1/100 s
  • COMMAND: 程序名稱

控制指令

底下是在 top 畫面時,可以使用的參數。

  • Global
    • s, d: 調整更新頻率
    • A: 同時顯示 動態、PID、Mem、CPU
    • H: Thread Mode, Default: off
    • 1: 一個或多個 CPU 顯示切換
    • z: 顏色
    • Z: 設定顏色
    • u: 指定要觀察的 使用者
    • h, ?: help
    • q: 離開 top
  • cli 參數: 輸出報表使用
    • b: batch
  • 控制上半部
    • l: 開或關上半部的第一行訊息
    • t: 依據切換以下訊息:
      • 開或關閉上半部的 Task 資訊
      • 切換第三行 CPU 的顯示方式,像是 Progress Bar
    • m: 關閉或者開啟第四行 Mem 和 第五行 Swap 的資訊
    • E: 切換單位
  • 控制下半部
    • f: 控制顯示的欄位
    • N: 用 PID 數字,由大到小排序
    • P: 用 CPU 使用率,由大到小排序
    • M: 以記憶體大小,由大到小排序
    • n: 設定顯示 Process 的數量
    • R: 排序
    • T: 用時間累積排序
    • 上下: 捲動畫面

常用情境

  • 找出前十個最消耗記憶體的程序

top -b -o +%MEM | head -n 17

  • 找出前十個最消耗 CPU 的程序

top -b -o +%CPU | head -n 17

  • 觀察 PID=1234,每 1 秒更新一次

top -b -d 1 -p 1234

  • 觀察使用 ubuntu,每 2 秒更新一次

top -d 2 -u ubuntu


htop

top 在大部分的 linux 都會有,而另一個類似,但功能更強大的則是 htop,特別是使用者體驗的提升,像是顏色、支援滑鼠操作。比較新版的 Linux,像是 Ubuntu 18.04 預設已經安裝。

功能設定

透過 F2 可以設定功能設定。

htop 上方的 Meters (儀表) 可以設定以下:

  1. 欄位配置:欄位 (CPU, Memory) 可以移動、增加、刪除
  2. 顯示方式:顯示方式有 Graph、Text、Bar、LED,如下截圖:


下圖是我重新配置的範例,增加了 Hostname、Time,調整了 CPU / Memory / Swap 位置:

常用功能

  • F4: 用關鍵字過濾,例如找 java process
    • / 搜尋 關鍵字
  • F5: 顯示 process tree
  • F6: 排序,也可以直接用滑鼠點選綠色的欄位。
  • l: list open file, 在 process 位置,顯示該 process 相關的資源,例如 binary、log …
    • 等同於 lsof -p $(pidof -s <name>)
  • p: 顯示程式路徑
  • u: 篩選個別使用者程序 (process),例如篩選使用者 www-data 的程序
  • U: show / hide user thread,也可以到 F2 -> Display Options 設定
  • K: show / hide kernal thread,也可以到 F2 -> Display Options 設定
  • s: 使用工具 strace 找 system call

其他

  • config: htop 的設定會存在:$HOME/.config/htop/htoprc,如果弄爛了,把這設定砍掉重來就好。
  • VIRT 的顏色:
    • 紅色:單位為 GB
    • 藍色:單位為 MB

其他

相關工具

  • Process: ps, pstree
  • I/O: lsof, lsblk
  • CPU: lscpu, iostat, sar, mpstat
  • lsmem
  • lshw
  • atop
  • vmstat

類似工具

底下是同樣功能,用不同語言實作的。

  • htop
  • vtop: wirtten in Node.js
  • gtop: wirtten in Node.js
  • gotop: written in Go!
    • brew install gotop
    • snap install gotop-cjbassi
  • ptop: written in python
  • hegemon: written in Rust
  • glances: support web, export to grafana.
  • bashtop

延伸閱讀

站內資料

參考資料




Comments