Linux資源監控命令/工具(綜合)

目錄:前端

psjava

pstreenode

pidofpython

toplinux

freeios

uptimenginx

ifuserweb

lsofapache

mpstatwindows

vmstst

pidstat

iostat

iotop

watch

sar


一、ps

1)讓系統報告詳細的信息。

     在使用ps命令時,若是不採用任何的可選項,則其顯示的信息是很是有限的,並且每每只顯示當前用戶所運行的程序。當系統管理員須要知道應用程序更加詳細的運行信息時,如想要知道這個應用程序內存、CPU的佔用率狀況時,那麼就須要加入一些可選項。如系統管理員須要一併查看其它用戶所執行的應用程序時,就需 要在這個命令後面採用可選項-al。如此的話,系統會列出系統中全部用戶運行的全部程序。如想要知道某個程序CPU與內存的使用狀況,而不是隻簡單的現實 其CPU的使用時間,那麼就須要在這個命令後面加入參數-l ,即便用ps –l命令可讓系統顯示出應用程序的詳細運行信息。關於上面各個字段所表明的含義,你們如有興趣的話能夠查看相關的幫助。通常來講,系統管理員關心的只是 程序的PID號碼、內存與CPU的使用率、命令的名字、用戶採用的終端等等。其它的信息對於系統管理員來講價值不是很大。

2)查看後臺運行的程序。
     默認狀況下,ps命令只顯示前臺運行的程序,而不會顯示後臺運行的程序。可是並不是全部的程序都是在前臺運行。正常狀況下,隱藏在後臺運行的程序數量要比前 臺運行的程序多的多。如隨着操做系統啓動而啓動的很多系統自帶程序,其運行的方式都是後臺運行。並且有時候,系統出現問題每每是因爲後臺程序所形成的。如 常見的木馬等程序都是在後臺所運行的。爲此係統管理員相對來講,更加想要知道在後臺運行着哪些程序。
     若是要查看後臺運行的程序,那就比較複雜一點。由於在不一樣版本的Linux操做系統中,要顯示後臺進程其所採用的可選項是不一樣的。如在紅帽子 Linux操做系統中,其實採用參數的形式而不是可選項。即採用ps aux命令能夠顯示出全部的應用程序(包括前臺與後臺的)參數與可選項的差別主要在前面又沒有這個-符號。若是帶有這個符號的就表示這是一個可選項。而若是不帶的,就表示這事一個參數。這個符號通常狀況下可不可以省。在該寫的地方沒寫,或者不須要些的地方恰恰加上了,則系統都會提示錯誤信息,說找不到這 個命令。而在其它的Linux系統版本中,可能不可以識別這個aux參數。如在一些Linux操做系統版本中,須要採用-a可選項來完成這個任務。因爲系 統版本之間的差別,給系統管理員帶來了很多的麻煩。不過值得慶幸的是,各個操做系統版本中都有在線的幫助。若是系統管理員在使用一個新版本的操做系統時, 不知道要顯示所有進程該使用哪一個可選項時,能夠利用ps --heip等命令來查看系統幫助。不過美中不足的是,系統在線幫助都是英文的,對系統管理員的英文水平是一個不小的考驗。不過若是要做Linux系統管 理員,這點英文底子仍是要有的。由於最新的Linux技術基本上都是先出來英文文檔的。其實要掌握最早進的操做系統書籍,大部分的計算機書籍都是英文的。

3)對程序列表進行排序。
    當運行的應用程序比較多時,系統管理員須要對應用程序進行排序。Ps命令的排序功能是比較強的。主要是由於這個命令有一個--sort參數(注意在這個參 數前面採用的是兩個小橫杆符號,各位讀者不要覺得是筆者寫錯了)。在這個參數後面加上系統管理員想要的排序字段,就能夠進行排序了。如這個命令ps –A --sort cmd,就表示顯示系統全部的應用程序,並根據程序命令來進行排序。在Linux操做系統參數中,還有一個比較麻煩的事情,就是參數大小寫不一樣每每表明着不一樣的含義。如上面這個命令,將大寫字母A換成是小寫字符a,則結果就徹底兩樣了。大寫字符A表示全部的應用程序,而小寫字符a則表示「all w/ tty except session leaders」。二者有本質的區別。經過這個差別能夠用來過濾不一樣終端登錄賬戶所運行的應用程序。

[root@linux ~]# ps aux
[root@linux ~]# ps -lA
[root@linux ~]# ps axjf
選項/參數:

-w 顯示加寬能夠顯示較多的資訊
-au 顯示較詳細的資訊
-aux 顯示全部包含其餘使用者的行程
-A 顯示全部進程(等價於-e)(utility)
-a 顯示一個終端的全部進程,除了會話引線
-N 忽略選擇。
-d 顯示全部進程,但省略全部的會話引線(utility)
-x 顯示沒有控制終端的進程,同時顯示各個命令的具體路徑。dx不可合用。(utility)
-p pid 進程使用cpu的時間
-u uid or username 選擇有效的用戶id或者是用戶名
-g gid or groupname 顯示組的全部進程。
U username 顯示該用戶下的全部進程,且顯示各個命令的詳細路徑。如:ps U zhang;(utility)
-f 所有列出,一般和其餘選項聯用。如:ps -fa or ps -fx and so on.
-l 長格式(有F,wchan,C 等字段)
-j 做業格式
-o 用戶自定義格式。
v 以虛擬存儲器格式顯示
s 以信號格式顯示
-m 顯示全部的線程
-H 顯示進程的層次(和其它的命令合用,如:ps -Ha)(utility)
e 命令以後顯示環境(如:ps -d e; ps -a e)(utility)
h 不顯示第一行

l 長格式輸出;
u 按用戶名和啓動時間的順序來顯示進程;
j 用任務格式來顯示進程;
f 用樹形格式來顯示進程;
a 顯示全部用戶的全部進程(包括其它用戶);
x 顯示無控制終端的進程;
r 顯示運行中的進程;
ww 避免詳細參數被截斷;

ps命令經常使用用法(方便查看系統進程)
1)ps a 顯示現行終端機下的全部程序,包括其餘用戶的程序。
2)ps -A 顯示全部進程。
3)ps c 列出程序時,顯示每一個程序真正的指令名稱,而不包含路徑,參數或常駐服務的標示。
4)ps -e 此參數的效果和指定"A"參數相同。
5)ps e 列出程序時,顯示每一個程序所使用的環境變量。
6)ps f 用ASCII字符顯示樹狀結構,表達程序間的相互關係。
7)ps -H 顯示樹狀結構,表示程序間的相互關係。
8)ps -N 顯示全部的程序,除了執行ps指令終端機下的程序以外。
9)ps s 採用程序信號的格式顯示程序情況。
10)ps S 列出程序時,包括已中斷的子程序資料。
11)ps -t<終端機編號>  指定終端機編號,並列出屬於該終端機的程序的情況。
12)ps u 以用戶爲主的格式來顯示程序情況。
13)ps x 顯示全部程序,不以終端機來區分。
14)最經常使用的方法是ps -aux,而後再利用一個管道符號導向到grep去查找特定的進程,而後再對特定的進程進行操做。

特別說明:
因爲ps可以支持的OS類型至關的多,因此他的參數多的離譜! 並且有沒有加上-差不少!詳細的用法應該要參考man ps喔!
範例一:將目前屬於您本身此次登入的PID與相關信息列示出來(前臺)
[root@linux ~]# ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
0 S 0 5881 5654 0 76 0 - 1303 wait pts/0 00:00:00 su
4 S 0 5882 5881 0 75 0 - 1349 wait pts/0 00:00:00 bash
4 R 0 6037 5882 0 76 0 - 1111 - pts/0 00:00:00 ps
上面這個信息其實不少喔!各相關信息的意義爲:
F 表明這個程序的旗標(flag), 4 表明使用者爲super user;
S 表明這個程序的狀態(STAT);
PID 就是這個程序的ID啊!底下的PPID則上父程序的ID;
C CPU使用的資源百分比
PRI 這個是Priority(優先執行序)的縮寫;
NI 這個是Nice值;
ADDR 這個是kernel function,指出該程序在內存的那個部分。若是是個running的程序,通常就是『 - 』的啦!
SZ 使用掉的內存大小;
WCHAN 目前這個程序是否正在運做當中,若爲-表示正在運做;
TTY 登入者的終端機位置囉;
TIME 使用掉的CPU時間。
CMD 所下達的指令爲什麼!?
仔細看到每個程序的PID與PPID的相關性爲什麼喔!上頭列出的三個程序中,彼此間但是有相關性的吶!

範例二:列出目前全部的正在內存當中的程序:
[root@linux ~]# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.1 1740 540 ? S Jul25 0:01 init [3]
root 2 0.0 0.0 0 0 ? SN Jul25 0:00 [ksoftirqd/0]
root 3 0.0 0.0 0 0 ? S< Jul25 0:00 [events/0]
.....中間省略.....
root 5881 0.0 0.3 5212 1204 pts/0 S 10:22 0:00 su
root 5882 0.0 0.3 5396 1524 pts/0 S 10:22 0:00 bash
root 6142 0.0 0.2 4488 916 pts/0 R+ 11:45 0:00 ps aux
各相關信息的意義爲:
USER:該process屬於那個使用者帳號的?
PID :該process的號碼。
%CPU:該process使用掉的CPU 資源百分比;
%MEM:該process所佔用的物理內存百分比;
VSZ :該process使用掉的虛擬內存量(Kbytes)
RSS :該process佔用的固定的內存量(Kbytes)
TTY :該process是在那個終端機上面運做,若與終端機無關,則顯示?,另外tty1-tty6是本機上面的登入者程序,若爲pts/0等的則表示爲由網絡鏈接進主機的程序。
STAT:該程序目前的狀態,主要的狀態有:
   R :該程序目前正在運做,或者是可被運做;
   S :該程序目前正在睡眠當中(可說是idle 狀態啦!),但可被某些訊號(signal)喚醒。
   T :該程序目前正在偵測或者是中止了;
   Z :該程序應該已經終止,可是其父程序卻沒法正常的終止他,形成zombie(疆屍)程序的狀態

   I:空閒 Idle
   D:不可中斷 Uninterruptible sleep (ususally IO) 收到信號不喚醒和不可運行, 進程必須等待直到有中斷髮生。
   T:終止 Terminate 進程收到SIGSTOP, SIGSTP, SIGTIN, SIGTOU信號後中止運行運行。
   P:等待交換頁
   W:無駐留頁 has no resident pages 沒有足夠的記憶體分頁可分配。
   X:死掉的進程
   <:高優先級進程 高優先序的進程
   N:低優先 級進程 低優先序的進程
   L:內存鎖頁 Lock 有記憶體分頁分配並縮在記憶體內
   s:進程的領導者(在它之下有子進程);
   l:多進程的(使用 CLONE_THREAD, 相似 NPTL pthreads)
   +:位於後臺的進程組

START:該process 被觸發啓動的時間;
TIME :該process 實際使用CPU 運做的時間。
COMMAND:該程序的實際指令爲什麼?

範例三:以範例一的顯示內容,顯示出全部的程序:
[root@linux ~]# ps -lA
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 1 0 0 76 0 - 435 - ? 00:00:01 init
1 S 0 2 1 0 94 19 - 0 ksofti ? 00:00:00 ksoftirqd/0
1 S 0 3 1 0 70 -5 - 0 worker ? 00:00:00 events/0
.....如下省略.....

範例四:列出相似程序樹的程序顯示:
[root@linux ~]# ps -axjf
PPID PID PGID SID TTY TPGID STAT UID TIME COMMAND
0 1 0 0 ? -1 S 0 0:01 init [3]
1 2 0 0 ? -1 SN 0 0:00 [ksoftirqd/0]
.....中間省略.....
1 5281 5281 5281 ? -1 Ss 0 0:00 /usr/sbin/sshd
5281 5651 5651 5651 ? -1 Ss 0 0:00 \_ sshd: dmtsai[priv]
5651 5653 5651 5651 ? -1 S 500 0:00 \_ sshd: dmtsai@pts/0
5653 5654 5654 5654 pts/0 6151 Ss 500 0:00 \_ -bash
5654 5881 5881 5654 pts/0 6151 S 0 0:00 \_ su
5881 5882 5882 5654 pts/0 6151 S 0 0:00 \_ bash
5882 6151 6151 5654 pts/0 6151 R+ 0 0:00 \_ ps -axjf
還可使用pstree來達成這個程序樹喔!

範例五:找出與cron與syslog這兩個服務有關的PID號碼?
[root@linux ~]# ps aux | egrep '(cron|syslog)'
root 1539 0.0 0.1 1616 616 ? Ss Jul25 0:03 syslogd -m 0
root 1676 0.0 0.2 4544 1128 ? Ss Jul25 0:00 crond
root 6157 0.0 0.1 3764 664 pts/0 R+ 12:10 0:00 egrep(cron|syslog)
因此號碼是1539及1676這兩個

 


二、pstree 
[root@linux ~]# pstree [-Aup] 
參數: 
-A:各程序樹之間的鏈接以ASCII字符來鏈接; 
-p:並同時列出每一個process的PID; 
-u:並同時列出每一個process的所屬帳號名稱。 
範例一:列出目前系統上面全部的程序樹的相關性: 
[root@linux ~]# pstree 

範例二:承上題同時秀出PID與users 
[root@linux ~]# pstree -aup 
  在括號()內的便是PID以及該程序的owner!不過,因爲我是使用root的身份執行此一指令,因此屬於root的可能就不會顯示出來

 


三、pidof 
[root@linux ~]# pidof [-sx] program_name 
參數: 
-s:僅列出一個PID而不列出全部的PID 
-x:同時列出該 program name可能的PPID那個程序的PID 
範例一:列出目前系統上面init以及syslogd這兩個程序的PID 
[root@linux ~]# pidof init syslogd 
1 2546 
理論上,應該會有兩個PID纔對。上面的顯示也是出現了兩個PID喔。分別是init及syslogd這兩支程序的PID啦。

範例二:找出bash即以bash爲PPID的幾個主要的PID 
[root@linux ~]# pidof -x bash 
2961 2959 338 
由於個人系統被我登入以後,我就會主動取得一個bash的程序,因此囉,很天然就會擁有一個PID啊。只要我再以底下的方式,就能夠取得我所想要的PID內容。 
[root@linux ~]# ps aux | egrep '(2961|2959|338)' 
dmtsai 338 0.0 0.1 6024 1536 pts/0 Ss 16:43 0:00 -bash 
kiki 2961 0.0 0.1 6025 1526 pts/0 Ss 17:43 0:00 -bash 
.....如下省略......

 


四、top

實時顯示系統中各個進程的資源佔用情況,相似於Windows的任務管理器

[root@linux ~]# top [-d] | top [-bnp]
參數:
-d:後面能夠接秒數,就是整個程序畫面更新的秒數。預設是5秒;
-b:以批次的方式執行 top
一般會搭配數據流重導向來將批次的結果輸出成爲檔案。
-n: 與-b搭配,意義是須要進行幾回top的輸出結果。
-p:指定某些個PID來進行觀察監測

在top執行過程中可使用的按鍵指令:
?:顯示在top當中能夠輸入的按鍵指令;
P:以CPU的使用資源排序顯示;
M:以Memory的使用資源排序顯示;
N:以PID來排序喔!
T:由該Process使用的CPU時間累積(TIME+)排序。
k:給予某個PID一個訊號(signal)
r:給予某個PID從新制訂一個nice值。

範例一:每兩秒鐘更新一次top,觀察總體信息:
[root@linux ~]# top -d 2

範例二:將top的信息進行2次,而後將結果輸出到/tmp/top.txt
[root@linux ~]# top -b -n 2 > /tmp/top.txt

範例三:假設10604是一個已經存在的PID,僅觀察該程序 
[root@linux ~]# top -d 2 -p10604 

範例四:承上題,上面的NI值是0,想要改爲10的話? 在範例三的top畫面當中直接按下r以後會出現以下的圖樣: 

top - 13:53:00 up 51 days, 2:27, 1 user, load average: 0.00,0.00, 0.00
Tasks: 1 total, 0 running, 1 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.0% us, 0.0% sy, 0.0% ni, 100.0% id, 0.0% wa, 0.0% hi, 0.0% si
Mem: 385676k total, 371760k used, 13916k free, 131164k buffers
Swap: 1020116k total, 880k used, 1019236k free, 95772k cached
PID to renice: 10604
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
10604 root 16 0 5396 1544 1244 S 0.0 0.4 0:00.07 bash
以後,能夠輸入nice值了!
top - 13:53:00 up 51 days, 2:27, 1 user, load average: 0.00,0.00, 0.00
Tasks: 1 total, 0 running, 1 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.0% us, 0.0% sy, 0.0% ni, 100.0% id, 0.0% wa, 0.0% hi, 0.0% si
Mem: 385676k total, 371760k used, 13916k free, 131164k buffers
Swap: 1020116k total, 880k used, 1019236k free, 95772k cached
Renice PID 10604 to value: 10
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
10604 root 30 10 5396 1544 1244 S 0.0 0.4 0:00.07 bash

 

top輸出解析:

   top主要分爲兩個畫面,上面的畫面爲整個系統的資源使用狀態,基本上總共有六行,顯示的內容依序是:
第一行:顯示系統已啓動的時間、目前上線人數、系統總體的負載(load)。 比較須要注意的是系統的負載,三個數據分別表明1,5,10分鐘的平均負載。通常來講,這個負載值應該不太可能超過1纔對,除非您的系統很忙碌。若是持續高於5的話,那麼.....仔細的看看究竟是那個程序在影響總體系統吧

第二行:顯示的是目前的觀察程序數量,比較須要注意的是最後的zombie那個數值,若是不是0,好好看看究竟是那個process變成疆屍了吧
第三行:顯示的是CPU的總體負載,每一個項目可以使用?查閱。須要觀察的是id (idle)的數值,通常來講,他應該要接近100%纔好,表示系統不多資源被使用

 
第四行與第五行:表示目前的物理內存與虛擬內存 (Mem/Swap) 的使用狀況。


第六行之後:這個是當在top程序當中輸入指令時,顯示狀態的地方。top底下的畫面,則是每一個process使用的資源狀況。

默認狀況下僅顯示比較重要的PID、USER、PR、NI、VIRT、RES、SHR、S、%CPU、%MEM、TIME+、COMMAND 列。能夠經過下面的快捷鍵來更改顯示內容。
更改顯示內容:
1)經過 f 鍵能夠選擇顯示的內容。按 f 鍵以後會顯示列的列表,按 a-z 便可顯示或隱藏對應的列,最後按回車鍵肯定。
2)按 o 鍵能夠改變列的顯示順序。按小寫的 a-z 能夠將相應的列向右移動,而大寫的 A-Z 能夠將相應的列向左移動。最後按回車鍵肯定。
3)按大寫的 F 或 O 鍵,而後按 a-z 能夠將進程按照相應的列進行排序。而大寫的 R 鍵能夠將當前的排序倒轉。

 


五、free
[root@linux ~]# free [-b|-k|-m|-g] [-t]
參數: 

-b  以Byte爲單位顯示內存使用狀況。
-k  以KB爲單位顯示內存使用狀況。
-m  以MB爲單位顯示內存使用狀況。
-g 以GB爲單位顯示內存使用狀況。
-o  不顯示緩衝區調節列。
-s<間隔秒數>  持續觀察內存使用情況。
-t  顯示內存總和列。
-V  顯示版本信息。

範例一:顯示目前系統的內存容量,以MB爲單位    
[root@linux ~]# free -m
total used free shared buffers cached
Mem: 376 366 10 0 129 94
-/+ buffers/cache: 141 235
Swap: 996 0 995

 

free輸出解析:

Mem:表示物理內存統計

 

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

 

(注:系統當前真正可用的內存並非第一行free1標記的值,它僅表明未被分配的內存。而應該是第二行free2標記的值)

 

Swap:表示硬盤上交換分區的使用狀況,已使用、空閒的swap

1)buffers與cached的區別
A buffer is something that has yet to be 「written」 to disk. A cache is something that has been 「read」 from the disk and stored for later use
對於應用程序來講,buffers/cached是等於可用的,由於buffer/cached是爲了提升文件讀取的性能,當應用程序需在用到內存的時候,buffer/cached會很快地被回收。因此從應用程序的角度來講:可用內存 = 系統free memory + buffers + cached,即上面的free2的值。
buffers是指用來給塊設備作的緩衝大小,他只記錄文件系統的metadata以及tracking in-flight pages。cached是用來給文件作緩衝。那就是說:buffers是用來存儲的,而cached是直接用來記憶咱們打開的文件,若是你想知道他是否是真的生效,你能夠試一下,前後執行兩次命令#man X ,你就能夠明顯的感受到第二次的開打的速度快不少。

2)簡述swap
當可用內存少於額定值的時候,就會開始進行交換.
如何看額定值(RHEL4.0): #cat /proc/meminfo

交換將經過三個途徑來減小系統中使用的物理頁面的個數:
1)減小緩衝與頁面cache的大小,
2)將系統V類型的內存頁面交換出去,
3)換出或者丟棄頁面。(Application 佔用的內存頁,也就是物理內存不足)。
   少許地使用swap是否是影響到系統性能的。通常來講,swap最好不要被使用,尤爲swap最好不要被使用超過20%或以上, 由於Swap的效率跟物理內存實在差不少,而系統會使用到swap,是由於物理內存不足了纔會這樣作。

3)使用free命令
      將used的值減去buffer和cache的值就是你當前真實內存使用量。 buffer/cached是爲了提升程序執行的性能,當程序使用內存時,buffer/cached會很快地被使用。 因此,以應用角度來看,以(-/+ buffers/cache)的free和used爲主,因此咱們看這個就行了。

     另一些常識,Linux爲了提升磁盤和內存存取效率, Linux作了不少精心的設計, 除了對dentry進行緩存(用於VFS,加速文件路徑名到inode的轉換), 還採起了兩種主要Cache方式:Buffer Cache和Page Cache。 前者針對磁盤塊的讀寫,後者針對文件inode的讀寫。這些Cache能有效縮短了I/O系統調用(好比read,write,getdents)的時間。 記住內存是拿來用的,不是拿來看的。不象windows,不管你的真實物理內存有多少,他都要拿硬盤交換文件來讀。這也就是windows爲何經常提示虛擬空間不足的緣由.大家想一想,多無聊,在內存還有大部分的時候,拿出一部分硬盤空間來充當內存。硬盤怎麼會快過內存。因此咱們看linux,只要不用swap的交換空間,就不用擔憂本身的內存太少。若是經常swap用不少,可能你就要考慮加物理內存了。這也是linux看內存是否夠用的標準。



六、uptime
uptime能夠顯示出top畫面的最上面一行!
[root@linux ~]# uptime
18:06:30 up 52 days, 6:40, 1 user, load average: 0.00, 0.00, 0.00
上面表示,目前是18:06 ,本系統已經開機52天又6:40 ,有1個使用者在在線,平均負載很低,因此都是0啊!

 


七、fuser
若是當咱們要卸載某個裝置時,他總是告訴咱們device is busy , 那麼究竟是那個程序在使用這個裝置呢?舉例來講,當沒法 umount /home時, 該怎麼辦?此時咱們可使用fuser來幫忙啦!
[root@linux ~]# fuser [-ki] [-signal] file/dir
參數:
-k :找出使用該檔案/目錄的PID ,並試圖以SIGKILL這個訊號給予該PID;
-i :必須與-k配合,在刪除PID以前會先詢問使用者意願!
-signal:例如-1 -15等等,若不加的話,預設是SIGKILL (-9)囉!
範例一:找出目前所在目錄的使用PID爲什麼?
[root@linux ~]# fuser .
.: 18852c
[root@linux ~]# ps aux | grep 18852
root 18852 0.0 0.4 5396 1588 pts/0 SN 10:12 0:00 bash
用這個方式就能夠獲得使用該目錄的PID了。此外,爲什麼使用fuser的輸出當中,在PID後面會有c呢?他表明的意義爲:
c:在當前的目錄下;
e:能夠被執行的;
f:是一個被開啓的檔案
r:表明root directory

範例二:找到/var底下屬於FIFO類型的檔案,而且找出存取該檔案的程序
[root@linux ~]# find /var -type p
/var/spool/postfix/public/qmgr
/var/spool/postfix/public/pickup
[root@linux ~]# fuser /var/spool/postfix/public/qmgr
/var/spool/postfix/public/qmgr: 1666 1675
[root@linux ~]# ps aux | egrep '(1666|1675)'
root 1666 0.0 0.3 5640 1516 ? Ss Jul25 0:01 /usr/libexec/postfix/master
postfix 1675 0.0 0.4 5744 1604 ? S Jul25 0:00 qmgr -l -t fifo -u

範例三:同範例二,但試圖刪除該PID?
[root@linux ~]# fuser -ki /var/spool/postfix/public/qmgr
/var/spool/postfix/public/qmgr: 1666 1675
Kill process 1666 ? (y/N) n
Kill process 1675 ? (y/N) n

 


八、lsof

lsof [options] filename
      列出當前系統打開文件的工具。在linux環境下,任何事物都以文件的形式存在,經過文件不只僅能夠訪問常規數據,還能夠訪問網絡鏈接和硬件。因此如傳輸控制協議 (TCP) 和用戶數據報協議 (UDP) 套接字等,系統在後臺都爲該應用程序分配了一個文件描述符,不管這個文件的本質如何,該文件描述符爲應用程序與基礎操做系統之間的交互提供了通用接口。由於應用程序打開文件的描述符列表提供了大量關於這個應用程序自己的信息,所以經過lsof工具可以查看這個列表對系統監測以及排錯將是頗有幫助的。
     若是說netcat是進行網絡診斷的瑞士軍刀,那麼lsof就是Unix調試的瑞士軍刀。Lsof是聽從Unix哲學的典範,它只作一件事情,而且作的至關完美—它能夠列出某個進程打開的全部文件信息。打開的文件多是普通的文件,目錄,NFS文件,塊文件,字符文件,共享庫,常規管道,明明管道,符號連接,Socket流,網絡Socket,UNIX域Socket,以及其它更多。由於Unix系統中幾乎全部東西都是文件,你能夠想象lsof該有多有用。
     在終端下輸入lsof便可顯示系統打開的文件,由於lsof須要訪問核心內存和各類文件,因此必須以root用戶的身份運行它纔可以充分地發揮其功能。

1)列出全部打開的文件
lsof
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
init 1 root cwd DIR 8,1 4096 2 /
init 1 root rtd DIR 8,1 4096 2 /
init 1 root txt REG 8,1 150584 654127 /sbin/init
udevd 415 root 0u CHR 1,3 0t0 6254 /dev/null
udevd 415 root 1u CHR 1,3 0t0 6254 /dev/null
udevd 415 root 2u CHR 1,3 0t0 6254 /dev/null
udevd 690 root mem REG 8,1 51736 302589 /lib/x86_64-linux-gnu/libnss_files-2.13.so
syslogd 1246 syslog 2w REG 8,1 10187 245418 /var/log/auth.log
syslogd 1246 syslog 3w REG 8,1 10118 245342 /var/log/syslog
dd 1271 root 0r REG 0,3 0 4026532038 /proc/kmsg
dd 1271 root 1w FIFO 0,15 0t0 409 /run/klogd/kmsg
dd 1271 root 2u CHR 1,3 0t0 6254 /dev/null
每行顯示一個打開的文件,若不指定條件默認將顯示全部進程打開的全部文件。lsof輸出各列信息的意義以下:
COMMAND:進程的名稱
PID:進程標識符
USER:進程全部者
FD:文件描述符,應用程序經過文件描述符識別該文件。如cwd、txt等
TYPE:文件類型,如DIR、REG等
DEVICE:指定磁盤的名稱
SIZE:文件的大小
NODE:索引節點(文件在磁盤上的標識)
NAME:打開文件的確切名稱
FD列中的文件描述符cwd值表示應用程序的當前工做目錄,這是該應用程序啓動的目錄,除非它自己對這個目錄進行更改,txt類型的文件是程序代碼,如應用程序二進制文件自己或共享庫,如上列表中顯示的/sbin/init程序。其次數值表示應用程序的文件描述符,這是打開該文件時返回的一個整數。如上的最後一行文件/dev/initctl,其文件描述符爲 10。u 表示該文件被打開並處於讀取/寫入模式,而不是隻讀 ? 或只寫 (w) 模式。同時還有大寫 的W 表示該應用程序具備對整個文件的寫鎖。該文件描述符用於確保每次只能打開一個應用程序實例。初始打開每一個應用程序時,都具備三個文件描述符,從0到2,分別表示標準輸入、輸出和錯誤流。因此大多數應用程序所打開的文件的FD都是從3開始。
與FD列相比,Type列則比較直觀。文件和目錄分別稱爲REG和DIR。而CHR和BLK分別表示字符和塊設備;或者UNIX、FIFO和IPv4,分別表示UNIX 域套接字、先進先出(FIFO)隊列和網際協議(IP)套接字。

2)找出誰(進程)在使用某個文件
lsof /path/to/file
只須要執行文件的路徑,lsof就會列出全部使用這個文件的進程,你也能夠列出多個文件,lsof會列出全部使用這些文件的進程:lsof /path/to/file1 /path/to/file2
lsof /etc/passwd 哪一個進程在佔用/etc/passwd
lsof /dev/hda6 哪一個進程在佔用hda6
lsof /dev/cdrom 哪一個進程在佔用光驅
lsof `which httpd` 哪一個進程在使用apache的可執行文件

3)遞歸查找某個目錄中全部打開的文件
lsof +D /usr/lib
加上+D參數,lsof會對指定目錄進行遞歸查找,注意這個參數要比grep版本慢:lsof|grep '/usr/lib',之因此慢是由於+D首先查找全部的文件,而後一次性輸出。

4)列出某個用戶打開的全部文件
lsof -u pkrumins
-u選項限定只列出全部被用戶pkrumins打開的文件,你能夠經過逗號指定多個用戶:lsof -u rms,root,這條命令會列出全部rms和root用戶打開的文件。你也能夠像下面這樣使用多個-u作一樣的事情:lsof -u rms -u root

5)查找某個程序打開的全部文件
lsof -c apache
-c選項限定只列出以apache開頭的進程打開的文件,因此你能夠不用像下面這樣寫:lsof | grep foo,而使用下面這個更簡短的版本:lsof -c foo
lsof -c sendmail 查看sendmail進程的文件使用狀況
lsof -c courier -u ^zahn 顯示出那些文件被以courier打頭的進程打開,可是並不屬於用戶zahn
也能夠只指定進程名稱的開頭:lsof -c apa 這會列出全部以apa開頭的進程打開的文件,一樣能夠制定多個-c參數:lsof -c apache -c python,這會列出全部由apache和python打開的文件。

6)組合。列出全部由某個用戶或某個進程打開的文件
lsof -u pkrumins -c apache
能夠組合使用多個選項,這些選項默認進行或關聯,也就是說上面的命令會輸入由pkrumins用戶或是apache進程打開的文件。
列出全部由一個用戶與某個進程打開的文件:lsof -a -u pkrumins -c bash -a參數能夠將多個選項的組合條件由或變爲與,上面的命令會顯示全部由pkrumins用戶以及bash進程打開的文件。

7)列出除root用戶外的全部用戶打開的文件
lsof -u ^root
注意root前面的^符號,它執行取反操做,所以lsof會列出全部root用戶以外的用戶打開的文件。

8)取反。列出全部由某個PID對應的進程打開的文件
lsof -p 1
-p選項讓你可使用進程id來過濾輸出。也能夠用逗號來分離多個pid:lsof -p 450,980,333
列出全部進程打開的文件除了某個pid的:lsof -p ^1 同前面的用戶同樣,你也能夠對-p選項使用^來進行取反。

9)網絡鏈接
lsof -i 列出全部網絡鏈接,lsof的-i選項能夠列出全部打開了網絡套接字(TCP和UDP)的進程。
lsof -i tcp 列出全部TCP網絡鏈接
lsof -i udp 列出全部UDP網絡鏈接
lsof -i :25 找到使用某個端口的進程,:25和-i選項組合可讓lsof列出佔用TCP或UDP的25端口的進程。也可使用/etc/services中制定的端口名稱來代替端口號,好比:lsof -i :smtp
lsof -i udp:53 找到使用某個udp端口號的進程
lsof -a -u hacker -i 找到某個用戶的全部網絡鏈接
lsof -N 列出全部NFS(網絡文件系統)文件
lsof -U 列出全部UNIX域Socket文件
lsof -g 1234 列出全部對應某個組id的進程

10)文件描述符
lsof -d 2 列出全部以描述符2打開的文件
lsof -d 0-2 列出全部描述符爲0,1,2的文件。
lsof -d mem 列出全部內存映射文件,-d選項還支持其它不少特殊值

11)輸出使用某些資源的進程pid
lsof -t -i -t選項輸出進程的PID,你能夠將它和-i選項組合輸出使用某個端口的進程的PID,下面的命令將會殺掉全部使用網絡的進程:kill -9 `lsof -t -i`

12)循環列出文件
lsof -r 1 -r選項讓lsof能夠循環列出文件直到被中斷,參數1的意思是每秒鐘重複打印一次,這個選項最好同某個範圍比較小的查詢組合使用,好比用來監測網絡活動:lsof -r 1 -u john -i -a

 


九、mpstat

     mpstat(Multiprocessor Statistics)是實時系統監控工具。報告與CPU的一些統計信息,這些信息存放在/proc/stat文件中。在多CPUs系統裏,不但能查看全部CPU的平均情況信息,並且可以查看特定CPU的信息。mpstat最大的特色是:能夠查看多核心cpu中每一個計算核心的統計數據;而相似工具vmstat只能查看系統總體cpu狀況。

mpstat [-P {|ALL}] [internal [count]]
參數:
-P {|ALL} 表示監控哪一個CPU, cpu在[0,cpu個數-1]中取值
internal 相鄰的兩次採樣的間隔時間、
count 採樣的次數,count只能和delay一塊兒使用
當沒有參數時,mpstat則顯示系統啓動之後全部信息的平均值。有interval時,第一行的信息自系統啓動以來的平均信息。從第二行開始,輸出爲前一個interval時間段的平均信息。

1)該命令將每隔2秒輸出一次CPU的當前運行情況信息,一共輸出5次,若是沒有第二個數字參數,mpstat將每隔兩秒執行一次,直到按CTRL+C退出。
mpstat 2 5

Linux 2.6.32-71.el6.i686 (Stephen-PC) 11/12/2011 _i686_ (1 CPU)
04:03:00 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %idle
04:03:02 PM all 0.00 0.00 0.50 0.00 0.00 0.00 0.00 0.00 99.50
04:03:04 PM all 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
04:03:06 PM all 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
04:03:08 PM all 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
04:03:10 PM all 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
Average: all 0.00 0.00 0.10 0.00 0.00 0.00 0.00 0.00 99.90

第一行的末尾給出了當前系統中CPU的數量。後面的表格中則輸出了系統當前CPU的使用情況,如下爲每列的含義:
%user 在internal時間段裏,用戶態的CPU時間(%),不包含nice值爲負進程(usr/total)*100
%nice 在internal時間段裏,nice值爲負進程的CPU時間(%) (nice/total)*100
%sys 在internal時間段裏,內核時間(%) (system/total)*100
%iowait 在internal時間段裏,硬盤IO等待時間(%) (iowait/total)*100
%irq 在internal時間段裏,硬中斷時間(%) (irq/total)*100
%soft 在internal時間段裏,軟中斷時間(%) (softirq/total)*100
%idle 在internal時間段裏,CPU除去等待磁盤IO操做外的由於任何緣由而空閒的時間閒置時間(%) (idle/total)*100

計算公式以下:
total_cur=user+system+nice+idle+iowait+irq+softirq
total_pre=pre_user+ pre_system+ pre_nice+ pre_idle+ pre_iowait+ pre_irq+ pre_softirq
user=user_cur – user_pre
total=total_cur-total_pre
其中_cur 表示當前值,_pre表示interval時間前的值。上表中的全部值可取到兩位小數點。

2)若是要看每一個cpu核心的詳細當前運行情況信息,輸出以下:
mpstat -P ALL 2 3
-P ALL表示打印全部CPU的數據,這裏也能夠打印指定編號的CPU數據,如-P 0(CPU的編號是0開始的)

 


十、vmstat

 

      用來得到UNIX系統有關進程、虛存、頁面交換空間及CPU活動的信息。這些信息反映了系統的負載狀況。vmstat首次運行時顯示自系統啓動開始的各項統計信息,以後運行vmstat將顯示自上次運行該命令之後的統計信息。用戶能夠經過指定統計的次數和時間來得到所需的統計信息。
1)每隔1秒輸出一條信息,一共輸出3條後退出
vmstat 1 3
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 0 531760 67284 231212 108 0 0 260 111 148 1 5 86 8 0
0 0 0 531752 67284 231212 0 0 0 0 33 57 0 1 99 0 0
0 0 0 531752 67284 231212 0 0 0 0 40 73 0 0 100 0 0

有關進程的信息有:(procs)
r: 在就緒狀態等待的進程數,表示運行隊列(就是說多少個進程真的分配到CPU),當這個值超過了CPU數目,就會出現CPU瓶頸了。這個也和top的負載有關係,通常負載超過了3就比較高,超過了5就高,超過了10就不正常了,服務器的狀態很危險。top的負載相似每秒的運行隊列。若是運行隊列過大,表示你的CPU很繁忙,通常會形成CPU使用率很高。
b: 表示阻塞的進程。

1)有關內存的信息有:(memory)
swpd: 正在使用的swap大小,單位爲KB。
free: 空閒的內存空間。
buff: 已使用的buff大小,對塊設備的讀寫進行緩衝。
cache: 已使用的cache大小,文件系統的cache。

2)有關頁面交換空間的信息有:(swap)
si: 交換內存使用,由磁盤調入內存,每秒傳輸的大小。
so: 交換內存使用,由內存調入磁盤,每秒傳輸的大小。

3)有關IO塊設備的信息有:(io)
bi: 從塊設備讀入的數據總量(讀磁盤) (KB/s)
bo: 寫入到塊設備的數據總理(寫磁盤) (KB/s)

4)有關故障的信息有:(system)
in: 在指定時間內的每秒中斷次數。
sy: 在指定時間內每秒系統調用次數。
cs: 在指定時間內每秒上下文切換的次數。 例如調用系統函數,就要進行上下文切換,線程的切換,也要進程上下文切換,這個值要越小越好,太大了,要考慮調低線程或者進程的數目,例如在 apache和nginx這種web服務器中,咱們通常作性能測試時會進行幾千併發甚至幾萬併發的測試,選擇web服務器的進程能夠由進程或者線程的峯值一直下調,壓測,直到cs到一個比較小的值,這個進程和線程數就是比較合適的值了。系統調用也是,每次調用系統函數,咱們的代碼就會進入內核空間,致使上下文切換,這個是很耗資源,也要儘可能避免頻繁調用系統函數。上下文切換次數過多表示你的CPU大部分浪費在上下文切換,致使CPU幹正經事的時間少了,CPU沒有充分利用,是不可取的。

5)有關CPU的信息有:(cpu)
us: 在指定時間間隔內CPU在用戶態的利用率。
sy: 在指定時間間隔內CPU在覈心態的利用率。
id: 在指定時間間隔內CPU空閒時間比。
wa: 在指定時間間隔內CPU由於等待I/O而空閒的時間比。

vmstat能夠用來肯定一個系統的工做是受限於CPU仍是受限於內存:若是CPU的sy和us值相加的百分比接近100%,或者運行隊列(r)中等待的進程數老是不等於0,且常常大於4,同時id也常常小於40,則該系統受限於CPU;若是bi、bo的值老是不等於0,則該系統受限於內存。

 

 


十一、pidstat

     主要用於監控所有或指定進程佔用系統資源的狀況,如CPU,內存、設備IO、任務切換、線程等。pidstat首次運行時顯示自系統啓動開始的各項統計信息,以後運行pidstat將顯示自上次運行該命令之後的統計信息。用戶能夠經過指定統計的次數和時間來得到所需的統計信息。
參數:
-l 顯示該進程和CPU相關的信息(command列中能夠顯示命令的完整路徑名和命令的參數)。
-d 顯示該進程和設備IO相關的信息。
-r 顯示該進程和內存相關的信息。
-w 顯示該進程和任務時間片切換相關的信息。
-t 顯示在該進程內正在運行的線程相關的信息。
-p 後面緊跟着帶監控的進程id或ALL(表示全部進程),如不指定該選項,將監控當前系統正在運行的全部進程。

1)監控pid爲1(init)的進程的CPU資源使用狀況,其中每隔3秒刷新並輸出一次,3次後程序退出
pidstat -p 1 2 3 -l
07:18:58 AM PID %usr %system %guest %CPU CPU Command
07:18:59 AM 1 0.00 0.00 0.00 0.00 0 /sbin/init
07:19:00 AM 1 0.00 0.00 0.00 0.00 0 /sbin/init
07:19:01 AM 1 0.00 0.00 0.00 0.00 0 /sbin/init
Average: 1 0.00 0.00 0.00 0.00 - /sbin/init

%usr: 該進程在用戶態的CPU使用率。
%system: 該進程在內核態(系統級)的CPU使用率。
%CPU: 該進程的總CPU使用率,若是在SMP環境下,該值將除以CPU的數量,以表示每CPU的數據。
CPU: 該進程所依附的CPU編號(0表示第一個CPU)。

2)監控pid爲1(init)的進程的設備IO資源負載狀況,其中每隔2秒刷新並輸出一次,3次後程序退出
pidstat -p 1 2 3 -d
07:24:49 AM PID kB_rd/s kB_wr/s kB_ccwr/s Command
07:24:51 AM 1 0.00 0.00 0.00 init
07:24:53 AM 1 0.00 0.00 0.00 init
07:24:55 AM 1 0.00 0.00 0.00 init
Average: 1 0.00 0.00 0.00 init

kB_rd/s: 該進程每秒的字節讀取數量(KB)。
kB_wr/s: 該進程每秒的字節寫出數量(KB)。
kB_ccwr/s: 該進程每秒取消磁盤寫入的數量(KB)。

3)監控pid爲1(init)的進程的內存使用狀況,其中每隔2秒刷新並輸出一次,3次後程序退出
pidstat -p 1 2 3 -r
07:29:56 AM PID minflt/s majflt/s VSZ RSS %MEM Command
07:29:58 AM 1 0.00 0.00 2828 1368 0.13 init
07:30:00 AM 1 0.00 0.00 2828 1368 0.13 init
07:30:02 AM 1 0.00 0.00 2828 1368 0.13 init
Average: 1 0.00 0.00 2828 1368 0.13 init

minflt/s: 每秒次缺頁錯誤次數(minor page faults),次缺頁錯誤次數意即虛擬內存地址映射成物理內存地址產生的page fault次數
majflt/s: 每秒主缺頁錯誤次數(major page faults),當虛擬內存地址映射成物理內存地址時,相應的page在swap中,這樣的page fault爲major page fault,通常在內存使用緊張時產生
VSZ: 該進程使用的虛擬內存(以kB爲單位)
RSS: 該進程使用的物理內存(以kB爲單位)
%MEM: 該進程使用內存的百分比
Command: 拉起進程對應的命令

4)監控pid爲1(init)的進程任務切換狀況,其中每隔2秒刷新並輸出一次,3次後程序退出。
pidstat -p 1 2 3 -w
07:32:15 AM PID cswch/s nvcswch/s Command
07:32:17 AM 1 0.00 0.00 init
07:32:19 AM 1 0.00 0.00 init
07:32:21 AM 1 0.00 0.00 init
Average: 1 0.00 0.00 init

cswch/s: 每秒任務主動(自願的)切換上下文的次數。主動切換是指當某一任務處於阻塞等待時,將主動讓出本身的CPU資源。
nvcswch/s: 每秒任務被動(不自願的)切換上下文的次數。被動切換是指CPU分配給某一任務的時間片已經用完,所以將強迫該進程讓出CPU的執行權。

5)監控pid爲1(init)的進程及其內部線程的內存(r選項)使用狀況,其中每隔2秒刷新並輸出一次,3次後程序退出。須要說明的是,若是-t選項後面不加任何其餘選項,缺省監控的爲CPU資源
pidstat -p 1 2 3 -tr
Linux 2.6.32-71.el6.i686 (Stephen-PC) 11/16/2011 _i686_ (1 CPU)
07:37:04 AM TGID TID minflt/s majflt/s VSZ RSS %MEM Command
07:37:06 AM 1 - 0.00 0.00 2828 1368 0.13 init
07:37:06 AM - 1 0.00 0.00 2828 1368 0.13 |__init

07:37:06 AM TGID TID minflt/s majflt/s VSZ RSS %MEM Command
07:37:08 AM 1 - 0.00 0.00 2828 1368 0.13 init
07:37:08 AM - 1 0.00 0.00 2828 1368 0.13 |__init

07:37:08 AM TGID TID minflt/s majflt/s VSZ RSS %MEM Command
07:37:10 AM 1 - 0.00 0.00 2828 1368 0.13 init
07:37:10 AM - 1 0.00 0.00 2828 1368 0.13 |__init

Average: TGID TID minflt/s majflt/s VSZ RSS %MEM Command
Average: 1 - 0.00 0.00 2828 1368 0.13 init
Average: - 1 0.00 0.00 2828 1368 0.13 |__init

TGID: 線程組ID。
TID: 線程ID。
以上監控不一樣資源的選項能夠同時存在,這樣就將在一次輸出中輸出多種資源的使用狀況,如:pidstat -p 1 -dr。

 


 

十二、iostat

      主要用於監控系統設備的IO負載狀況,iostat首次運行時顯示自系統啓動開始的各項統計信息,以後運行iostat將顯示自上次運行該命令之後的統計信息。用戶能夠經過指定統計的次數和時間來得到所需的統計信息。iostat的數據的主要來源是/proc/partitions。
-c 只顯示CPU行
-d 顯示磁盤行
-k 以千字節爲單位顯示磁盤輸出
-m 以M爲單位顯示磁盤輸出
-t 在輸出中包括時間戳
-x 在輸出中包括擴展的磁盤指標

1)僅顯示設備的IO負載,其中每隔1秒刷新並輸出結果一次,輸出3次後iostat退出
iostat -d 1 3
Linux 2.6.32-71.el6.i686 (Stephen-PC) 11/16/2011 _i686_ (1 CPU)
Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn
sda 5.35 258.39 26.19 538210 54560

Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn
sda 0.00 0.00 0.00 0 0

Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn
sda 0.00 0.00 0.00 0 0

Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn
sda 0.00 0.00 0.00 0 0

Blk_read/s 每秒塊(扇區)讀取的數量。
Blk_wrtn/s 每秒塊(扇區)寫入的數量。
Blk_read 總共塊(扇區)讀取的數量。
Blk_wrtn 總共塊(扇區)寫入的數量。

2)顯示和io相關的擴展數據
iostat -dx 1 3

Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util
sda 5.27 1.31 2.82 1.14 189.49 19.50 52.75 0.53 133.04 10.74 4.26

Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util
sda 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00

Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util
sda 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00

rrqm/s 隊列中每秒鐘合併的讀請求數量
wrqm/s 隊列中每秒鐘合併的寫請求數量
r/s 每秒鐘完成的讀請求數量
w/s 每秒鐘完成的寫請求數量
rsec/s 每秒鐘讀取的扇區數量
wsec/s 每秒鐘寫入的扇區數量
avgrq-sz 平均請求扇區的大小
avgqu-sz 平均請求隊列的長度,隊列長度越短越好。
await 平均每次請求的等待時間,這個時間包括了隊列時間和服務時間,也就是說,通常狀況下,await大於svctm,它們的差值越小,則說明隊列時間越短,反之差值越大,隊列時間越長說明系統出了問題。
util 設備的利用率。在統計時間內全部處理IO時間,除以總共統計時間。例如,若是統計間隔1秒,該設備有0.8秒在處理IO,而0.2秒閒置,那麼該設備的%util = 0.8/1 = 80%,因此該參數暗示了設備的繁忙程度。通常地,若是該參數是100%表示設備已經接近滿負荷運行了(固然若是是多磁盤,即便%util是100%,由於磁盤的併發能力,因此磁盤使用未必就到了瓶頸)。

 


 

1三、iotop

     用來監視磁盤I/O使用情況的top類工具。iotop具備與top類似的UI,其中包括PID、用戶、I/O、進程等相關信息。
參數:
–version 查看版本信息
-h, –help 查看幫助信息
-o, –only 只顯示在劃硬盤的程序
-b, –batch 批量處理 用來記錄日誌
-n NUM 設定循環幾回
-d SEC, –delay=SEC 設定顯示時間間隔

iotop經常使用快捷鍵
左右箭頭 --> 改變排序方式,默認是按IO排序
r --> 改變排序順序
o --> 只顯示有IO輸出的進程
p --> 進程/線程的顯示方式的切換
a --> 顯示累積使用量
q --> 退出

1)直接運行iotop
Total DISK READ: 6.01 M/s | Total DISK WRITE: 3.85 K/s
TID PRIO USER DISK READ DISK WRITE SWAPIN IO> COMMAND
20074 be/4 hadoop 6.01 M/s 0.00 B/s 0.00 % 4.54 % java -Dproc_datanode -Xmx8192m -server org.apache.hadoop.hdfs.server.datanode.DataNode
6371 be/4 hadoop 0.00 B/s 3.25 M/s 0.00 % 0.00 % java -Dproc_datanode -Xmx8192m -server org.apache.hadoop.hdfs.server.datanode.DataNode
8497 be/4 hadoop 0.00 B/s 3.67 M/s 0.00 % 0.00 % java -Dproc_datanode -Xmx8192m -server org.apache.hadoop.hdfs.server.datanode.DataNode
1 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % init
2 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [kthreadd]
經過輸出結果,咱們能夠清楚地知曉是什麼程序在讀寫磁盤,速度以及命令行,pid 等信息。


1四、watch

     實時監測命令,watch是一個很是實用的命令,能夠幫你實時監測一個命令的運行結果,免得一遍又一遍的手動運行。該命令最爲經常使用的兩個選項是-d和-n,其中-n表示間隔多少秒執行次"command",-d表示高亮發生變化的位置。

用法舉例:
1)每隔一秒執行一次who命令,以監視服務器當前用戶登陸的情況
watch -d -n 1 'who'

2)watch能夠同時運行多個命令,命令間用分號分隔。如下命令監控磁盤的使用情況,以及當前目錄下文件的變化情況,包括文件的新增、刪除和文件修改日期的更新等。
watch -d -n 1 'df -h; ls -l'

 


1五、sar

yum安裝:yum install sysstat (sar是後臺進程sadc的前端顯示工具,安裝名爲「sysstat」的包後,sadc就會自動從內核收集報告並保存)

      sar(System Activity Reporter系統活動狀況報告)是目前Linux上最爲全面的系統性能分析工具之一,能夠從多方面對系統的活動進行報告,包括:文件的讀寫狀況、系統調用的使用狀況、磁盤I/O、CPU效率、內存使用情況、進程活動及IPC有關的活動等。
經常使用格式:
sar [options] [-A] [-o file] t [n]
其中:
t爲採樣間隔,n爲採樣次數,默認值是1;
-o file表示將命令結果以二進制格式存放在文件中,file 是文件名。
options 爲命令行選項,sar命令經常使用選項以下:

-A:全部報告的總和
-u:輸出CPU使用狀況的統計信息
-v:輸出inode、文件和其餘內核表的統計信息
-d:輸出每個塊設備的活動信息
-r:輸出內存和交換空間的統計信息
-b:顯示I/O和傳送速率的統計信息
-a:文件讀寫狀況
-c:輸出進程統計信息,每秒建立的進程數
-R:輸出內存頁面的統計信息
-y:終端設備活動狀況
-w:輸出系統交換活動信息

1)CPU資源監控
每10秒採樣一次,連續採樣3次,觀察CPU的使用狀況,並將採樣結果以二進制形式存入當前目錄下的文件test中,需鍵入以下命令:
sar -u -o test 10 3

17:06:16 CPU %user %nice %system %iowait %steal %idle
17:06:26 all 0.00 0.00 0.20 0.00 0.00 99.80
17:06:36 all 0.00 0.00 0.20 0.00 0.00 99.80
17:06:46 all 0.00 0.00 0.10 0.00 0.00 99.90
Average: all 0.00 0.00 0.17 0.00 0.00 99.83

CPU:all 表示統計信息爲全部 CPU 的平均值。
%user:顯示在用戶級別(application)運行使用 CPU 總時間的百分比。
%nice:顯示在用戶級別,用於nice操做,所佔用 CPU 總時間的百分比。
%system:在覈心級別(kernel)運行所使用 CPU 總時間的百分比。
%iowait:顯示用於等待I/O操做佔用 CPU 總時間的百分比。
%steal:管理程序(hypervisor)爲另外一個虛擬進程提供服務而等待虛擬 CPU 的百分比。
%idle:顯示 CPU 空閒時間佔用 CPU 總時間的百分比。

a、若%iowait的值太高,表示硬盤存在I/O瓶頸
b、若%idle的值高但系統響應慢時,有多是 CPU 等待分配內存,此時應加大內存容量
c、若%idle的值持續低於1,則系統的 CPU 處理能力相對較低,代表系統中最須要解決的資源是 CPU 。
d、若是要查看二進制文件test中的內容,需鍵入以下sar命令:sar -u -f test

2)inode、文件和其餘內核表監控
每10秒採樣一次,連續採樣3次,觀察覈心表的狀態,需鍵入以下命令:
sar -v 10 3

17:10:49 dentunusd file-nr inode-nr pty-nr
17:10:59 6301 5664 12037 4
17:11:09 6301 5664 12037 4
17:11:19 6301 5664 12037 4
Average: 6301 5664 12037 4

dentunusd:目錄高速緩存中未被使用的條目數量
file-nr:文件句柄(file handle)的使用數量
inode-nr:索引節點句柄(inode handle)的使用數量
pty-nr:使用的pty數量

3) 內存和交換空間監控
每10秒採樣一次,連續採樣3次,監控內存分頁:
sar -r 10 3

kbmemfree:這個值和free命令中的free值基本一致,因此它不包括buffer和cache的空間.
kbmemused:這個值和free命令中的used值基本一致,因此它包括buffer和cache的空間.
%memused:這個值是kbmemused和內存總量(不包括swap)的一個百分比.
kbbuffers和kbcached:這兩個值就是free命令中的buffer和cache.
kbcommit:保證當前系統所須要的內存,即爲了確保不溢出而須要的內存(RAM+swap).
%commit:這個值是kbcommit與內存總量(包括swap)的一個百分比.

4)內存分頁監控
每10秒採樣一次,連續採樣3次,監控內存分頁:
sar -B 10 3

pgpgin/s:表示每秒從磁盤或SWAP置換到內存的字節數(KB)
pgpgout/s:表示每秒從內存置換到磁盤或SWAP的字節數(KB)
fault/s:每秒鐘系統產生的缺頁數,即主缺頁與次缺頁之和(major + minor)
majflt/s:每秒鐘產生的主缺頁數.
pgfree/s:每秒被放入空閒隊列中的頁個數
pgscank/s:每秒被kswapd掃描的頁個數
pgscand/s:每秒直接被掃描的頁個數
pgsteal/s:每秒鐘從cache中被清除來知足內存須要的頁個數
%vmeff:每秒清除的頁(pgsteal)佔總掃描頁(pgscank+pgscand)的百分比

5)I/O和傳送速率監控
每10秒採樣一次,連續採樣3次,報告緩衝區的使用狀況,需鍵入以下命令:
sar -b 10 3

18:51:05 tps rtps wtps bread/s bwrtn/s
18:51:15 0.00 0.00 0.00 0.00 0.00
18:51:25 1.92 0.00 1.92 0.00 22.65
18:51:35 0.00 0.00 0.00 0.00 0.00
Average: 0.64 0.00 0.64 0.00 7.59

tps:每秒鐘物理設備的 I/O 傳輸總量
rtps:每秒鐘從物理設備讀入的數據總量
wtps:每秒鐘向物理設備寫入的數據總量
bread/s:每秒鐘從物理設備讀入的數據量,單位爲 塊/s
bwrtn/s:每秒鐘向物理設備寫入的數據量,單位爲 塊/s

6)進程隊列長度和平均負載狀態監控
每10秒採樣一次,連續採樣3次,監控進程隊列長度和平均負載狀態:
sar -q 10 3

19:25:50 runq-sz plist-sz ldavg-1 ldavg-5 ldavg-15
19:26:00 0 259 0.00 0.00 0.00
19:26:10 0 259 0.00 0.00 0.00
19:26:20 0 259 0.00 0.00 0.00
Average: 0 259 0.00 0.00 0.00

runq-sz:運行隊列的長度(等待運行的進程數)
plist-sz:進程列表中進程(processes)和線程(threads)的數量
ldavg-1:最後1分鐘的系統平均負載(System load average)
ldavg-5:過去5分鐘的系統平均負載
ldavg-15:過去15分鐘的系統平均負載

7)系統交換活動信息監控
每10秒採樣一次,連續採樣3次,監控系統交換活動信息:
sar - W 10 3

19:39:50 pswpin/s pswpout/s
19:40:00 0.00 0.00
19:40:10 0.00 0.00
19:40:20 0.00 0.00
Average: 0.00 0.00

pswpin/s:每秒系統換入的交換頁面(swap page)數量
pswpout/s:每秒系統換出的交換頁面(swap page)數量

8)設備使用狀況監控
每10秒採樣一次,連續採樣3次,報告設備使用狀況,需鍵入以下命令:
sar -d 10 3 -p

17:45:54 DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util
17:46:04 scd0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
17:46:04 sda 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
17:46:04 vg_livedvd-lv_root 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
17:46:04 vg_livedvd-lv_swap 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00

參數-p能夠打印出sda,hdc等磁盤設備名稱,若是不用參數-p,設備節點則有多是dev8-0,dev22-0
tps:每秒從物理磁盤I/O的次數.多個邏輯請求會被合併爲一個I/O磁盤請求,一次傳輸的大小是不肯定的.
rd_sec/s:每秒讀扇區的次數.
wr_sec/s:每秒寫扇區的次數.
avgrq-sz:平均每次設備I/O操做的數據大小(扇區).
avgqu-sz:磁盤請求隊列的平均長度,avgqu-sz的值較低時,設備的利用率較高
await:從請求磁盤操做到系統完成處理,每次請求的平均消耗時間,包括請求隊列等待時間,單位是毫秒(1秒=1000毫秒).
svctm:系統處理每次請求的平均時間,不包括在請求隊列中消耗的時間.
%util:I/O請求佔CPU的百分比,比率越大,說明越飽和,當%util的值接近100%時,表示設備帶寬已經佔滿。

9)要判斷系統瓶頸問題,有時需幾個 sar 命令選項結合起來
懷疑CPU存在瓶頸,可用 sar -u 和 sar -q 等來查看
懷疑內存存在瓶頸,可用 sar -B、sar -r 和 sar -W 等來查看
懷疑I/O存在瓶頸,可用 sar -b、sar -u 和 sar -d 等來查看

10)分析網卡流量
sar -n { DEV | EDEV | NFS | NFSD | SOCK | ALL }
sar提供六種不一樣的語法選項來顯示網絡信息。-n選項使用6個不一樣的開關:DEV | EDEV | NFS | NFSD | SOCK | ALL 。DEV顯示網絡接口信息,EDEV顯示關於網絡錯誤的統計數據,NFS統計活動的NFS客戶端的信息,NFSD統計NFS服務器的信息,SOCK顯示套接字信息,ALL顯示全部5個開關。它們能夠單獨或者一塊兒使用。

a)sar -n DEV 2 10
Linux 2.6.18-53.el5PAE (localhost.localdomain) 03/29/2009

01:39:40 AM IFACE rxpck/s txpck/s rxbyt/s txbyt/s rxcmp/s txcmp/s rxmcst/s
01:39:42 AM lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00
01:39:42 AM eth1 131.34 104.98 119704.48 36110.45 0.00 0.00 0.00
01:39:42 AM sit0 0.00 0.00 0.00 0.00 0.00 0.00 0.00

01:39:42 AM IFACE rxpck/s txpck/s rxbyt/s txbyt/s rxcmp/s txcmp/s rxmcst/s
01:39:44 AM lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00
01:39:44 AM eth1 168.00 165.50 114496.50 83938.50 0.00 0.00 0.00
01:39:44 AM sit0 0.00 0.00 0.00 0.00 0.00 0.00 0.00

IFACE:LAN接口
rxpck/s:每秒鐘接收的數據包
txpck/s:每秒鐘發送的數據包
rxbyt/s:每秒鐘接收的字節數
txbyt/s:每秒鐘發送的字節數
rxcmp/s:每秒鐘接收的壓縮數據包
txcmp/s:每秒鐘發送的壓縮數據包
rxmcst/s:每秒鐘接收的多播數據包


b)sar -n EDEV 2 10
Linux 2.6.18-53.el5PAE (localhost.localdomain) 03/29/2009

01:42:18 AM IFACE rxerr/s txerr/s coll/s rxdrop/s txdrop/s txcarr/s rxfram/s rxfifo/s txfifo/s
01:42:20 AM lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
01:42:20 AM eth1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
01:42:20 AM sit0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00

IFACE:LAN接口
rxerr/s:每秒鐘接收的壞數據包
txerr/s:每秒鐘發送的壞數據包
coll/s:每秒衝突數
rxdrop/s:由於緩衝充滿,每秒鐘丟棄的已接收數據包數
txdrop/s:由於緩衝充滿,每秒鐘丟棄的已發送數據包數
txcarr/s:發送數據包時,每秒載波錯誤數
rxfram/s:每秒接收數據包的幀對齊錯誤數
rxfifo/s:接收的數據包每秒FIFO過速的錯誤數
txfifo/s:發送的數據包每秒FIFO過速的錯誤數

c)sar -n SOCK 2 10
Linux 2.6.18-53.el5PAE (localhost.localdomain) 03/29/2009

01:44:32 AM totsck tcpsck udpsck rawsck ip-frag
01:44:34 AM 243 9 8 0 0
01:44:36 AM 242 9 7 0 0
01:44:38 AM 238 9 7 0 0
01:44:40 AM 238 9 7 0 0

totsck:使用的套接字總數量tcpsck:使用的TCP套接字數量udpsck:使用的UDP套接字數量rawsck:使用的raw套接字數量ip-frag:使用的IP段數量

相關文章
相關標籤/搜索