FIELDS / Columns

這一節列出所有top裡面,可取得的顯示欄位,底下的排列是用字母大小的方式去排列,所以可能會跟直接程式上的排列不一樣,想要去選取你要出現哪些欄位的話,可以用互動模式的『f』和『F』,這叫做『Fields Management』,按了以後會出現如下的選單:

上面的每個欄位都是可選擇的,而且你也可以排序,不管是由高到低,或是由低到高。

1, %CPU -- CPU Usage 所有的task都會一起分享cpu時間,所以這個欄位會顯示自從上一次畫面更新後每個task所使用到的cpu時間比例。

在真的SMP環境下,如果你的process是multi-thread並且你的top又不是在『Threads mode』的話,則通常總額有可能會超過100%,所以這時候可以按一下『H』來切換成『Threads mode』。

並且在multi-processor環境時,如果你的『Irix mode』是off的話,則top將會執行在所謂的『Solaris mode』,也就是一個task的cpu使用率將會除以所有CPU總數。這部份可以使用按鍵『I』來切換成『Irix/Solaris』模式。

2, %MEM -- Memory Usage (RES) 一個task目前使用了實體記憶體的比例。

3, CGROUPS -- Control Groups 這個process所歸屬的控制群組(control group(s))名稱,如果沒有的話就會直接顯示『-』。控制群組通常是提供在預先安裝定義的程序群組之間的資源分配(ex. cpu, memory, network bandwidth...),通常經由這種方式可以允許更好的方式來控制這些分配(allocating),拒絕(denying),優先權(prioritizing),管理(managing)和監控(monitoring)的行為。

許多cgroups的不同結構可以同時存在在一個系統裡,並且每個結構都會附屬在一個或多個subsystems底下。而一個subsystem代表則是一個單一資源。

這邊要注意一下,這個『CGROUPS』欄位不像其他的欄位,都是固定欄寬。所以當這個欄位顯示時,所以它會加入所有其他變數的欄寬,也就是說,有可能會把剩下的空間(到512)都擠爆或或者是被截斷。

4, CODE -- Code Size (KiB) 執行程式碼(也就是text/code section)在記憶體裡的總額,也可以說是TRS(text resident set)的size。

5, COMMAND -- Command Name or Command Line 顯示啟動這個task的命令,或者是相關程式的名字,舉個例子來說我的視窗上有一個叫做『chrome』的程式名字,但是我按了一下『c』以後,它就會切換到『cmd』命令模式會變成『/opt/google/chrome/chrome --type=renderer --field-trial-handle+』,也就是說當初系統是用這麼一大串的命令去啟動這個程式的,再按一下『c』就會切換回來『chrome』。

如果你選擇的是『command lines』,而你的processes又沒有『command line』的話,像是kernel的threads,就只會在中括號中間顯示一個program的名稱,像是:

 [kthreadd]

這個欄位可能會被『forest view』顯示模式所影響,這部份請參考一下互動模式『V』的額外資訊。

這邊要注意一下,這個欄位不像其他的欄位,都是固定欄寬。所以當這個欄位顯示時,所以它會加入所有其他變數的欄寬,也就是說,有可能會把剩下的空間(到512)都擠爆或或者是被截斷。

6, DATA -- Data + Stack Size (KiB) 可執行程式碼以外的實體記憶體組量,也可以說是DRS(data resident set)的size。

7, ENVIRON -- Environment variables 顯示所有的環境變數(environment variables),如果有獨立的行程的話就顯示獨立行程的環境變數。這些環境變數顯示的順序都是以native的方式顯示,所以並不是排序過的資料。

這邊要注意一下,這個欄位不像其他的欄位,都是固定欄寬。所以當這個欄位顯示時,所以它會加入所有其他變數的欄寬,也就是說,有可能會把剩下的空間(到512)都擠爆或或者是被截斷。

8, Flags -- Task Flags 表示目前task的scheduling flag,格式的話是用16進制和0所壓制的(expressed in hexadecimal notation and with zeros suppressed),格式像是這樣『4.4...4.』,想要了解這些flag的話可以參考一下『linux/sched.h』。

9, GID -- Group Id 有效用戶ID(The effective group ID).

10, GROUP -- Group Name 有效用戶名(The effective group name).

11, NI -- Nice Value Task的『nice』 數值,負值的話就代表是比較高的優先權,反之正值的話則代表優先權則會比較低。在這個欄位為『0』的話,則代表優先權並不會被特別調整。

12, P -- Last used CPU (SMP) 這個欄位的數字代表的是最後使用的處理器(processor)。在一個真的SMP環境底下,這個數值將會很頻繁的在變動,因為kernel會使用『weak affinity』。而且在執行『top』時的各種行為可能會去打破這個『weak affinity』,造成許多行程會更常的改變CPU(因為需要額外的cpu時間)。

13, PGRP -- Process Group Id 每個行程都是一個獨特process group的成員,這些群組會用來發送相關的訊號和讓terminals來調配(arbitrate)他們input和output的requests。

每當一個process被建立時(透過foked),它就會變成parent process的process group的成員。依慣例來說,這個值會相等於這個process group的第一個成員的『PID』,這個第一個成員就叫做『process group leader』。

14, PID -- Process Id 這個task獨一無二的id。在kernel的觀念中,這個id是一個定義在結構『task_struct』裡面的分派實體(dispatchable entity)。

這個數值也可以被使用在:一個process group ID(請參考 PGRP),一個對於session leader的session ID(請參考SID),一個對於thread group leader的thread group ID(請參考TGID),一個對於process group leader的TTY process gorup ID(請參考TPGID)。

15, PPID -- Parent Process Id 這個task的parent的pid。

16, PR -- Priority 這個task的排程優先權(scheduling priority)。如果你看到這個欄位是『rt』的話,代表的是這個tack是在『real time』的排程優先權。

在Linux底下,real time priority會有一點誤導,因為傳統的kernel並不是『preemptible』的,而在kernel『2.6』以後就很多都是『preemptible』,所以這個『rt』值可能就比較有參考價值。

17, RES -- Resident Memory Size (KiB) 一個task已經用到的非swap實體記憶體(non-swapped physical memory)。

18, RUID -- Real User Id 真實的使用者ID(The real user ID)。

19, RUSER -- Real User Name 真實的使用者名稱(The real user name)。

20, S -- Process Status 這個task的狀態,有可能是底下的幾種之一: D = uninterruptible sleep R = running S = sleeping T = traced or stopped Z = zombie

這邊要注意一下就算task的狀態顯示是『running』,但是其實應該要將其解讀為『ready to run』才對,因為他們的『task_struct』只是簡單的表示他們正在Linux的『run-queue』底下。就算在非真正的SMP環境底下,你也可以看到一堆的tasks正處於這個狀態(running)底下,這也取決於top的『delay interval』和『nice value』。

21, SHR -- Shared Memory Size (KiB) 一個task可取得的shared memory 總額,這些值並不是都是常駐的。通常都會是直接反應潛在性可以與其他行程分享的記憶體。

22, SID -- Session Id 一個session是一個process groups的集合(這邊請參考PGRP),通常是由login shell所建立的。而一個新的forked process將會加入他的建立者的session。以慣例來說,這個值就等於這個session的第一個成員的PID,這個第一個成員叫做『session leader』,通常都會是『login shell』。

23, SUID -- Saved User Id 就是SUID(The saved user ID)。

24, SUPGIDS -- Supplementary Group IDs 從這個task的parent所繼承的支援群組 ID(supplementary group id),或是登入時所建立的支援群組 ID。

這邊要注意一下,這個欄位不像其他的欄位,都是固定欄寬。所以當這個欄位顯示時,所以它會加入所有其他變數的欄寬,也就是說,有可能會把剩下的空間(到512)都擠爆或或者是被截斷。

25, SUPGRPS -- Supplementary Group Names 從這個task的parent所繼承的支援群組名稱(supplementary group name),或是登入時所建立的支援群組名稱。

這邊要注意一下,這個欄位不像其他的欄位,都是固定欄寬。所以當這個欄位顯示時,所以它會加入所有其他變數的欄寬,也就是說,有可能會把剩下的空間(到512)都擠爆或或者是被截斷。

26, SUSER -- Saved User Name 暫存用戶名(The saved user name)。

27, SWAP -- Swapped Size (KiB) 一個task位址空間裡的非常駐部份(non-resident portion)容量。

28, TGID -- Thread Group Id 一個task歸屬的thread group ID。這個ID會是thread group leader的PID。在Kernel的觀念裡,所代表的含意是這些tasks會分享同一個『mm_struct』。

29, TIME -- CPU Time 這個task自從開始以來所使用的總CPU時間。當『累進模式(Cumulative mode)』開啟的話,則每個process除了會列出自己所使用的cpu時間以外,還會列出已經終結的子task的時間。想要切換累進模式的話,請由按鍵『S』來切換。

30, TIME+ -- CPU Time, hundredths 跟上一個『TIME』很相似,但是反應更多的細節(百分之一秒)。

31, TPGID -- Tty Process Group Id 目前連接的tty的前景行程(foreground process)的process group ID,如果是『-1』的話,則代表這個process並沒有連著terminal。依慣例來說,這個值會相等於process group leader的pid。

32, TTY -- Controlling Tty 控制終端機(controlling terminal)的名稱。這個名稱通常都是這個行程所開始的裝置名(serial port, pty…),還有其用來輸入輸出的裝置名。然後,一個行程如果不需要被繫結在一個terminal的話,你就會看到有一個問號『?』顯示。

33, UID -- User Id 這個task擁有者的有效用戶ID(The effective user ID)。

34, USED -- Memory in Use (KiB) 這個欄位代表一個task已經使用的『non-swapped』實體記憶體,在加上自己位址空間的非常駐部份(SWAP)。

35, USER -- User Name 這個task擁有者的有效用戶名稱(The effective user name)。

36, VIRT -- Virtual Memory Size (KiB) 這個task所使用的虛擬記憶(virtual memory)體總量。這包含所有的code,data和shared libraried,還有已經swapped out的pages和已經mapped出去但是還沒使用得pages。

37, WCHAN -- Sleeping in Function 這個欄位取決於kernel的link map - 『System.map』,然後顯示目前正在sleeping的task的kernel function的位址。如果是正在『running』的task的話將會在欄位裡面顯示『-』。

如果你要顯示這個欄外的話,top程式的working set將有可能會超過700KB,這個取決於kernel的版本,如果真的發生這個狀況的話,你可能就要直接重開你的top程式。

38, nDRT -- Dirty Pages Count 這個欄位顯示的是自從上次被寫到輔助儲存裝置(auxiliary storage)裡面,已經被修改過得pages總數。Dirty pages應該要在相關的實體記憶體被其他的虛擬page使用之前寫到輔助儲存裝置裡面。

39, nMaj -- Major Page Fault Count 這個task已經發生的『major page fault』總數。分頁錯誤(Page fault)通常會在這個行程意圖從一個不存在於位址空間的虛擬分頁上讀取或是寫入資料所導致。而一個『major page fault』則是代表包含當你的輔助儲存裝置(auxiliary storage)的作用而讓這些page又可以用的狀態。

40, nMin -- Minor Page Fault count 這個task已經發生的『minor page fault』總數。分頁錯誤(Page fault)通常會在這個行程意圖從一個不存在於位址空間的虛擬分頁上讀取或是寫入資料所導致。而一個『minor page fault』則是不包含當你的輔助儲存裝置(auxiliary storage)的作用而讓這些page又可以用的狀態。

41, nTH -- Number of Threads 與這個process的關聯thread數量。

42, nsIPC -- IPC namespace 跟虛擬化有關,用來隔離IPC(interprocess communication)資源的namespace Inode,像是System V IPC物件和POSIX message queues.

43, nsMNT -- MNT namespace 跟虛擬化有關,用來隔離檔案系統的掛載點(filesystem mount points)的namespace Inode,這樣因此可以提供檔案系統架構的不同觀點。

44, nsNET -- NET namespace 跟虛擬化有關,用來隔離其他資源的namespace Inode,其他資源包含了像是network裝置,IP位址,IP routing和port numbers等等。

45, nsPID -- PID namespace 跟虛擬化有關,用來隔離行程ID號碼的namespace Inode,意思是他們就不需要保持著本身的獨一性(unique)。因此每個這樣子的namespace就可以有他自己的『init (PID #1)』來管理各種的initialization tasks並且可以收集相關的orphaned child processes。

46, nsUSER -- USER namespace 跟虛擬化有關,用來隔離user和group id的namespace Inode,因此,這樣一個行程就可以在一個user namespace之外擁有一個正常未經授權的user id,但是在namespace裡面卻是pid為0,擁有完全root的權限。

47, nsUTS -- UTS namespace 跟虛擬化有關,用來隔離hostname和NIS domain name的namespace Inode。UTS意思是指『UNIX Time-sharing System』。

48, vMj -- Major Page Fault Count Delta 自從上一次更新後的『major page faults』總數,這部份請參考『nMaj』。

49, vMn -- Minor Page Fault Count Delta 自從上一次更新後的『minor page faults』總數,這部份請參考『nMin』。

MANAGING Fields

就在互動模式底下你按了『f』或是『F』以後,就像上面說的,你會進入所謂的『Fields Management』,在這個頁面底下,列出了所有可以顯示的欄位(後面還有其簡短描述),而他們的位置就跟他們的排序有關,當然是越前面的排序越高,而前面有個星號的就是代表現在會顯示的欄位。

  • 就像是上面顯示的,你可以藉由上下鍵來移動游標,『PgUp』,『PgDn』,『Home』和『End』鍵都可以讓你快速的到達你要的欄位上。
  • 用右鍵來移動每個欄位的位置,等到移動到你的位置後,可以按左鍵或是『Enter』來放置這個欄位。
  • 用『d』鍵或是空白鍵來切換你要顯示的欄位,反正按看看你就會發現前面會多一個/少一個星號。
  • 用『s』鍵來切換排序,也就是說top的主頁中要以那一個欄位來排序,而這部份請參考『TASK AREA』,『Commands』和『SORTING』章節裡的詳細細節。
  • 使用『a』和『w』鍵可以用來循環切換所有可取得的視窗組合(Field group),用『q』的話則可以跳出『Fields Management』。
  • 上面講到的『Filed group』,也可以在互動模式底下觸發,只要你按『g』就好,你就會發現軟體會propt一個『Choose Field group (1-4)』給你選擇。

results matching ""

    No results matching ""