舉例而言,我的 Linux 中,這個數量是304.仔細觀察就會發現,Top 遍歷 /proc 文件夾,以收集進程信息。/proc 本身是一個虛擬文件系統,意味著它并非存在于真實硬盤之中,而是由 Linux 內核憑空創建,保存在內存中的。在文件夾中,如/proc/2097(2097為 PID),Linux 內核將與之關聯的信息打印到此文件中,而這里就是 Top 的消息來源。
同時試一下:
1
|
$ time top -b -n 1
|
這樣你就能了解到 Top 單輪工作有多快了。在我的系統中,大約為0.5-0.6秒???ldquo;real”字段,不是“user”或“system”字段,因為“real”字段反應了 Top 工作需要的總時間。
所以,有了這個認知之后,使用適度的更新間隔是明智的?;谖募到y訪問內存也是需要時間的。經驗法則是,對于多數用戶來說,1到3秒的間隔就足夠了。在命令行中使用-d,或在交互模式下按下“s”以設置。你可以使用類似2.5,4.1這樣的小樹。
什么時候我們需要快于1秒的更新?
時間段內需要更多的樣本。應對這點要求,最好使用批處理模式,并將標準輸出重定向到文件中,以便更好的分析。
你并不在意 Top 消耗的額外CPU負荷。是的,雖然它很小,它依然需要負荷。如果你的 Linux 系統相對比較空閑,隨意使用短間隔,如果不是,最好為重要的任務保留你的 CPU 時間。
一個減少 Top 工作的辦法是只監測特定的幾個 PID。這樣,Top 無需遍歷 /proc 下所有的子文件夾。用戶名過濾呢?并不會變得更好。用戶名過濾會給Top帶來額外工作量,因此將其與短間隔聯合將會增加 CPU 負荷。
當然,當你需要強制更新時,按下 Space 鍵,Top 將會刷新統計。、
D.我們需要的字段
默認時,Top 啟動后會顯示下面的任務屬性:
字段 | 描述 |
---|---|
PID : | 進程 ID |
USER : | 有效用戶 ID |
PR : | 動態優先值 |
NI : | 良好值,也被稱為基本優先級 |
VIRT : | 任務虛擬大小。包括進程的可執行二進制文件大小,數據區大小以及所有已加載的共享庫的大小。 |
RES : | 目前任務內存消耗。存入交換分區的部分并不包含。 |
SHR : | 一些內存區域可能由兩個或多個任務分享,此字段反應這些共享區域。例如共享庫以及 Sysv 共享內存。 |
S : | 任務狀態 |
%CPU : | Top 屏幕更新時專用于運行任務的CPU 時間百分比。 |
%MEM : | 任務當前內存消耗的百分比 |
TIME+ : | 在任務啟動后消耗的總CPU時間。”+” sign means it is displayed with hundreth of a second granularity. 默認時,TIME/TIME+ 不會計入已經關閉的任務子進程。 |
COMMAND : | 顯示程序名。 |
不止這些。下面我介紹一些你可能會用到的列:
列 | 描述 | ||
---|---|---|---|
nFLT (‘u’鍵) |
進程啟動以來重大頁面錯誤(page fault)的個數。準確地說,頁面錯誤是由于進程訪問它的地址空間內不存在的頁面引起的。“重大”的頁面錯誤是指內核需要訪問磁盤來使得該頁面有效。相 反,小型頁面錯誤是指內核只需要在內存中分配頁面而不用讀磁盤。例如,假設程序ABC的大小為8KB,頁面大小為4KB。當程序讀進內存的時候,發生了兩 次重大的頁面錯誤(2*4KB)。程序本身分配了8KB空間當作臨時數據。因此,還會有兩次小型頁面錯誤。nFLT過高可能意味著:
當進程第一次運行時,看到大量重大頁面錯誤很正常。下次運行的時候,由于緩存已經分配好了,你很可能看到”0″次或者很小的 nFLT。但是,如果一個程序頻繁地觸發重大頁面錯誤,很有可能是你目前安裝的內存不夠那個程序使用。 |
||
nDRT (‘v’鍵) |
上次頁面寫入磁盤以來,臟頁面的數目。什么是臟頁面?先看一點背景知識。大家都知道,Linux使用了緩存系統,所以從磁盤讀取的數據也會被緩存 到內存中。這樣做的優點是,后續的對這個磁盤塊的讀操作可以直接從內存中取數據,因而速度更快。但這也是有代價的。如果緩沖區的內容被修改了,那么就需要 進行同步。因此,被更改的緩沖區(臟頁面)必需寫回到磁盤中。同步失敗則可能導致磁盤上的數據不一致。在負載不重的系統中,nDRT 通常小于10(大約估計)或者為0。如果你的系統通常大于10,則有可能:
現在的話,(1) 不太可能出現,因為I/O速度越來越快,需要更少的CPU(DMA技術的出現)。所以 (2) 出現的概率更高。 注意:在 2.6.x 內核中, 不知道為什么,這個列的值總是0。 |
||
P (‘j’鍵) | 上次使用的CPU。這個列只在SMP環境中有意義。這里的SMP指超線程,多核或者多CPU架構。如果你只有一個CPU(不是多核,沒有超線 程),這個列總是顯示0。在SMP系統中,即使這個列有幾次改變,也不要吃驚。這意味著,Linux 內核嘗試將你的進程移到另一個負載更少的CPU。 | ||
CODE (‘r’鍵) 和 DATA (‘s’鍵) | CODE 只是反映了你程序代碼的大小,DATA反映了你數據段(棧,堆,變量,不包含共享庫) 的大小。單位都是KB。DATA可以顯示你的程序分配了多少內存。有時,也可以用來協助分析內存泄漏。當然,你需要更好的工具,如使用 valgrind 來查看每次的內存分配。如果DATA不斷增長,則很有可能出現了內存泄漏。注意:DATA, CODE, SHR, SWAP, VIRT, RES 都是使用頁面大?。↖ntel架構上為4KB)來衡量。只讀數據段也包含在CODE的大小中,因而有時候CODE比實現的段要大。 | ||
SWAP (‘p’鍵) |
已經進行交換的進程內存映像大小。這個列有時很讓人疑惑:邏輯上,你可能期望這個列顯示你的程序實際上是完全進行交換,還是部分交換了,交換了多 少。但是事實上不是。即使”Swap used” 列顯示為0,你仍然可以很吃驚地發現所有進程的SWAP列都大于0。到底是為什么呢?這是由于 top 命令使用如下的計算公式:
前面說過,VIRT 包含了進程的地址空間里面的所有東西:內存中的,已經進行交換的,尚未從磁盤讀取的。RES 代表了進程占用的全部內存大小。所以,這里的SWAP代表了已經進行交換的全部數據,以及尚未從磁盤讀取的數據。不要被SWAP這個名字迷惑了,它代表的 不只是已經交換的數據。 |
原文轉自:http://www.anti-gravitydesign.com