對桌面用戶來說,監視系統資源使用是一項重要的工作。通過這項工作,我們可以找到系統瓶頸所在,針對性的進行系統優化,識別內存洩露等。問題是,我們應該用什麼軟件,以及如果針對我們的需求使用它。
在眾多備選的監測工具中,多數人使用“top”(procps 包的一部分)。Top 提供了幾乎可以說是所有的我們所需要的系統資源使用監測,就在這一個軟件中。本文中的所有信息都是基於運行在 Linux 2.6.x 內核上的版本號為3.2.5的 procps 包。
在這裡,我們假定 procps 已經安裝並運行在你的 Linux 系統中。這裡無需你對 top 的使用經驗,但如果你嘗試去用一下,將更有利。
下面是一些挑戰:
默認情況下,Top 被調用時使用交互模式。在此模式下,Top 無限期運行,並可以通過按鍵重新定義 Top 的運行方式。但是,有時你需要對 Top 的輸出進行後續處理,但這在此模式下難以實現。解決方法?使用批處理模式。
$ top -b
你將獲得類似下面的輸出:
top - 15:22:45 up 4:19, 5 users, load average: 0.00, 0.03, 0.00 Tasks: 60 total, 1 running, 59 sleeping, 0 stopped, 0 zombie Cpu(s): 3.8% us, 2.9% sy, 0.0% ni, 89.6% id, 3.3% wa, 0.4% hi, 0.0% si Mem: 515896k total, 495572k used, 20324k free, 13936k buffers Swap: 909676k total, 4k used, 909672k free, 377608k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 1 root 16 0 1544 476 404 S 0.0 0.1 0:01.35 init 2 root 34 19 0 0 0 S 0.0 0.0 0:00.02 ksoftirqd/0 3 root 10 -5 0 0 0 S 0.0 0.0 0:00.11 events/0
哈,等等,它是不斷重復運行的,同交互模式一樣。不用擔心,你可以使用 -n 限制重復數量。所以,如果你希望獲得一次性結果,鍵入:
$ top -b -n 1
這一模式的真正優勢在於你可以很容易的與 at 或 cron 命令結合。它們的結合,使得 Top 可以在特定時間對資源使用狀態進行快照。例如,使用 at ,我們可以設定 top 在一分鐘之後運行。
$ cat ./test.at TERM=linux top -b -n 1 >/tmp/top-report.txt $ at -f ./test.at now+1minutes
細心的讀者可能會問“在創建新任務時,為什麼我需要在調用 Top 之前設置環境變量 TERM?”。答案是,Top 運行時需要此變量,但“at”在定時調用時並不會保留它。同上面那樣簡單的設置可以確保 Top 正常運行。
有時,我們只對幾個進程感興趣,可能只是全部進程中的4個或5個。例如,如果你想要監測進程標識(PID)為4360和4358的進程,你需要鍵入:
$ top -p 4360,4358
或
$ top -p 4360 -p 4358
看起來很簡單,只需要使用 -p 列出所有需要的 PID,並使用逗號間隔或簡單的多次使用 -p即可。
另一種可能是監測擁有特定用戶標識(UID)的進程。應對此需求,你可以使用 -u 或 -U 選項。假設用戶“johndoe”的 UID 為500,鍵入:
$ top -u johndoe
OR
$ top -u 500
或
$ top -U johndoe
結論是,你既可以純使用用戶名,也可使用數字 UID。“-u,-U?這兩者不同?”是的。同多數其它 GNU 工具一樣,選項是大小寫敏感的。-U 意味著 Top 將會搜索有效的、真實的、被保存的以及文件系統的 UID 進行匹配,而 -u 僅匹配有效的用戶id。要知道,每一個 *nix 進程在運行時都是用有效用戶標識(effective UID),而其中有些並不等同真實用戶標識。多數情況是,對類似文件系統權限或操作系統功能這項的有效用戶標識感興趣的人將會檢查它,而不是 UID。
不同於 -p 僅用於命令行選項,-U 和 -u 都可以在交互模式中使用。同你猜測的一樣,鍵入‘U’或‘u’可以依據用戶名過濾進程。同樣的規則依然適用,‘u’為有效用戶標識,‘U’為 真實/有效/保存/文件系統用戶名。你將被要求鍵入用戶名或數字 UID。