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


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。

參考


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM