Top in Linux
Published in
8 min readAug 15, 2017
Linux 的 Top 通常是效能檢查第一步,google也有不少使用教學,對於各項參數的細節探討則相對少,本篇以 Centos 7.x 版 top 前五行為例做整理
第一行 up, users, load average
top — 07:21:34 up 1:00
前面是目前時間,up
後面則是自最近開機以來的時間1 user
目前總共有幾個 user 連入,即使是同一個使用者建立複數連線也會加入計算load average: 0.00, 0.01, 0.05
過去1, 5, 及15分鐘的平均系統負荷,系統負荷把三種 process 列入計算:CPU 執行中、等待 CPU 資源、及不可中斷但在睡眠狀態(等待磁碟操作),但處於 idle 的 process 則不列入
第二行 Tasks
total
後面四種狀態的 task (預設)或 thread (大寫 H 切換) 的總和;進入記憶體待執行的程式都算一個 task ,通常可以將 task 數當成已經存在於記憶體內的 process 數;而一個 process 可能有一個或複數個 threads (multi-thread) ,取決於程式內容;Linux 內對 process 有特定的資料結構 (task_struct) ,細節可參考 http://www.tldp.org/LDP/tlk/kernel/processes.htmlrunning
正在執行或等待執行的 process 數sleeping
等於事件 (event) 或資源 (resource) 的 process 數; 若一個 process 需要存取大量的磁碟資料,則它很有可能進入 sleeping 的狀態stopped
收到終止指令的 process 數,在 Linux 中包含 SIGSTOP, SIGTSTP, SIGTTIN, 和 SIGTTOU 等zombie
當一個子程序 (child process) 己經結束執行進入 exit 的狀態,但母程序 (parent process) 尚未執行 wait 的系統指令,導致這個子程序仍然存在於 process table 上而無法釋放資源,使用 kill 也無法終止該子程序;需要注意的是 orphan 跟 zombie 並不相同, orphan 子程序通常是母程序己結束但該子程序仍在執行中
第三行 %Cpu(s)
top 預設的統計時間為 1.5 秒 Delay time,這一行統計了下列類型程序佔 CPU 的時間比例
0.0us
執行沒有被設定 nice 參數的使用者程序 (user process)0.0sy
執行核心 (kernel) 程序0.0ni
執行被設定 nice 參數的使用者程序;在 Linux 中,nice 值的範圍從 -20 到 19, 越低的值表示該程序有更高的優先執行順序100.0id
執行 kernel idle handler0.0wa
等待 I/O 完成,此時 CPU 可以視為不工作的狀態0.0hi
處理硬體中斷 (hardware interrupts),比如硬碟需要讀取一塊磁區或網路需要處理剛抵達的封包,這類中斷會直接中斷 CPU 執行而觸發相對應的 kernel 程序0.0si
處理軟體中斷 (software interrupts),類似硬體中斷,不同之處在於它只能從執行中的程序發出中斷需求 (interrupt request, IRQ),這類中斷不會直接中斷CPU,而是由 kernel 排程處理0.0st
被 hypervisor 偷走的 CPU 時間; 在虛擬機 (VM) 中,hypervisor 可能會因為特定原因取走該虛擬機的 CPU ,這段時間就被列入 st 內
第四行 KiB Mem (KiB: KiloByte, 1024 Byte)
602832 total
總共可用的實際記憶體 (Physical memory) 大小,因為 Linux kernel會佔用一部分,值會比實際硬體略小一些,等於 free + used + buff/cache236892 free
尚未使用135532 used
應用程序正在使用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將一部分的磁區做為實際記憶體不夠用時的暫存
0 total
功能同 mem total0 free
功能同 mem free0 used
功能同 mem use345228 avail Mem
可用的 swap memory 大小
第六行 PID USER PR NI VIRT RES SHR S %CPU %MEM Time+ COMMMAND
PID
task (process) 的獨特序號,常搭配kill
強制停止該 taskUSER
執行該 task 的使用者PR
task 的優先權(priority),有些 task 以 rt (real time) 表示該 task 需要被即時執行,不過在 Linux kernel 2.6 後,rt 的 task 充許被中斷 (preemptible) 的,也就是這類 task 不總是被排最高的優先次序NI
nice 值,越低者表示該 task 有較高的優先順序,充許範圍為 -20 至 19, 預設的一般 task 通常是零,可用nice -n -20 ...
來指派某程式的 nice 值VIRT
使用的虛擬記憶體 (virtual memory) 大小,在 Linux 中的記憶體管理是以分頁 (page, 大小為4KB) 為單位,為讓更有效運用實體記憶體 (physical memory) ,在虛擬記憶體中會有一張 page table 記載虛擬記憶體與實體記憶體之間地址 (address) 的對應關係RES
使用的實體記憶體大小 (resident size),記載的值會反映到%MEM裡去,將該欄位總合起來可能大於總記憶量,因為單一 page 可能會被多個 process 使用而重複計算SHR
共享記憶體大小 (sharable memory),task 在執行時可能會將某個函式庫 (library) 讀取進來,但實際不一定要用到整個函式庫,這時讀取進的函式庫大小會被記算進 VIRT 及 SHR,而實際使用的函式 (function) 大小則計入 RESS
task 狀態,可能會有以下幾種
D = uninterruptible sleep (不可被中斷的等待)
R = running (執行中)
S = sleeping (等待中)
T = stopped by job control signal (被控制中斷)
t = stopped by debugger during trace (被debugger中斷)
Z = zombie (子程序己結束但母程序尚未執 wait)%CPU
task 使用的 CPU 時間比例,若是 multi-process 的 task 有可能超過 100%,也就是使用超過一個 core%MEM
task 使用的記憶體大小,parent process (主程序) 的大小為其子程序的總和TIME+
己執行的時間COMMAND
實際執行指令
以上大概介紹top中預設的欄位,在top執行時可鍵入F
看到所有的欄位並選擇加入及指定排序的欄位,除此之後,top 也充許使用者對 task 做操作,例如指定 nice 值等。
後記
寫作過程中對各個名詞做搜尋及閱讀時不斷會發現 Linux 更底層的設計,一層一層下去應該都能寫成論文了,像是記憶體管理,CPU 的資源調度都是很大的題目,不太能在這個短篇做進一步介紹,以下列出寫作時的參考資料供有興趣的讀者做進一步深入
- hardware/software interrupts 討論串: https://unix.stackexchange.com/questions/17998/what-are-software-and-hardware-interrupts-and-how-are-they-processed
- steal 討論串: https://serverfault.com/questions/230495/what-does-st-mean-in-top
- memory 討論串: https://serverfault.com/questions/85470/meaning-of-the-buffers-cache-line-in-the-output-of-free
- buffer / cache 討論串: https://www.quora.com/What-is-the-difference-between-Buffers-and-Cached-columns-in-proc-meminfo-output
- virtual memory 介紹: https://www.logicmonitor.com/blog/what-is-virtual-memory-anyway/
- page and swapping 介紹: http://www.linux-tutorial.info/modules.php?name=MContent&obj=page&pageid=89
- page fault/swap-in(out) 介紹: http://blog.scoutapp.com/articles/2015/04/10/understanding-page-faults-and-memory-swap-in-outs-when-should-you-worry