top
top命令是最流行的效能工具之一。大多數系統管理員運行top查看Linux和UNIX系統的運行情況。top工具 + 生產力提供一種監視進程和Linux整體效能的理想方法。將Linux進程稱作任務更準確,但是在本章中我們還是將它們稱作進程,因為這個工具也這樣稱呼它們。1普通使用者和root使用者都可以運行top。圖3-1顯示一個空閑系統的典型top輸出。
圖3-1 top輸出
top顯示有兩個部分。大約前三分之一顯示關於Linux的整體資訊,其餘行為各個進程資訊。如果擴充視窗則顯示更多進程而填充整個螢幕。
更全面的Linux資訊可以通過使用top之外的幾個命令來得到。不過,通過一個命令在一個螢幕上顯示所有資訊比較理想。第一行顯示最近1分鐘、5分鐘和15分鐘的負載平均值。負載平均值表示在CPU上運行或者等待運行多少進程。uptime命令也可以用來顯示負載平均值。接下來是進程資訊,之後是CPU、記憶體和交換區。記憶體和交換區資訊與free命令輸出類似。在我們確定記憶體和CPU使用之後的下一個問題是哪些進程正在使用它。
大部分進程資訊也可以通過ps命令得到,但是top提供一種更易於閱讀的格式。最有用的是用於提供協助的h,它列出top的其他互動式命令。 3.1.1 添加和移除欄位
欄位可以從顯示中添加或移除。進程輸出可以按照CPU、記憶體或者其他指標排序。這是一個查看什麼進程搶奪記憶體的理想方法。各個Linux發布版本的top文法和互動式選項不同,協助命令可以快速列出什麼命令可用。有許多互動式選項可用,使用者應該花費一些時間來實驗它們。
圖3-2顯示Red Hat Enterprise Linux ES release 3的協助螢幕。
圖3-2 top的協助螢幕
f命令用來從top輸出中添加或者移除欄位。圖3-3是一個Red Hat Enterprise Linux ES release 3的協助螢幕,顯示什麼欄位可以添加。
圖3-3 top添加/移除欄位的螢幕
圖3-4顯示一個SUSE Linux 9.0 top的協助螢幕,可見它們提供的命令差別非常大。
圖3-4 SUSE top的協助螢幕 3.1.2 解釋輸出
讓我們研究top資訊的意義,以top的如下輸出為例:
top輸出的第一行顯示負載平均值資訊:
這個輸出與uptime的輸出類似。從中可看到Linux已經已耗用時間、目前時間和使用者數量,以及1分鐘、5分鐘和15分鐘負載平均值。接下來顯示進程概要:
我們看到總共有73個進程,其中72個進程正在休眠,一個進程正在運行,沒有僵化進程或者被停止的進程。當一個進程退出並且它的父進程沒有通過wait(2)或者waitpid(2)函數等待它時,它就會成為僵化進程。這通常是由於父進程在它的子進程之前退出造成的。不同於進程表中的項,僵化進程不使用資源。停止的進程是已經向它發送STOP訊號的進程。更多資訊,請參見signal(7)手冊頁。
接下來是CPU資訊:
CPU行描述CPU如何使用它們的CPU周期。top命令報告CPU在使用者或者核心模式、運行良好進程以及處在空閑狀態時所花費時間的百分比。iowait列顯示沒有進程在CPU上運行時,處理器等待I/O完成的時間的百分比。irq和softirq列表示處理硬體和軟體中斷所花費的時間。早於2.6版本的Linux核心不報告irq、softirq和iowait。
接下來是記憶體資訊:
前三個指標提供記憶體使用量的概要,列出了總的可用記憶體、已使用記憶體和自由記憶體,它們都是確定對於Linux記憶體是否足夠所需資訊。
接下來五個指標標識已使用的記憶體如何分配。shrd欄位顯示共用的記憶體使用量,buff是緩衝使用的記憶體。分配給核心或者使用者進程的記憶體可以處在三種不同狀態:活動(active)、不活動髒(inactive dirty)和不活動乾淨(inactive clean)。活動在top中用aotv表示,表示該記憶體最近被使用。不活動髒在top中用in_d表示,表示該記憶體最近沒有使用,可以回收。要回收記憶體,必須將它的內容寫到磁碟,這個進程命名為“清洗”,也可稱作記憶體的第四種臨時狀態。一旦被清洗,不活動髒記憶體成為不活動乾淨記憶體,在top中用in_c表示。由Norm Murray和Neil Horman合著的Understanding Virtual Memory in Red Hat Enterprise Linux 3是一本優秀的參考書,網址為http:people.redhat.com/nhorman/papers/ rhel3_vm.pdf。
接下來是交換區資訊:
av欄位是可用的交換區總量,之後是已用數量和自由數量,最後是核心用於緩衝的記憶體數量。
top顯示的其餘部分是進程資訊:
top顯示儘可能多的能適合螢幕的進程。top(1)手冊頁中提供了欄位說明的描述。表3-1提供了這些欄位的概要。
表3-1 top進程欄位
| 字 段 |
說 明 |
| PID |
進程id編號 |
| USER |
進程所有者的使用者名稱 |
| PRI |
進程的優先順序 |
| SIZE |
進程大小,包括它的代碼、棧和資料區域,以KB為單位 |
| RSS |
進程使用的記憶體總量,以KB為單位 |
| SHARE |
進程使用的共用記憶體數量 |
| STAT |
進程的狀態,通常R表示運行,S表示休眠 |
| %CPU |
自從最近的螢幕更新以來,這個進程使用的CPU百分比 |
| %MEM |
這個進程使用的記憶體百分比 |
| TIME |
自從進程啟動以來,這個進程使用的CPU時間量 |
| CPU |
最近執行進程的CPU |
| COMMAND |
正在執行的命令 |
3.1.3 儲存自訂
一個非常好的top功能是儲存當前配置。可以使用互動式命令s任意更改顯示,然後按w儲存該視圖。
top在使用者的主目錄中寫入一個.toprc檔案,用來儲存配置,以便下一次這個使用者啟動top時使用相同的顯示選項。
top也尋找預設設定檔/etc/toprc。這是一個全域設定檔,當任何使用者運行工具 + 生產力時,top將讀取該檔案。這個檔案可以使top以安全模式運行,也可以設定重新整理延遲。安全模式阻止非root使用者登出或者更改進程的正常值,也阻止非root使用者更改top的重新整理值。Red Hat Enterprise Linux ES release 3的一個/etc/toprc樣本檔案如下所示:
s表示安全模式,3定義三秒鐘重新整理間隔。其他發布版本可能有不同的/etc/toprc格式。登出進程是一個非常實用的功能。如果使用者有一個失控的進程,通過top命令可以輕易找到並登出它,具體步驟為:運行top,通過u命令顯示使用者的所有進程,然後使用k登出它。top不只是一個優秀的效能監控工具,它也可以用來通過登出那些產生問題的進程從而改進效能。 3.1.4 批處理模式
top也可以以批處理模式運行。嘗試運行以下命令:
-n 1告訴top只顯示一次迭代,-b選項表示以適合寫入檔案的文本形式輸出或者定向到另一個程式(例如less)。類似以下兩行指令碼的命令可以順利完成cron工作:
可以將它添加到crontab,並每隔15分鐘收集一次輸出。
通過批處理可以輕鬆完成所有任務,無需使用者的幹涉。所有進程都被列出,輸出並不是每5秒鐘重新整理一次。如果使用者的主目錄中存在一個.toprc設定檔,那麼它用來格式化顯示。以下是在一個多CPU Linux伺服器上運行top批處理模式的輸出。注意,其中沒有顯示top輸出的所有258個進程。
現在讀者可能明白了為什麼top會如此流行。top的互動式本質和容易自訂輸出的能力使它成為診斷問題的優秀工具。