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 MemPID 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 killfor 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 批處理輸出
- 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.21 0.65