1. 程式人生 > >Top命令你最少要了解到這個程度

Top命令你最少要了解到這個程度

`top`命令幾乎是每個程式設計師都會用到的Linux命令。這個命令用來檢視Linux系統的綜合性能,比如CPU使用情況,記憶體使用情況。這個命令能幫助我快速定位程式的效能問題。 雖然這個命令很重要,但是之前對於這個命令的使用幾乎僅限於檢視下哪個程序使用的CPU最高,哪個程序佔用的記憶體最高。對於輸出的各個引數的含義也是一知半解,更不用說`top`的一些高階用法了。 本篇部落格就來具體分析下`top`的詳細使用方法。 ## `top`輸出引數的含義 在Linux終端輸入`top`,一般會有如下輸出。 ```bash 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`輸出的第一行表示系統的執行時間和平均負載 ```bash 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可以想象成單車道** ![](https://img2020.cnblogs.com/blog/1775037/202003/1775037-20200318172234407-279875040.png) 比如每個圓圈都是小汽車,第一種是滿負荷但CPU時間片不用排隊等待正好夠用,第二種是%50空閒,第三個是超負荷50%,後面的就有佇列等待了。 **單核CPU,負載數值在0.00-1.00之間正常。** - 0.00-1.00之間的數字表示此時路況非常良好,沒有擁堵,車輛可以毫無阻礙地通過。 - 1.00表示道路還算正常,但有可能會惡化並造成擁堵。此時系統已經沒有多餘的資源了,管理員需要進行優化。 - 1.00以上表示路況不太好了,如果到達2.00表示有橋上車輛一倍數目的車輛正在等待。這種情況你必須進行檢查了。 **多核CPU可以想象成多車道** ![](https://img2020.cnblogs.com/blog/1775037/202003/1775037-20200318172306668-115437416.png) 多核CPU的話,負載數值/CPU核數 在0.00-1.00之間表示正常。 現實生產中,不會讓負載數值/CPU核數任意接近1的。一般當這個值達到0.8或者0.9時就需要分析分析原因了。當然這個也沒有具體的定論,都是一家之言。 **2. load average和CPU利用率的區別(這兩個概念很重要,希望大家仔細看看)** 先直接引用下[這篇文章](https://blog.csdn.net/zhangchenglikecc/article/details/52103737)中的截圖 ![](https://img2020.cnblogs.com/blog/1775037/202003/1775037-20200318172334117-1705911366.png) ![](https://img2020.cnblogs.com/blog/1775037/202003/1775037-20200318172342212-1315777530.png) ![](https://img2020.cnblogs.com/blog/1775037/202003/1775037-20200318172350188-1966282296.png) **上面的列子對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命令](https://www.cnblogs.com/54chensongxia/p/12330592.html)中詳細分析過,大家可以參考。 ### 程序的狀態監控 ``` 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 詳解及排查思路](https://blog.csdn.net/zhangchenglikecc/article/details/52103737) - http://wenku.baidu.com/view/6597f58884254b35eefd34f7.html - [linux top顯示的各個符號引數意義詳解](https://blog.csdn.net/csdn066/article/details/7