目錄表
[*nix] Resources Monitor: Top Command
0x00 前言
top 指令是 linux 上對於系統監控一個基本的指令
最近在找工作剛好被問到的一些細節
藉由這個機會來整理一下 top 指令的相關訊息
0x01 Top Command Overview
這邊是基本的 Top Command Output,沒有使用額外參數
輸出大致上分為上方的系統統計資訊區與下方的個別工作資源區
這邊在 FreeBSD 圖中有 ARC (Adaptive Replacement Cache) 是因為我在 FreeBSD 使用了 ZFS,這種檔案系統以 ARC 取代了傳統的 LRU (Least Recently Used) 快取
ARC 中結合了不同快取清單,包含了 top command 中顯示的 MRU (Most Recently Used) 及 MFU (Most Frequently Used),這部分之後另開篇幅說明
0x02 系統資源區
Line 1: General Information
- load averages: 這裡有三個數字,表示了系統在 1, 5 ,15 分鐘內的平均附載狀況,我自己的機器一般會落在 0~2 之間,管理過的機房伺服器基本上也不太會超過 5
- up: 表示機器開機運行到現在的時間,從途中可以看到 FreeBSD 約為 72 天又 08:40:22,Ubuntu 是我最近新開的,只有 4 天又 6:30
- last pid: 表示系統中目前指派給 process 的最後一個 pid
- current time: 就是目前時間,FreeBSD 在右上角,我是在 01:38:26 截圖的,Ubuntu 在左上角,是 17:54:57
Line 2: Task
這裡顯示了 processes 的數量與狀態
- running
- sleeping
- stopped
- zombie: 這部分可以參考 [*nix] Handle Zombie Process
Line 3: CPU
CPU 資訊這部分我覺得 FreeBSD 比較直覺可讀,Ubuntu 則是比較細項一些
- us/user: 運行在 user space 的 processes 所佔用的 CPU time
- sy/system: kernel space 的 processes 所佔用的 CPU time
- ni/nice: 有調整過優先權的 processes 所佔用的 CPU time
- id/idle: 閒置的 CPU
- wa: 等待 IO 所佔用的 CPU time
- hi: hardware interrupt 所佔用的 CPU time
- si: software interrupt 所佔用的 CPU time
- st: 這個比較沒有碰到,這邊引用 man page 原文,time stolen from this vm by the hypervisor,應該是虛擬機裡面沒辦法直接存取到硬體資源,所以是在虛擬機層級,感覺像是用偷的來取得 CPU Time
Line4: Memory
這裡 FreeBSD 的輸出就比較細了,我們把 FreeBSD 跟 Ubuntu 分開討論
FreeBSD:
- Active: 目前 processes 正在使用的記憶體
- Inact: Inactive 的簡寫,表示已經被標示可以 free 但仍存放有資料的記憶體,因為未來有可能再被用到,Free Memory 算是資源浪費,而一旦有記憶體需求時,這個記憶體空間是可以立刻被 Free 的
- Laundry: 指記憶體中 dirty data 需要被清洗的量,而 dirty data 表示在 CPU Cache 中被改動過但在主記憶體還沒被修改的資料
- Wired: kernel 所使用的記憶體,這部分記憶體不能被 swapped out
- Buf: Disk Cache,基本上就是我們理解的快取,用來減少從硬碟讀取資料的時間,FreeBSD 好像沒有像 Linux 還分 Memory Buffer 跟 Cache
- Free: 完全空置的記憶體空間
Ubuntu:
- Total: 就是總額,單位 KiB
- Free: 跟 FreeBSD 欄位意義相同
- Used: 使用中的記憶體空間
- buff/cache: 我原本想像的 buffer 是 input/output 做流量整形的那個 buffer, cache 則是高速設備跟低速設備的中間層,用來加快存取速度,但這裡的 buf 好像不是流量整形的那個 buffer,看起來都比較偏加速存取
引用一下我在 LinuxHowTo 看到的解釋:
Buffers are associated with a specific block device, and cover caching of filesystem metadata as well as tracking in-flight pages. The cache only contains parked file data. That is, the buffers remember what's in directories, what file permissions are, and keep track of what memory is being written from or read to for a particular block device. The cache only contains the contents of the files themselves.
我的理解是 buffer 會包含了比較詳細的 filesystem metadata,像是資料在哪個資料夾,檔案權限等,cache 則是單純的資料內容
Line 5: Swap
系統執行程式時是從硬碟將程式載入記憶體,而系統中 CPU 會輪流執行不同程式,許多的程式被載入記憶體,而當下沒有在運行的程式若記憶體空間被需要的時候很有可能就會被 Swap Out 了
Swap 是硬碟上的一塊空間,CentOS 官網建議一般若記憶體大小 < 2GB 建議分配的 Swap 大小為記憶體大小的兩倍,若 > 2GB 的話,則建議是記憶體大小 + 2GB
前面圖中可以看到,FreeBSD 上我的 RAM 約為 1GB,Swap 則設為 2GB
Ubuntu 部分在 DigitalOcean 上的預設安裝則是沒有切 Swap
0x03 工作資源區
top 指令的下半部就是個別 task 所使用的資源跟狀態了
這裡的欄位我以 ubuntu 為主來討論
- PID: Process ID
- User: 執行 process 的使用者
- PR: Process Priority, 程序的優先權
- NI: 在 Unix 中,我們可以透過 renice 指令來影響 process 的執行優先權,nice 值介於 -20 ~ 19 之間,-20 優先權較高,19 較低
- VIRT: Virtual Memory Size, 包含了 process 的 code, data, shared libraries, 被 swapped out 和 mapped 的 pages
- RES: Resident Memory Size, 是 VIRT 的子集,代表 process 目前正在使用,non-swapped 的 physical memory
- SHR: Shared Memory Size, RES 的子集,指可能和其他 process 共享的 memory pages
- S: Process Status
- D: uninterruptible sleep
- R: running
- S: sleeping
- T: stopped by job control signal
- t: stopped by debugger during trace
- Z: zombie
- I: kernel process idle
- %CPU: CPU time 使用量比例
- %MEM: 記憶體使用量的比例,這裡計算的是 RES 這個欄位,也就是實體記憶體的使用量,Virtual Memory 不包含在內
- TIME+: Process start 後總共使用的 CPU time,單位是百分之一秒(若是 TIME 欄位,沒有 + 號,單位為秒)
- COMMAND: command line