命令幾乎是每個程式員都會用到的Linux命令。這個命令用來查看Linux系統的綜合性能,比如CPU使用情況,記憶體使用情況。這個命令能幫助我快速定位程式的性能問題。 雖然這個命令很重要,但是之前對於這個命令的使用幾乎僅限於查看下哪個進程使用的CPU最高,哪個進程占用的記憶體最高。對於輸出的各個參數的含義 ...
top
命令幾乎是每個程式員都會用到的Linux命令。這個命令用來查看Linux系統的綜合性能,比如CPU使用情況,記憶體使用情況。這個命令能幫助我快速定位程式的性能問題。
雖然這個命令很重要,但是之前對於這個命令的使用幾乎僅限於查看下哪個進程使用的CPU最高,哪個進程占用的記憶體最高。對於輸出的各個參數的含義也是一知半解,更不用說top
的一些高級用法了。
本篇博客就來具體分析下top
的詳細使用方法。
top
輸出參數的含義
在Linux終端輸入top
,一般會有如下輸出。
top - 15:34:12 up 127 days, 10:23, 2 users, load average: 0.04, 0.03, 0.00
Tasks: 291 total, 1 running, 290 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.0%us, 0.3%sy, 0.0%ni, 98.3%id, 1.3%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 1792312k total, 288300k used, 1504012k free, 10384k buffers
Swap: 6291452k total, 5380k used, 6286072k free, 14128k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
372007 root 20 0 15160 1336 888 R 0.3 0.1 0:00.33 top
1 root 20 0 19356 236 88 S 0.0 0.0 0:16.06 init
... 下麵省略...
下麵就對這些輸出信息做下詳細的說明
系統運行時間和平均負載
top
輸出的第一行表示系統的運行時間和平均負載
top - 15:34:12 up 127 days, 10:23, 2 users, load average: 0.04, 0.03, 0.00
15:34:12
: 表示系統的當前時間是下午15點34分12秒;up 127 days, 10:23
:表示這個Linux系統已經啟動127天多;2 users
:表示當前有兩個用戶登陸系統,可以用who
命令查看具體是誰登陸了;load average: 0.04, 0.03, 0.00
:最近1、5和15分鐘內的平均負載
1. load average的含義
這裡我們對這個laod average
指標做下詳細說明。
laod average這個指標的含義:在特定時間間隔內運行隊列中(在CPU上運行或者等待運行多少進程)的平均進
程數(狀態是Runnable和running的線程個數的和)。上面這個解釋可能還是比較難理解。我們拿個實際的列子說明下。比如現在top命令有以下輸出:
load average: 20.14, 22.03, 15.00
20.14 表示從當前時間到過去的一分鐘內大概有 20.14個進程(線程)在等待CPU資源
22.03 表示從當前時間到過去的五分鐘內大概有 22.03個進程(線程)在等待CPU資源
15.00 表示從當前時間到過去的十五分鐘內大概有 15.00個進程(線程)在等待CPU資源
為了更好地理解這個負載的含義,下麵列了一個交通流量的列子。
單核CPU可以想象成單車道
比如每個圓圈都是小汽車,第一種是滿負荷但CPU時間片不用排隊等待正好夠用,第二種是%50空閑,第三個是超負荷50%,後面的就有隊列等待了。
單核CPU,負載數值在0.00-1.00之間正常。
- 0.00-1.00之間的數字表示此時路況非常良好,沒有擁堵,車輛可以毫無阻礙地通過。
- 1.00表示道路還算正常,但有可能會惡化並造成擁堵。此時系統已經沒有多餘的資源了,管理員需要進行優化。
- 1.00以上表示路況不太好了,如果到達2.00表示有橋上車輛一倍數目的車輛正在等待。這種情況你必須進行檢查了。
多核CPU可以想象成多車道
多核CPU的話,負載數值/CPU核數 在0.00-1.00之間表示正常。
現實生產中,不會讓負載數值/CPU核數任意接近1的。一般當這個值達到0.8或者0.9時就需要分析分析原因了。當然這個也沒有具體的定論,都是一家之言。
2. load average和CPU利用率的區別(這兩個概念很重要,希望大家仔細看看)
先直接引用下這篇文章中的截圖
上面的列子對CPU使用個CPU做了比較好的解釋,我自己也想了個列子,可能更加形象貼切。
其實,可以將CPU比喻成公司的廁所。比如說你所在的樓層有一個衛生間。每個衛生間有4個坑位(4核CPU)。一般早上的時候資源會比較緊張,在某個時間點,你做了一個統計,你發現在過去的1分鐘,5分鐘和15分鐘內分別有6個人,8個人,8個人正在”使用“廁所(這裡的人數包括等待上廁所和正在上廁所的人數),那兒此時公司廁所的負載就是6.00,8.00和8.00。通過上面的介紹我們發現此時公司廁所是過載的。(這個就是CPU負載的概念)
那麼CPU使用又是什麼意思呢?
還是以剛剛的廁所為列子。以現在的時間點到過去的15分鐘內,你發現有3個同事用了其中一個坑位。時候你採訪了下這個三個同事:在他們使用廁所的過程中多長時間是真的在上廁所?採訪結果是:第一個同事2分鐘上測試+3分鐘玩手機,第二個同事1分鐘上廁所+3分鐘胡思亂想,第三個同事3分鐘上廁所+3分鐘玩手機。
那麼這段時間內這個坑位的利用率就是(2+1+3)/15 = 40%
3. CPU負載和CPU使用率對我們的知道意義
- 高CPU負載 低CPU使用率:可能系統中較多的文件IO和網路IO操作。
- 高CPU負載 高CPU使用率:CPU資源不足
- 低CPU負載 低CPU使用率:系統CPU資源良好,道路非常順暢;
- 低CPU負載 高CPU使用率:這種情況一般都是程式的問題,比如程式中代碼進入死迴圈,有很多自旋操作等。CPU使用率一直過高對CPU傷害比較大。
上面只是列了一些比較常見的情況,具體問題還得具體分析。
任務信息
Tasks: 291 total, 1 running, 290 sleeping, 0 stopped, 0 zombie
Tasks — 任務(進程),系統現在共有 291 個進程,其中處於運行中的有1個,290個在休眠(sleep),stoped狀態的有0個,zombie狀態(僵屍)的有0個。
按 t 可以關閉顯示這個任務信息,再按下 t 可以開啟這個任務信息
CPU狀態
Cpu(s): 0.0%us, 0.3%sy, 0.0%ni, 98.3%id, 1.3%wa, 0.0%hi, 0.0%si, 0.0%st
- us 列顯示了用戶模式下所花費 CPU 時間的百分比。us的值比較高時,說明用戶進程消耗的 CPU 時間多,但是如果長期大於50%,需要考慮優化用戶的程式。
- sy 列顯示了內核進程所花費的 CPU 時間的百分比。這裡us + sy的參考值為80%,如果us+sy 大於 80%說明可能存在CPU不足。
- ni 列顯示了用戶進程空間內改變過優先順序的進程占用CPU百分比。
- id 列顯示了 CPU 處在空閑狀態的時間百分比。
- wa 列顯示了IO等待所占用的CPU時間的百分比。這裡 wa 的參考值為30%,如果wa超過30%,說明IO等待嚴重,這可能是磁碟大量隨機訪問造成的,也可能磁碟或者磁碟訪問控制器的帶寬瓶頸造成的(主要是塊操作)。 這個wa和vmstat中的wa是相同含義。
- hi 硬體中斷占用CPU
- si 軟體中斷占用CPU
- st 丟失時間占用CPU
在後臺開發中需要關註us,sy,id,wa等常用指標。
按數字 1,可以查看CPU的核數和每個CPU的使用情況。
記憶體使用情況
Mem: 1792312k total, 288300k used, 1504012k free, 10384k buffers
Swap: 6291452k total, 5380k used, 6286072k free, 14128k cached
關於這些值表示的具體含義,我在我的博客Linux 記憶體分析工具——free命令中詳細分析過,大家可以參考。
進程的狀態監控
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
372007 root 20 0 15160 1336 888 R 0.3 0.1 0:00.33 top
1 root 20 0 19356 236 88 S 0.0 0.0 0:16.06 init
- PID:進程ID,進程的唯一標識符
- USER:進程所有者的實際用戶名。
- PR:進程的調度優先順序。這個欄位的一些值是'rt'。這意味這這些進程運行在實時態。
- NI:進程的nice值(優先順序)。越小的值意味著越高的優先順序。負值表示高優先順序,正值表示低優先順序
- VIRT:進程使用的虛擬記憶體。進程使用的虛擬記憶體總量,單位kb。VIRT=SWAP+RES
- RES:駐留記憶體大小。駐留記憶體是任務使用的非交換物理記憶體大小。進程使用的、未被換出的物理記憶體大小,單位kb。RES=CODE+DATA
- SHR:SHR是進程使用的共用記憶體。共用記憶體大小,單位kb
- S:這個是進程的狀態。它有以下不同的值:
- D - 不可中斷的睡眠態。
- R – 運行態
- S – 睡眠態
- T – 被跟蹤或已停止
- Z – 僵屍態
- %CPU:自從上一次更新時到現在任務所使用的CPU時間百分比。
- %MEM:進程使用的可用物理記憶體百分比。
- TIME+:任務啟動後到現在所使用的全部CPU時間,精確到百分之一秒。
- COMMAND:運行進程所使用的命令。進程名稱(命令名/命令行)
還有許多在預設情況下不會顯示的輸出,它們可以顯示進程的頁錯誤、有效組和組ID和其他更多的信息。
按下 f 鍵盤可以調出更多顯示選項。按esc鍵返回top顯示頁。
top的一些命令行參數
- -b:批處理模式(batch mode),可輸出到管道、文件。預設情況下-b會一直輸出,可以用-nN指定輸出次數。
- -n N:限制輸出次數。
- -d N:刷新時間間隔。
- -p PID:監控指定進程。
- -Hp PID:監控指定進程和進行內線程信息。(比較常用)
top一些交互鍵的說明
進入top頁面後,我們可以進行一些交互操作。下麵是一些交互鍵的說明:
- c 顯示完整的命令名。c為Command之意。
- d 修改刷新時間。d為Display之意。
- u 顯示指定用戶相關進程。u為User之意。
- P 按CPU使用排序。P為Processor(處理器)之意。
- M 按記憶體使用排序。M為Momery之意。
- F 排序(進入新的界面,並選擇排序的目標欄位)。
- R 順序或逆序。
- H 顯示線程
- Z 以多色彩顯示top。
參考
- top命令輸出解釋以及load average 詳解及排查思路
- http://wenku.baidu.com/view/6597f58884254b35eefd34f7.html
- linux top顯示的各個符號參數意義詳解