Linux下常用的監控工具和命令

  • 2019 年 10 月 6 日
  • 筆記

前言:

如果性能測試的目標服務器是linux系統,在如何使用linux自帶的命令來實現性能測試過程的監控分析呢?

對於日常性能測試來講,在linux下或是類Unix系統,我們必須掌握以下常用的指標查看命令。

  • ps
  • pstree
  • top
  • free
  • vmstat
  • iostat
  • iotop
  • sar

當然還有其他命令,這裡就上述筆者常用的命令推薦大家掌握。

ps


ps命令能給出當前系統中進程的快照。下面我們列舉幾個常用的選項,對於其他的請參考官方文檔或是自行搜索相關文檔。

  • 使用 -a 參數。-a 代表 all。同時加上x參數會顯示沒有控制終端的進程。
ps -ax
  • 通過我們會查找某類或包含某些指定關鍵字的進程,這是會使用管道結合grep命令來進一步過濾結果。
例如查找java相關的進程ps -ax | grep java
  • 有時我們則需要根據CPU和內存的使用情況來過濾排序篩選結果,這樣便於快速找到哪個進程最耗CPU、內存
ps -aux
  • 根據CPU的使用升序排序
ps -aux --sort -pcpu
  • 根據內存使用升序排序
ps -aux --sort -pmem
  • 上述兩個命令合併一起,如下:
ps -aux --sort -pcpu,+pmem
  • 只顯示前幾個進程,例如顯示前十個,需要使用管道結合head命令。
ps -aux | head -n 10

還有很多用法,這裡就不做過多的列舉。

pstree

pstree命令以樹狀圖顯示進程間的關係。

下面我們看幾個常用的示例。

  • 以樹狀圖顯示進程,只顯示進程的名字,且相同進程合併顯示。
pstree
  • 以樹狀圖顯示進程,還顯示進程PID。
pstree -p
  • 以樹狀圖顯示進程PID為<pid>的進程以及子孫進程,如果有-p參數則同時顯示每個進程的PID。
pstree <pid>或pstree -p <pid>
  • 以樹狀圖顯示進程,相同名稱的進程不合併顯示,並且會顯示命令行參數,如果有-p參數則同時顯示每個進程的PID。
pstree -a

為什麼要用pstree命令,通過該命令,能讓你更清晰的了解你要監控的目標服務關聯了哪些資源,能讓你更加清楚其資源關聯情況,增加在性能測試過程中分析的準確性。

不管是ps還是pstree命令,在性能測試過程中,最重要的一個應用技巧就是獲取資源消耗最高的目標進程的線程id。例如:

ps -mp <pid> -o THREAD 或ps -Lfp <pid><pid> 為目標進程id

在找到其線程id後就可以使用

printf "%x  " 線程id

轉換成十六進制數

然後結合jstack命令,獲取其堆棧信息以供分析。

top

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

與ps不同的是,top顯示系統當前的進程和其他狀況,是一個動態顯示過程,即可以通過用戶按鍵來不斷刷新當前狀態。

直接使用即可

top

常規情況下主要關注以下指標:

  • load average: 0.02, 0.10, 0.13 系統負載,即任務隊列的平均長度。三個數值分別為 1分鐘、5分鐘、15分鐘前到現在的平均值。
  • total 進程總數
  • running 正在運行的進程數
  • sleeping 睡眠的進程數
  • stopped 停止的進程數
  • zombie 殭屍進程數

Cpu(s):

  • us 用戶空間佔用CPU百分比
  • sy 內核空間佔用CPU百分比
  • id 空閑CPU百分比

Mem:

  • total 物理內存總量
  • used 使用的物理內存總量
  • free 空閑內存總量
  • buffers 用作內核緩存的內存量

對於進程詳細的表頭重點關註:PID、USER、PR、NI、VIRT、RES、SHR、S、%CPU、%MEM、TIME+、COMMAND 列。

具體含義不做說明了。

另外常用的top命令選項如下:top 每隔5秒顯式所有進程的資源佔用情況 top -d 2 每隔2秒顯式所有進程的資源佔用情況 top -c 每隔5秒顯式進程的資源佔用情況,並顯示進程的命令行參數(默認只有進程名) top -p <pid1> -p <pid2> 每隔5秒顯示pid是pid1和pid是pid2的兩個進程的資源佔用情況 top -d 2 -c -p <pid> 每隔2秒顯示pid是pid的進程的資源使用情況,並顯式該進程啟動的命令行參數

free

查看內存情況,將used的值減去buffer和cache的值就是你當前真實內存使用。

Mem:表示物理內存統計

  • total:表示物理內存總量(total = used + free)
  • used:表示總計分配給緩存(包含buffers 與cache )使用的數量,但其中可能部分緩存並未實際使用。
  • free:未被分配的內存。
  • shared:共享內存,一般系統不會用到。
  • buffers:系統分配但未被使用的buffers 數量。
  • cached:系統分配但未被使用的cache 數量。

-/+ buffers/cache:表示物理內存的緩存統計

  • used:也就是第一行中的used – buffers-cached 也是實際使用的內存總量。
  • Swap:表示硬盤上交換分區的使用情況,這裡我們不做關注。

但對於應用程序來說,buffers/cached 是等於可用的,因為buffer/cached是為了提高文件讀取的性能,當應用程序需在用到內存的時候,buffer/cached會很快地被回收。所以從應用程序的角度來說 可用內存=系統free memory+buffers+cached.

buffers是指用來給塊設備做的緩衝大小,只記錄文件系統的metadata以及 tracking in-flight pages. cached是用來給文件做緩衝。

使用free命令,能讓你清楚的了解當前系統內存消耗情況。

vmstat

vmstat命令是最常見的Linux/Unix監控工具,可以展現給定時間間隔的服務器的狀態值,包括服務器的CPU使用率,內存使用,虛擬內存交換情況,IO讀寫情況。

相比於top、free等命令,vmstat可以看到整個機器的CPU,內存,IO的消耗情況。

一般情況下vmstat工具的使用是通過兩個數字參數來完成的,第一個參數是採樣的時間間隔數,單位是秒,第二個參數是採樣的次數,如下命令:

vmstat 2 1

2表示每隔兩秒採集一次服務器狀態,1表示只採集一次。

這個命令是做性能測試進一步診斷分析必須掌握的的

下面我們對其進行更詳細的說明:

procs

  • r列 顯示運行和等待CPU時間片的進程數,若其值長時間大於系統CPU個數,就說明CPU資源可能不足,可以考慮增加CPU;
  • b列 顯示在等待資源的進程數,比如正在等待I/O或者內存交換等。

memory

  • swpd列 顯示切換到內存交換區的內存數量(以KB為單位)。若swpd的值不為0或者比較大,同時si、so的值長時間為0,那這種情況一般不用擔心,不會影響系統性能
  • free列 顯示當前空閑的物理內存數量(以KB為單位)
  • buff列 顯示buffers cache的內存數量,一般對塊設備的讀寫才需要緩衝
  • cache列 顯示page cached的內存數量,一般作文件系統的cached,頻繁訪問的文件都會被cached。如果cached值較大,就說明cached文件數較多。如果此時IO中的bi比較小,就說明文件系統效率比較好

swap

  • si列 顯示由磁盤調入內存,也就是內存進入內存交換區的數量
  • so列 顯示由內存調入磁盤,也就是內存交換區進入內存的數量

一般情況下,si、so的值都為0,如果si、so的值長時間不為0,則表示系統內存不足,需要考慮是否增加系統內存。

IO

  • bi列 顯示從塊設備讀入的數據總量(即讀磁盤,單位KB/秒)
  • bo列 顯示寫入到塊設備的數據總量(即寫磁盤,單位KB/秒)

這裡設置的bi+bo參考值為1000,如果超過1000,而且wa值比較大,則表示系統磁盤IO性能瓶頸。

system

  • in列表示在某一時間間隔中觀察到的每秒設備中斷數
  • cs列表示每秒產生的上下文切換次數

上面這兩個值越大,會看到內核消耗的CPU時間就越多,這個時候可能要考慮下為何內核的消耗會這麼大,有可能有瓶頸存在。

CPU

  • us列 顯示了用戶進程消耗CPU的時間百分比。us的值比較高時,說明用戶進程消耗的CPU時間多,如果長期大於50%,需要考慮優化程序啥的。
  • sy列顯示了內核進程消耗CPU的時間百分比。sy的值比較高時,就說明內核消耗的CPU時間多;如果us+sy超過80%,就說明CPU的資源存在不足。
  • id列 顯示了CPU處在空閑狀態的時間百分比
  • wa列 顯示IO等待所佔的CPU時間百分比。wa值越高,說明IO等待越嚴重。如果wa值超過20%,說明IO等待嚴重
  • st列 虛擬機佔用的時間百分比。

sar

sar(System Activity Reporter系統活動情況報告)是目前 Linux 上最為全面的系統性能分析工具之一,可以從多方面對系統的活動進行報告,包括:文件的讀寫情況、系統調用的使用情況、磁盤I/O、CPU效率、內存使用狀況、進程活動及IPC有關的活動等。

如果你的系統沒安裝該命令,請用以下方式進行安裝

apt-get install sysstatyum install sysstat

安裝完成後在用以下命令啟用:

vi /etc/default/sysstat將ENABLED改為「true」ENABLED="true"

重啟下sar服務,開始採集相關數據

/etc/init.d/sysstat start
  • 命令常用格式

sar [options] [-A] [-o file] t [n]

其中:

t為採樣間隔,n為採樣次數,默認值是1;

-o file表示將命令結果以二進制格式存放在文件中,file 是文件名。

options 為命令行選項,sar命令常用選項如下:

  • sar參數說明
-A 查看匯總所有的報告-a 查看文件讀寫使用情況-B 查看附加的緩存的使用情況-b 查看緩存的使用情況-c 查看系統調用的使用情況-d 查看磁盤的使用情況-g 查看串口的使用情況-h 查看關於buffer使用的統計數據-m 查看IPC消息隊列和信號量的使用情況-n 查看命名cache的使用情況-p 查看調頁活動的使用情況-q 查看運行隊列和交換隊列的平均長度-R 查看進程的活動情況-r 查看沒有使用的內存頁面和硬盤塊-u 查看CPU的利用率-v 查看進程、文件和鎖表狀態-w 查看系統交換活動狀況-y 查看TTY設備活動狀況
  • 查看CPU是否存在瓶頸:
sar -u sar -q
  • 查看內存是否存在瓶頸:
sar -Bsar -rsar -W
  • 查看IO是否存在瓶頸
sar -bsar -usar -d
  • 示例

例如,每10秒採樣一次,連續採樣3次,觀察CPU 的使用情況,並將採樣結果以二進制形式存入當前目錄下的文件cpu_info中,需鍵入如下命令:

sar -u -o cpu_info 10 3

iostat

iostat主要用於監控系統設備的IO負載情況,iostat首次運行時顯示自系統啟動開始的各項統計信息,之後運行iostat將顯示自上次運行該命令以後的統計信息。用戶可以通過指定統計的次數和時間來獲得所需的統計信息。

iotop

如果你想知道每個進程是如何使用IO的就比較麻煩。這個時候iotop可以上場了。

iotop 是一個用來監視磁盤 I/O 使用狀況的 top 類工具。iotop 具有與 top 相似的 UI,其中包括 PID、用戶、I/O、進程等相關信息。

其他命令

mpstat、netstat、pidstat也是常用的,大家看相關手冊學習。這裡不再進行說明

總結

linux的監控篇就分享這些,vmstat、sar必須掌握,至於top、free等簡單命令,是基本的了,肯定是也要掌握的。不管怎麼樣,對於這些命令還是要多練習,多去把各個命令選項都用用,看看實際的輸出,對分析下各個指標間的關係。

會使用命令其次的,關鍵是拿到這些值後,你該怎麼去分析。就像性能測試一樣,會工具簡單的壓測不叫會性能,而是懂得結合資源分析場景結果,性能調優

腳本:苦葉子

圖片:苦葉子

來源:苦葉子


/ END