1. 程式人生 > 其它 >Linux之7----效能調優命令之top

Linux之7----效能調優命令之top

top命令是Linux下常用的效能分析工具,能夠實時顯示系統中各個程序的資源佔用狀況,類似於Windows的工作管理員。

在linux系統下輸入top命令如下:

引數含義

top - 00:10:55 up 81 days,  6:00, 17 users,  load average: 0.00, 0.02, 0.05
Tasks: 155 total,   1 running, 153 sleeping,   0 stopped,   1 zombie
%Cpu(s):  0.7 us,  0.3 sy,  0.0 ni, 99.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  3881920 total,   467472 free,   724592 used,  2689856 buff/cache
KiB Swap:        0 total,        0 free,        0 used.  
2632956 avail Mem

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
9 root 20 0 0 0 0 S 0.3 0.0 20:17.67 rcu_sched
400 root 20 0 1381588 37088 5316 S 0.3 1.0 247:34.50 CmsGoAgent.linu
6547 root 10 -10 165896 42956 6564 S 0.3 1.1 159:56.44 AliYunDun

7364 44854885 20 0 3551588 91672 15488 S 0.3 2.4 36:26.60 java
11880 root 20 0 116268 15576 4424 S 0.3 0.4 128:42.67 node_exporter
1 root 20 0 125952 3636 1532 S 0.0 0.1 27:24.68 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.69 kthreadd
3 root 20 0 0 0 0 S 0.0 0.0 0:37.74 ksoftirqd/0
5 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H
7 root rt 0 0 0 0 S 0.0 0.0 0:49.07 migration/0
8 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcu_bh

統計資訊區前五行是系統整體的統計資訊。

第一行是任務佇列資訊,同 uptime 命令的執行結果。其內容如下:

00:10:55       當前時間
up 81 days,  6:00,    系統已執行時間(天:時:分)
17 users,     當前登入使用者數
load average: 0.00, 0.02, 0.05     系統負載,即任務佇列的平均長度。三個數值分別為 1分鐘、5分鐘、15分鐘前到現在的平均值

load average:負載,相當於程序排隊的佇列,比如有一條一百米長的公路,公路上面有車,一輛車長3米,那麼一百米長的公路最多放33輛車

一隻單核的處理器可以形象得比喻成一條單車道。設想下,你現在需要收取這條道路的過橋費 — 忙於處理那些將要過橋的車輛。你首先當然需要了解些資訊,例如車輛的載重、以及 還有多少車輛正在等待過橋。如果前面沒有車輛在等待,那麼你可以告訴後面的司機通過。 如果車輛眾多,那麼需要告知他們可能需要稍等一會。

因此,需要些特定的代號表示目前的車流情況,例如:

0.00 表示目前橋面上沒有任何的車流。 實際上這種情況與 0.00 和 1.00 之間是相同的,總而言之很通暢,過往的車輛可以絲毫不用等待的通過。

1.00 表示剛好是在這座橋的承受範圍內。 這種情況不算糟糕,只是車流會有些堵,不過這種情況可能會造成交通越來越慢。

超過 1.00,那麼說明這座橋已經超出負荷,交通嚴重的擁堵。 那麼情況有多糟糕? 例如 2.00 的情況說明車流已經超出了橋所能承受的一倍,那麼將有多餘過橋一倍的車輛正在焦急的等待。3.00 的話情況就更不妙了,說明這座橋基本上已經快承受不了,還有超出橋負載兩倍多的車輛正在等待。

上面的情況和處理器的負載情況非常相似。一輛汽車的過橋時間就好比是處理器處理某執行緒 的實際時間。Unix 系統定義的程序執行時長為所有處理器核心的處理時間加上執行緒 在佇列中等待的時間。

load average值的含義

1) 單核處理器

假設我們的系統是單CPU單核心的,把它比喻成是一條單向馬路,把CPU任務比作汽車。當車不多的時候,load <1;當車佔滿整個馬路的時候 load=1;當馬路都站滿了,而且馬路外還堆滿了汽車的時候,load>1

2) 多核處理器

我們經常會發現伺服器Load > 1但是執行仍然不錯,那是因為伺服器是多核處理器(Multi-core)。
假設我們伺服器CPU是2核,那麼將意味我們擁有2條馬路,我們的Load = 2時,所有馬路都跑滿車輛。

:檢視cpu 核數命令:

grep 'model name' /proc/cpuinfo | wc -l

3. 什麼樣的Load average值要提高警惕

  • 0.7 < load < 1: 此時是不錯的狀態,如果進來更多的汽車,你的馬路仍然可以應付。
  • load = 1: 你的馬路即將擁堵,而且沒有更多的資源額外的任務,趕緊看看發生了什麼吧。
  • load > 5: 非常嚴重擁堵,我們的馬路非常繁忙,每輛車都無法很快的執行

4. 三種Load值,應該看哪個

通常我們先看15分鐘load,如果load很高,再看1分鐘和5分鐘負載,檢視是否有下降趨勢。
1分鐘負載值 > 1,那麼我們不用擔心,但是如果15分鐘負載都超過1,我們要趕緊看看發生了什麼事情。所以我們要根據實際情況檢視這三個值。

第二、三行為程序和CPU的資訊。當有多個CPU時,這些內容可能會超過兩行。內容如下:

total 程序總數
running 正在執行的程序數
sleeping 睡眠的程序數
stopped 停止的程序數
zombie 殭屍程序數
Cpu(s): 
0.3% us 使用者空間佔用CPU百分比
1.0% sy 核心空間佔用CPU百分比
0.0% ni 使用者程序空間內改變過優先順序的程序佔用CPU百分比
98.7% id 空閒CPU百分比
0.0% wa 等待輸入輸出的CPU時間百分比
0.0%hi:硬體CPU中斷佔用百分比
0.0%si:軟中斷佔用百分比
0.0%st:虛擬機器佔用百分比

最後兩行為記憶體資訊。內容如下:

Mem:
191272k total    實體記憶體總量
173656k used    使用的實體記憶體總量
17616k free    空閒記憶體總量
22052k buff/cache    用作核心快取的記憶體量
Swap: 
192772k total    交換區總量
0k used    使用的交換區總量
192772k free    空閒交換區總量
123988k cached    緩衝的交換區總量,記憶體中的內容被換出到交換區,而後又被換入到記憶體,但使用過的交換區尚未被覆蓋,該數值即為這些內容已存在於記憶體中的交換區的大小,相應的記憶體再次被換出時可不必再對交換區寫入。

程序資訊區統計資訊區域的下方顯示了各個程序的詳細資訊。首先來認識一下各列的含義。

序號  列名    含義
a    PID     程序id
b    PPID    父程序id
c    RUSER   Real user name
d    UID     程序所有者的使用者id
e    USER    程序所有者的使用者名稱
f    GROUP   程序所有者的組名
g    TTY     啟動程序的終端名。不是從終端啟動的程序則顯示為 ?
h    PR      優先順序
i    NI      nice值。負值表示高優先順序,正值表示低優先順序
j    P       最後使用的CPU,僅在多CPU環境下有意義
k    %CPU    上次更新到現在的CPU時間佔用百分比
l    TIME    程序使用的CPU時間總計,單位秒
m    TIME+   程序使用的CPU時間總計,單位1/100秒
n    %MEM    程序使用的實體記憶體百分比
o    VIRT    程序使用的虛擬記憶體總量,單位kb。VIRT=SWAP+RES
p    SWAP    程序使用的虛擬記憶體中,被換出的大小,單位kb。
q    RES     程序使用的、未被換出的實體記憶體大小,單位kb。RES=CODE+DATA
r    CODE    可執行程式碼佔用的實體記憶體大小,單位kb
s    DATA    可執行程式碼以外的部分(資料段+棧)佔用的實體記憶體大小,單位kb
t    SHR     共享記憶體大小,單位kb
u    nFLT    頁面錯誤次數
v    nDRT    最後一次寫入到現在,被修改過的頁面數。
w    S       程序狀態(D=不可中斷的睡眠狀態,R=執行,S=睡眠,T=跟蹤/停止,Z=殭屍程序)
x    COMMAND 命令名/命令列
y    WCHAN   若該程序在睡眠,則顯示睡眠中的系統函式名
z    Flags   任務標誌,參考 sched.h

以下2個命令會很大的CPU使用,可以通過以下2個命令結合top命令觀察CPU使用率

{ yes > /dev/null & } && sleep 30 && ps -ef|grep yes|awk '{print $2}' |xargs kill

for i in $(seq 0 $(($(cat /proc/cpuinfo |grep processor|wc -l)-1)));do taskset -c $i yes > /dev/null & done && sleep 30 && ps -ef|grep yes|awk '{print $2}'|xargs kill

常用命令

  • -d 時間間隔
  • -n 執行次數
  • -p 檢視指定埠的程序資料
  • -b 批處理輸出
top互動命令 在top命令執行過程中可以使用的一些互動命令。這些命令都是單字母的,如果在命令列中使用了s選項,其中一些命令可能會被遮蔽。
  • h顯示幫助畫面,給出一些簡短的命令總結說明
  • k終止一個程序。
  • i忽略閒置和僵死程序。這是一個開關式命令。
  • q退出程式
  • r重新安排一個程序的優先級別
  • S切換到累計模式
  • s改變兩次重新整理之間的延遲時間(單位為s),如果有小數,就換算成ms。輸入0值則系統將不斷重新整理,預設值是5s
  • f或者F從當前顯示中新增或者刪除專案
  • o或者O改變顯示專案的順序
  • l切換顯示平均負載和啟動時間資訊
  • m切換顯示記憶體資訊
  • t切換顯示程序和CPU狀態資訊
  • c切換顯示命令名稱和完整命令列
  • M根據駐留記憶體大小進行排序
  • P根據CPU使用百分比大小進行排序
  • T根據時間/累計時間進行排序
  • W將當前設定寫入~/.toprc檔案中

檢視某程序下消耗CPU比較高的執行緒:

top -H -p pid

效能統計 perf_avg

統計某程序的cpu與mem,

  • 要求統計n次,一次間隔1s,
  • 最後輸出平均cpu與mem資料。
  • 欄位之間用tab隔開,平均數與之前的資料錯開一行
  • 支援輸入不同的程序標記來統計不同程序的資料
perf_avg() {
    top -b -d 1 -n $2 |
        grep -i "$1" \
            --color=auto \
            --line-buffered |
        awk '
        BEGIN{OFS="\t"}
        {
            cpu+=$9;
            mem+=$10;
            print $9,$10
        }
        END{
            print "";
            print cpu/NR, mem/NR
        }
        '
}

統計AliYunDun5次的平均CPU與men

$ perf_avg AliYunDun 5
0.0    0.1
0.0    1.2
2.0    1.2
0.0    0.1
4.0    1.2
0.0    0.1
2.0    1.2
0.0    0.1
1.0    0.1
1.0    1.2

1 0.65