Top in Linux

Top in Linux

Linux 的 Top 通常是效能檢查第一步,google也有不少使用教學,對於各項參數的細節探討則相對少,本篇以 Centos 7.x 版 top 前五行為例做整理

第一行 up, users, load average

  1. top — 07:21:34 up 1:00 前面是目前時間, up 後面則是自最近開機以來的時間
  2. 1 user 目前總共有幾個 user 連入,即使是同一個使用者建立複數連線也會加入計算
  3. load average: 0.00, 0.01, 0.05 過去1, 5, 及15分鐘的平均系統負荷,系統負荷把三種 process 列入計算:CPU 執行中、等待 CPU 資源、及不可中斷但在睡眠狀態(等待磁碟操作),但處於 idle 的 process 則不列入

第二行 Tasks

  1. total 後面四種狀態的 task (預設)或 thread (大寫 H 切換) 的總和;進入記憶體待執行的程式都算一個 task ,通常可以將 task 數當成已經存在於記憶體內的 process 數;而一個 process 可能有一個或複數個 threads (multi-thread) ,取決於程式內容;Linux 內對 process 有特定的資料結構 (task_struct) ,細節可參考 http://www.tldp.org/LDP/tlk/kernel/processes.html
  2. running 正在執行或等待執行的 process 數
  3. sleeping 等於事件 (event) 或資源 (resource) 的 process 數; 若一個 process 需要存取大量的磁碟資料,則它很有可能進入 sleeping 的狀態
  4. stopped 收到終止指令的 process 數,在 Linux 中包含 SIGSTOP, SIGTSTP, SIGTTIN, 和 SIGTTOU 等
  5. zombie 當一個子程序 (child process) 己經結束執行進入 exit 的狀態,但母程序 (parent process) 尚未執行 wait 的系統指令,導致這個子程序仍然存在於 process table 上而無法釋放資源,使用 kill 也無法終止該子程序;需要注意的是 orphan 跟 zombie 並不相同, orphan 子程序通常是母程序己結束但該子程序仍在執行中

第三行 %Cpu(s)

top 預設的統計時間為 1.5 秒 Delay time,這一行統計了下列類型程序佔 CPU 的時間比例

  1. 0.0us 執行沒有被設定 nice 參數的使用者程序 (user process)
  2. 0.0sy 執行核心 (kernel) 程序
  3. 0.0ni 執行被設定 nice 參數的使用者程序;在 Linux 中,nice 值的範圍從 -20 到 19, 越低的值表示該程序有更高的優先執行順序
  4. 100.0id 執行 kernel idle handler
  5. 0.0wa 等待 I/O 完成,此時 CPU 可以視為不工作的狀態
  6. 0.0hi 處理硬體中斷 (hardware interrupts),比如硬碟需要讀取一塊磁區或網路需要處理剛抵達的封包,這類中斷會直接中斷 CPU 執行而觸發相對應的 kernel 程序
  7. 0.0si 處理軟體中斷 (software interrupts),類似硬體中斷,不同之處在於它只能從執行中的程序發出中斷需求 (interrupt request, IRQ),這類中斷不會直接中斷CPU,而是由 kernel 排程處理
  8. 0.0st 被 hypervisor 偷走的 CPU 時間; 在虛擬機 (VM) 中,hypervisor 可能會因為特定原因取走該虛擬機的 CPU ,這段時間就被列入 st 內

第四行 KiB Mem (KiB: KiloByte, 1024 Byte)

  1. 602832 total 總共可用的實際記憶體 (Physical memory) 大小,因為 Linux kernel會佔用一部分,值會比實際硬體略小一些,等於 free + used + buff/cache
  2. 236892 free 尚未使用
  3. 135532 used 應用程序正在使用
  4. 230408 buff/cache Linux kernel 2.4後buffer跟cache的功能基本上相同,做為暫存資料/檔案用,cache為page cache在實際記憶體裡的一部分,page cache另一部分為swap cache,mem cache很容易就到數十GB以加速 Linux 對 I/O 的操作;buffer則是存放不在page cache內的非檔案資料,通常大小在幾十MB內

第五行 Swap (KiB: KiloByte, 1024 Byte)

swap實際存放於磁碟 (disk) 上,Linux將一部分的磁區做為實際記憶體不夠用時的暫存

  1. 0 total 功能同 mem total
  2. 0 free 功能同 mem free
  3. 0 used 功能同 mem use
  4. 345228 avail Mem 可用的 swap memory 大小

第六行 PID USER PR NI VIRT RES SHR S %CPU %MEM Time+ COMMMAND

  1. PID task (process) 的獨特序號,常搭配 kill 強制停止該 task
  2. USER 執行該 task 的使用者
  3. PR task 的優先權(priority),有些 task 以 rt (real time) 表示該 task 需要被即時執行,不過在 Linux kernel 2.6 後,rt 的 task 充許被中斷 (preemptible) 的,也就是這類 task 不總是被排最高的優先次序
  4. NI nice 值,越低者表示該 task 有較高的優先順序,充許範圍為 -20 至 19, 預設的一般 task 通常是零,可用 nice -n -20 ... 來指派某程式的 nice 值
  5. VIRT 使用的虛擬記憶體 (virtual memory) 大小,在 Linux 中的記憶體管理是以分頁 (page, 大小為4KB) 為單位,為讓更有效運用實體記憶體 (physical memory) ,在虛擬記憶體中會有一張 page table 記載虛擬記憶體與實體記憶體之間地址 (address) 的對應關係
  6. RES 使用的實體記憶體大小 (resident size),記載的值會反映到%MEM裡去,將該欄位總合起來可能大於總記憶量,因為單一 page 可能會被多個 process 使用而重複計算
  7. SHR 共享記憶體大小 (sharable memory),task 在執行時可能會將某個函式庫 (library) 讀取進來,但實際不一定要用到整個函式庫,這時讀取進的函式庫大小會被記算進 VIRT 及 SHR,而實際使用的函式 (function) 大小則計入 RES
  8. S task 狀態,可能會有以下幾種
     D = uninterruptible sleep (不可被中斷的等待)
     R = running (執行中)
     S = sleeping (等待中)
     T = stopped by job control signal (被控制中斷)
     t = stopped by debugger during trace (被debugger中斷)
     Z = zombie (子程序己結束但母程序尚未執 wait)
  9. %CPU task 使用的 CPU 時間比例,若是 multi-process 的 task 有可能超過 100%,也就是使用超過一個 core
  10. %MEM task 使用的記憶體大小,parent process (主程序) 的大小為其子程序的總和
  11. TIME+ 己執行的時間
  12. COMMAND 實際執行指令

以上大概介紹top中預設的欄位,在top執行時可鍵入F 看到所有的欄位並選擇加入及指定排序的欄位,除此之後,top 也充許使用者對 task 做操作,例如指定 nice 值等。

後記

寫作過程中對各個名詞做搜尋及閱讀時不斷會發現 Linux 更底層的設計,一層一層下去應該都能寫成論文了,像是記憶體管理,CPU 的資源調度都是很大的題目,不太能在這個短篇做進一步介紹,以下列出寫作時的參考資料供有興趣的讀者做進一步深入