天天看點

linux: 系統狀态檢視工具linux: 系統狀态工具

linux: 系統狀态工具

作為常年在win下面操作的普通程式員,window下面幾乎萬能的任務管理器實在是居家旅行出門必備的神器.但是一旦涉及Linux下,原本和Windows作業系統鬥智鬥勇的經驗就淪為灰煙.本文将總結那些常用的系統狀态工具,以作為整理(其實是本人看了<高性能MySQL>中關于系統參數一章後實在沒什麼可以總結的東西,寫了這一篇)

PS

ps:report a snapshot of the current processes.翻譯成中文就是傳回目前程序的快照.使用該指令可以确定有哪些程序正在運作和運作的狀态,程序是否結束,程序有沒有僵屍.哪些程序占用了過多的資源等等.總之大部分資訊都是可以通過執行該指令得到。ps是顯示瞬間程序的狀态,并不動态連續;如果想對程序進行實時監控應該用top指令.

參數:

-A : 所有的程序均顯示出來,與 -e 具有同樣的效用;

-a : 顯示現行終端機下的所有程序,包括其他使用者的程序;

-u : 以使用者為主的程序狀态;

x :通常與 a 這個參數一起使用,可列出較完整資訊。

輸出格式規劃:

l :較長、較詳細的将該PID 的的資訊列出;

j :工作的格式 (jobs format)

-f :做一個更為完整的輸出。

<鳥哥的Linux私房菜>(天不生鳥哥,不知道有多少Linux小白要被國内那些垃圾書和垃圾翻譯給污染.順便一提鳥哥不是程式員,我認識的朋友裡面也有那種搞攝影裝置但是Linux玩的非常溜的朋友)一書中重點說了隻需要記住兩組指令.1是隻查詢自己bash程式的”ps -l”. 一種是檢視所有程序的”ps aux”

linux: 系統狀态檢視工具linux: 系統狀态工具

F 代表這個程式的旗标 (flag), 4 代表使用者為 superuser;

S 代表這個程式的狀态 (STAT);

UID 代表執行者身份;

PID 程序的ID号;

PPID 父程序的ID;

C CPU使用的資源百分比

PRI指程序的執行優先權(Priority的簡寫),其值越小越早被執行;

NI 這個程序的nice值,其表示程序可被執行的優先級的修正數值。

ADDR 這個是核心函數,指出該程式在記憶體的那個部分。如果是個執行 的程式,一般就是『 - 』

SZ 使用掉的記憶體大小;

WCHAN 目前這個程式是否正在運作當中,若為 - 表示正在運作;

TTY 登入者的終端機位置;

TIME 使用掉的 CPU 時間。

CMD 所下達的指令名稱

linux: 系統狀态檢視工具linux: 系統狀态工具

USER:該程序屬于那個使用者賬号。

PID :該程序的程序ID号。

%CPU:該程序使用掉的 CPU 資源百分比;

%MEM:該程序所占用的實體記憶體百分比;

VSZ :該程序使用掉的虛拟記憶體量 (Kbytes)

RSS :該程序占用的固定的記憶體量 (Kbytes)

TTY :該程序是在那個終端機上面運作,若與終端機無關,則顯示 ?。另外, tty1-tty6 是本機上面的登入者程式,若為 pts/0 等等的,則表示為由網絡連接配接進主機的程式。

STAT:該程式目前的狀态

主要的狀态有:

- R :該程式目前正在運作,或者是可被運作;

- S :該程式目前正在睡眠當中,但可被某些訊号(signal) 喚醒。

- T :該程式目前正在偵測或者是停止了;

- Z :該程式應該已經終止,但是其父程式卻無法正常的終止他,造成 zombie (疆屍) 程式的狀态

START:該程序被觸發啟動的時間;

TIME :該程序實際使用 CPU 運作的時間。

COMMAND:該程式的實際指令

### top

top指令能夠實時顯示系統中各個程序的資源占用狀況,常用于服務端性能分析.

linux: 系統狀态檢視工具linux: 系統狀态工具

top指令的結果分為兩個部分:

統計資訊:前五行是系統整體的統計資訊;

程序資訊:統計資訊下方類似表格區域顯示的是各個程序的詳細資訊,預設5秒重新整理一次。

統計資訊說明:

  • 第1行:Top 任務隊列資訊(系統運作狀态及平均負載),與uptime指令結果相同。

    第1段:系統目前時間,例如:16:07:37

    第2段:系統運作時間,未重新開機的時間,時間越長系統越穩定。

    格式:up xx days, HH:MM

    例如:241 days, 20:11, 表示連續運作了241天20小時11分鐘

    第3段:目前登入使用者數,例如:1 user,表示目前隻有1個使用者登入

    第4段:系統負載,即任務隊列的平均長度,3個數值分别統計最近1,5,15分鐘的系統平均負載

    系統平均負載:單核CPU情況下,0.00 表示沒有任何負荷,1.00表示剛好滿負荷,超過1側表示超負荷,理想值是0.7;

    多核CPU負載:CPU核數 * 理想值0.7 = 理想負荷,例如:4核CPU負載不超過2.8何表示沒有出現高負載。

  • 第2行:Tasks 程序相關資訊

    第1段:程序總數,例如:Tasks: 231 total, 表示總共運作231個程序

    第2段:正在運作的程序數,例如:1 running,

    第3段:睡眠的程序數,例如:230 sleeping,

    第4段:停止的程序數,例如:0 stopped,

    第5段:僵屍程序數,例如:0 zombie

  • 第3行:Cpus CPU相關資訊,如果是多核CPU,按數字1可顯示各核CPU資訊,此時1行将轉為Cpu核數行,數字1可以來回切換。

    第1段:us 使用者空間占用CPU百分比,例如:Cpu(s): 12.7%us,

    第2段:sy 核心空間占用CPU百分比,例如:8.4%sy,

    第3段:ni 使用者程序空間内改變過優先級的程序占用CPU百分比,例如:0.0%ni,

    第4段:id 空閑CPU百分比,例如:77.1%id,

    第5段:wa 等待輸入輸出的CPU時間百分比,例如:0.0%wa,

    第6段:hi CPU服務于硬體中斷所耗費的時間總額,例如:0.0%hi,

    第7段:si CPU服務軟中斷所耗費的時間總額,例如:1.8%si,

    第8段:st Steal time 虛拟機被hypervisor偷去的CPU時間(如果目前處于一個hypervisor下的vm,實際上hypervisor也是要消耗一部分CPU處理時間的)

  • 第4行:Mem 記憶體相關資訊(Mem: 12196436k total, 12056552k used, 139884k free, 64564k buffers)

    第1段:實體記憶體總量,例如:Mem: 12196436k total,

    第2段:使用的實體記憶體總量,例如:12056552k used,

    第3段:空閑記憶體總量,例如:Mem: 139884k free,

    第4段:用作核心緩存的記憶體量,例如:64564k buffers

  • 第5行:Swap 交換分區相關資訊(Swap: 2097144k total, 151016k used, 1946128k free, 3120236k cached)

    第1段:交換區總量,例如:Swap: 2097144k total,

    第2段:使用的交換區總量,例如:151016k used,

    第3段:空閑交換區總量,例如:1946128k free,

    第4段:緩沖的交換區總量,3120236k cached

程序資訊:

在top指令中按f按可以檢視顯示的列資訊,按對應字母來開啟/關閉列,大寫字母表示開啟,小寫字母表示關閉。帶*号的是預設列。

  • A: PID = (Process Id) 程序Id;
  • E: USER = (User Name) 程序所有者的使用者名;
  • H: PR = (Priority) 優先級
  • I: NI = (Nice value) nice值。負值表示高優先級,正值表示低優先級
  • O: VIRT = (Virtual Image (kb)) 程序使用的虛拟記憶體總量,機關kb。VIRT=SWAP+RES
  • Q: RES = (Resident size (kb)) 程序使用的、未被換出的實體記憶體大小,機關kb。RES=CODE+DATA
  • T: SHR = (Shared Mem size (kb)) 共享記憶體大小,機關kb
  • W: S = (Process Status) 程序狀态。D=不可中斷的睡眠狀态,R=運作,S=睡眠,T=跟蹤/停止,Z=僵屍程序
  • K: %CPU = (CPU usage) 上次更新到現在的CPU時間占用百分比
  • N: %MEM = (Memory usage (RES)) 程序使用的實體記憶體百分比
  • M: TIME+ = (CPU Time, hundredths) 程序使用的CPU時間總計,機關1/100秒
  • b: PPID = (Parent Process Pid) 父程序Id
  • c: RUSER = (Real user name)
  • d: UID = (User Id) 程序所有者的使用者id
  • f: GROUP = (Group Name) 程序所有者的組名
  • g: TTY = (Controlling Tty) 啟動程序的終端名。不是從終端啟動的程序則顯示為 ?
  • j: P = (Last used cpu (SMP)) 最後使用的CPU,僅在多CPU環境下有意義
  • p: SWAP = (Swapped size (kb)) 程序使用的虛拟記憶體中,被換出的大小,機關kb
  • l: TIME = (CPU Time) 程序使用的CPU時間總計,機關秒
  • r: CODE = (Code size (kb)) 可執行代碼占用的實體記憶體大小,機關kb
  • s: DATA = (Data+Stack size (kb)) 可執行代碼以外的部分(資料段+棧)占用的實體記憶體大小,機關kb
  • u: nFLT = (Page Fault count) 頁面錯誤次數
  • v: nDRT = (Dirty Pages count) 最後一次寫入到現在,被修改過的頁面數
  • y: WCHAN = (Sleeping in Function) 若該程序在睡眠,則顯示睡眠中的系統函數名
  • z: Flags = (Task Flags

vmstat

vmstat指令可以展現給定時間間隔的伺服器的狀态值,包括伺服器的CPU使用率,記憶體使用,虛拟記憶體交換情況,IO讀寫情況。

指令格式

iostat[參數][時間][次數]

參數

- -a:顯示活動内頁;

- -f:顯示啟動後建立的程序總數;

- -m:顯示slab資訊;

- -n:頭資訊僅顯示一次;

- -s:以表格方式顯示事件計數器和記憶體狀态;

- -d:報告磁盤狀态;

- -p:顯示指定的硬碟分區狀态;

- -S:輸出資訊的機關。

vmstat工具的使用是通過兩個數字參數來完成的,第一個參數是采樣的時間間隔數,機關是秒,第二個參數是采樣的次數,如:

linux: 系統狀态檢視工具linux: 系統狀态工具

現在分析一個各個參數的意思

r 表示運作隊列(就是說多少個程序真的配置設定到CPU),我測試的伺服器目前CPU比較空閑,沒什麼程式在跑,當這個值超過了CPU數目,就會出現CPU瓶頸了。這個也和top的負載有關系,一般負載超過了3就比較高,超過了5就高,超過了10就不正常了,伺服器的狀态很危險。top的負載類似每秒的運作隊列。如果運作隊列過大,表示你的CPU很繁忙,一般會造成CPU使用率很高。

b 表示阻塞的程序,這個不多說,程序阻塞,大家懂的。

swpd 虛拟記憶體已使用的大小,如果大于0,表示你的機器實體記憶體不足了,如果不是程式記憶體洩露的原因,那麼你該更新記憶體了或者把耗記憶體的任務遷移到其他機器。

free 空閑的實體記憶體的大小,我的機器記憶體總共8G,剩餘3415M。

buff Linux/Unix系統是用來存儲,目錄裡面有什麼内容,權限等的緩存,我本機大概占用300多M

cache cache直接用來記憶我們打開的檔案,給檔案做緩沖,我本機大概占用300多M(這裡是Linux/Unix的聰明之處,把空閑的實體記憶體的一部分拿來做檔案和目錄的緩存,是為了提高 程式執行的性能,當程式使用記憶體時,buffer/cached會很快地被使用。)

si 每秒從磁盤讀入虛拟記憶體的大小,如果這個值大于0,表示實體記憶體不夠用或者記憶體洩露了,要查找耗記憶體程序解決掉。我的機器記憶體充裕,一切正常。

so 每秒虛拟記憶體寫入磁盤的大小,如果這個值大于0,同上。

bi 塊裝置每秒接收的塊數量,這裡的塊裝置是指系統上所有的磁盤和其他塊裝置,預設塊大小是1024byte,我本機上沒什麼IO操作,是以一直是0,但是我曾在處理拷貝大量資料(2-3T)的機器上看過可以達到140000/s,磁盤寫入速度差不多140M每秒

bo 塊裝置每秒發送的塊數量,例如我們讀取檔案,bo就要大于0。bi和bo一般都要接近0,不然就是IO過于頻繁,需要調整。

in 每秒CPU的中斷次數,包括時間中斷

cs 每秒上下文切換次數,例如我們調用系統函數,就要進行上下文切換,線程的切換,也要程序上下文切換,這個值要越小越好,太大了,要考慮調低線程或者程序的數目,例如在apache和nginx這種web伺服器中,我們一般做性能測試時會進行幾千并發甚至幾萬并發的測試,選擇web伺服器的程序可以由程序或者線程的峰值一直下調,壓測,直到cs到一個比較小的值,這個程序和線程數就是比較合适的值了。系統調用也是,每次調用系統函數,我們的代碼就會進入核心空間,導緻上下文切換,這個是很耗資源,也要盡量避免頻繁調用系統函數。上下文切換次數過多表示你的CPU大部分浪費在上下文切換,導緻CPU幹正經事的時間少了,CPU沒有充分利用,是不可取的。

us 使用者CPU時間,我曾經在一個做加密解密很頻繁的伺服器上,可以看到us接近100,r運作隊列達到80(機器在做壓力測試,性能表現不佳)。

sy 系統CPU時間,如果太高,表示系統調用時間長,例如是IO操作頻繁。

id 空閑 CPU時間,一般來說,id + us + sy = 100,一般我認為id是空閑CPU使用率,us是使用者CPU使用率,sy是系統CPU使用率。

wt 等待IO CPU時間。

iostat

有記憶體自然有磁盤了.iostat是I/O statistics(輸入/輸出統計)的縮寫,iostat工具将對系統的磁盤操作活動進行監視.

指令格式

iostat[參數][時間][次數]

  • -C 顯示CPU使用情況
  • -d 顯示磁盤使用情況
  • -k 以 KB 為機關顯示
  • -m 以 M 為機關顯示
  • -N 顯示磁盤陣列(LVM) 資訊
  • -n 顯示NFS 使用情況
  • -p[磁盤] 顯示磁盤和分區的情況
  • -t 顯示終端和CPU的資訊
  • -x 顯示詳細資訊
  • -V 顯示版本資訊
linux: 系統狀态檢視工具linux: 系統狀态工具

CPU 屬性值

  • %user:CPU處在使用者模式下的時間百分比。
  • %nice:CPU處在帶NICE值的使用者模式下的時間百分比。
  • %system:CPU處在系統模式下的時間百分比。
  • %iowait:CPU等待輸入輸出完成時間的百分比。
  • %steal:管理程式維護另一個虛拟處理器時,虛拟CPU的無意識等待時間百分比。

    %idle:CPU空閑時間百分比。

備注:

  • 如果%iowait的值過高,表示硬碟存在I/O瓶頸,
  • %idle值高,表示CPU較空閑,

    如果%idle值高但系統響應慢時,有可能是CPU等待配置設定記憶體,此時應加大記憶體容量。

  • %idle值如果持續低于10,那麼系統的CPU處理能力相對較低,表明系統中最需要解決的資源是CPU。

磁盤每一列的含義如下:

  • rrqm/s: 每秒進行 merge 的讀操作數目。 即 rmerge/s
  • wrqm/s: 每秒進行 merge 的寫操作數目。即 wmerge/s
  • r/s: 每秒完成的讀 I/O 裝置次數。 即 rio/s
  • w/s: 每秒完成的寫 I/O 裝置次數。即 wio/s
  • rsec/s: 每秒讀扇區數。即 rsect/s
  • wsec/s: 每秒寫扇區數。即 wsect/s
  • rkB/s: 每秒讀 K 位元組數。是 rsect/s 的一半,因為扇區大小為 512 位元組
  • wkB/s: 每秒寫 K 位元組數。是 wsect/s 的一半
  • avgrq-sz: 平均每次裝置 I/O 操作的資料大小(扇區)
  • avgqu-sz: 平均 I/O 隊列長度。
  • await: 平均每次裝置 I/O 操作的等待時間(毫秒)
  • svctm: 平均每次裝置 I/O 操作的服務時間(毫秒)
  • %util: 一秒中有百分之多少的時間用于 I/O 操作,或者說一秒中有多少時間 I/O 隊列是非空的。

備注:

  • 如果 %util 接近 100%,說明産生的I/O請求太多,I/O系統已經滿負荷,該磁盤可能存在瓶頸。
  • 如果 svctm 比較接近 await,說明 I/O 幾乎沒有等待時間;
  • 如果 await 遠大于 svctm,說明I/O 隊列太長,io響應太慢,則需要進行必要優化。
  • 如果avgqu-sz比較大,也表示有當量io在等待。

netstat

netstat 指令用于顯示各種網絡相關資訊,如網絡連接配接,路由表,接口狀态 (Interface Statistics),masquerade 連接配接,多點傳播成員 (Multicast Memberships) 等等

  • -a或–all:顯示所有連線中的Socket;
  • -A<網絡類型>或–<網絡類型>:列出該網絡類型連線中的相關位址;
  • -c或–continuous:持續列出網絡狀态;
  • -C或–cache:顯示路由器配置的快取資訊;
  • -e或–extend:顯示網絡其他相關資訊;
  • -F或–fib:顯示FIB;
  • -g或–groups:顯示多重廣播功能群組組員名單;
  • -h或–help:線上幫助;
  • -i或–interfaces:顯示網絡界面資訊表單;
  • -l或–listening:顯示監控中的伺服器的Socket;
  • -M或–masquerade:顯示僞裝的網絡連線;
  • -n或–numeric:直接使用ip位址,而不通過域名伺服器;
  • -N或–netlink或–symbolic:顯示網絡硬體外圍裝置的符号連接配接名稱;
  • -o或–timers:顯示計時器;
  • -p或–programs:顯示正在使用Socket的程式識别碼和程式名稱;
  • -r或–route:顯示Routing Table;
  • -s或–statistice:顯示網絡工作資訊統計表;
  • -t或–tcp:顯示TCP傳輸協定的連線狀況;
  • -u或–udp:顯示UDP傳輸協定的連線狀況;
  • -v或–verbose:顯示指令執行過程;
  • -V或–version:顯示版本資訊;
  • -w或–raw:顯示RAW傳輸協定的連線狀況;
  • -x或–unix:此參數的效果和指定”-A unix”參數相同;
  • –ip或–inet:此參數的效果和指定”-A inet”參數相同。

這裡我們舉例,找出系統正在監聽的網絡連接配接和pid.這裡我們必須使用root使用者,否則無法檢視其他使用者的程序pid

linux: 系統狀态檢視工具linux: 系統狀态工具

其他指令

其他這些指令我就不一一細數,感興趣的可以自己開動搜尋引擎檢視.

  • free 檢視記憶體使用情況
  • uname 檢視系統與核心相關資訊
  • dmesg 分析核心産生的資訊

繼續閱讀