Linux就業技術指導(五):Linux運維核心管理命令詳解


一,Linux核心進程管理命令

1.1 ps:查看進程

1.1.1 命令解釋

功能說明

ps命令用於列出執行ps命令的那個時刻的進程快照,就像用手機給進程照了一張照片。如果想要動態地顯示進程,就需要使用top命令,該命令類似於把手機切換成錄像模式。

選項說明

參數選項 解釋說明(帶@的為重點)
-a 顯示所有終端下執行的進程
a 顯示與終端相關的所有進程,包含每個進程的完整路徑@
x 顯示與終端無關的所有進程@
u 顯示進程的用戶信息@
-u 顯示指定用戶相關的進程信息
-e 顯示所有進程@
-f 額外顯示UID,PPID,C與STIME欄位@
f 顯示進程樹
-H 顯示進程樹
-l 以詳細的格式來顯示進程的狀況
-o 自定義輸出指定的字段,以逗號分隔
-sort key key表示為指定字段排序,默認升序,+key升序,-key降序

1.1.2 使用范例

(1)ps 命令不接任何參數

[root@Mr_chen ~]# ps
   PID TTY          TIME CMD
  1135 pts/0    00:00:00 bash
  1152 pts/0    00:00:00 bash
  1162 pts/0    00:00:00 bash
  1173 pts/0    00:00:00 bash
  1182 pts/0    00:00:00 ps

默認情況下,ps命令不接任何參數時,輸出的是使用者當前所在終端(窗口)的進程,其輸出結果中的各項說明如下。

  • [x] :PID是進程的標識號
  • [x] :TTY是進程所屬的終端控制台
  • [x] :TIME列是進程所使用的總的CPU時間
  • [x] :CMD列是正在執行的命令行

(2)ps -ef

[root@Mr_chen ~]# ps -ef    # -e顯示所有進程,-f格外顯示UID,PPID,C與STIME欄位
UID         PID   PPID  C STIME TTY          TIME CMD
root          1      0  0 15:00 ?        00:00:00 /sbin/init
root          2      0  0 15:00 ?        00:00:00 [kthreadd]
root          3      2  0 15:00 ?        00:00:00 [migration/0]
root          4      2  0 15:00 ?        00:00:00 [ksoftirqd/0]
root          5      2  0 15:00 ?        00:00:00 [migration/0]
root          6      2  0 15:00 ?        00:00:00 [watchdog/0]
root          7      2  0 15:00 ?        00:00:00 [events/0]
root          8      2  0 15:00 ?        00:00:00 [cgroup]
root          9      2  0 15:00 ?        00:00:00 [khelper]
root         10      2  0 15:00 ?        00:00:00 [netns]
root         11      2  0 15:00 ?        00:00:00 [async/mgr]
root         12      2  0 15:00 ?        00:00:00 [pm]
root         13      2  0 15:00 ?        00:00:00 [sync_supers]
root         14      2  0 15:00 ?        00:00:00 [bdi-default]
root         15      2  0 15:00 ?        00:00:00 [kintegrityd/0]
root         16      2  0 15:00 ?        00:00:00 [kblockd/0]
root         17      2  0 15:00 ?        00:00:00 [kacpid]

輸出信息中各列說明如下

  • [x] UID:進程被該UID所擁有
  • [x] PID:進程的標識號
  • [x] PPID:進程的父進程的標識號
  • [x] C:CPU使用的資源百分比
  • [x] STIME:進程開始的時間
  • [x] TTY:該進程是在哪個終端機上面運作,若與終端機無關,則顯示“?”,另外,tty1-tty6是本機上面的登入者進程,若為pts/0等,則表示為由網絡連接進主機的進程。
  • [x] TIME:進程所使用的總的CPU時間
  • [x] CMD:正在執行的命令行

(3)ps aux

[root@Mr_chen ~]# ps aux
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root          1  0.0  0.1  19232  1488 ?        Ss   15:00   0:00 /sbin/init
root          2  0.0  0.0      0     0 ?        S    15:00   0:00 [kthreadd]
root          3  0.0  0.0      0     0 ?        S    15:00   0:00 [migration/0]
root          4  0.0  0.0      0     0 ?        S    15:00   0:00 [ksoftirqd/0]
root          5  0.0  0.0      0     0 ?        S    15:00   0:00 [migration/0]
root          6  0.0  0.0      0     0 ?        S    15:00   0:00 [watchdog/0]
root          7  0.0  0.0      0     0 ?        S    15:00   0:00 [events/0]

輸出信息中各列的說明如下

  • [x] USER:該進程屬於的用戶。
  • [x] PID:該進程的進程號。
  • [x] %CPU:該進程使用掉的CPU資源百分比。
  • [x] %MEM:該進程所占用的物理內存百分比。
  • [x] VSZ:該進程使用掉的虛擬內存量(單位Kbytes)
  • [x] RSS:該進程占用的固定的內存量(單位Kbytes)
  • [x] TTY:該進程是在哪個終端機上面運作的,若與終端機無關,則顯示“?”,另外,tty1-tty6是本機上面的登入者進程,若為pts/0等,則表示為由網絡連接進主機的進程。
  • [x] STAT:該進程目前的狀態,主要的狀態包括如下幾種。
    • R:正在運行,或者是可以運行。
    • S:正在終端睡眠中,可以由某些信號喚醒。
    • D:不可中斷睡眠。
    • T:正在偵測或者是停止了。
    • Z:已經終止,但是其父進程無法正常終止它,從而變成zombie(僵屍)進程的狀態
    • +:前台進程。
    • l:多線程進程。
    • N:低優先級進程。
    • <:高優先級進程。
    • s:進程領導者。
    • L:已將頁面鎖定到內存中。
  • [x] START:該進程被觸發啟動的時間
  • [x] TIME:該進程實際使用CPU運作的時間
  • [x] COMMAND:該進程的實際命令。

(4)顯示指定用戶的相關進程信息

[root@Mr_chen ~]# ps -u yunjisuan
   PID TTY          TIME CMD
  1315 pts/1    00:00:00 bash
  1335 pts/1    00:00:00 vim

(5) 以詳細格式顯示進程狀態

[root@Mr_chen ~]# ps -u yunjisuan -l
F S   UID    PID   PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 S   500   1315   1314  0  80   0 - 27076 n_tty_ pts/1    00:00:00 bash
0 T   500   1335   1315  0  80   0 - 35884 signal pts/1    00:00:00 vim

輸出信息中各列的說明如下

  • [x] F:代表這個進程的標志(flag),4代表使用者為super user。
  • [x] S:代表這個進程的狀態(STAT),前面已經講解過了
  • [x] UID:進程被該UID所擁有。
  • [x] PID:進程的標識號。
  • [x] PPID:父進程的ID。
  • [x] C:CPU使用的資源百分比。
  • [x] PRI:Priority(優先執行序)的縮寫
  • [x] NI:Nice值
  • [x] ADDR:指出該進程在內存的哪個部分。如果是個running的進程,則一般是“-”。
  • [x] SZ:使用掉的內存大小。
  • [x] WCHAN:目前這個進程是否正在運作當中,若為“-”則表示正在運作。
  • [x] TTY:該進程是在哪個終端機上面運作的,若與終端機無關,則顯示“?”,另外,tty1-tty6是本機上面的登入者進程,若為pts/0等,則表示為由網絡連接進主機的進程。
  • [x] TIME:該進程實際使用CPU運作的時間
  • [x] CMD:該進程的實際命令

(6)查看某個進程在哪個CPU上運行

[root@Mr_chen ~]# ps -eo pid,args,psr
   PID COMMAND                     PSR
     1 /sbin/init                    0  #CPU標記0代表第一個CPU
     2 [kthreadd]                    0
     3 [migration/0]                 0
     4 [ksoftirqd/0]                 0
     5 [migration/0]                 0
     6 [watchdog/0]                  0
     7 [events/0]                    0
     8 [cgroup]                      0
     9 [khelper]                     0

1.2 kill:終止進程

1.2.1 命令解釋

功能說明

kill命令能夠終止你希望停止的進程

選項說明

參數選項 解釋說明(帶@為重點)
-l 列出全部的信號名稱
-p 指定kill命令只打印相關進程的進程號,而不發送任何信號
-s 指定要發送的信號@

1.2.2 使用范例

(1)列出所有信號的名稱

[root@Mr_chen ~]# kill -l
 1) SIGHUP	 2) SIGINT	 3) SIGQUIT	 4) SIGILL	 5) SIGTRAP
 6) SIGABRT	 7) SIGBUS	 8) SIGFPE	 9) SIGKILL	10) SIGUSR1
11) SIGSEGV	12) SIGUSR2	13) SIGPIPE	14) SIGALRM	15) SIGTERM
16) SIGSTKFLT	17) SIGCHLD	18) SIGCONT	19) SIGSTOP	20) SIGTSTP
21) SIGTTIN	22) SIGTTOU	23) SIGURG	24) SIGXCPU	25) SIGXFSZ
26) SIGVTALRM	27) SIGPROF	28) SIGWINCH	29) SIGIO	30) SIGPWR
31) SIGSYS	34) SIGRTMIN	35) SIGRTMIN+1	36) SIGRTMIN+2	37) SIGRTMIN+3
38) SIGRTMIN+4	39) SIGRTMIN+5	40) SIGRTMIN+6	41) SIGRTMIN+7	42) SIGRTMIN+8
43) SIGRTMIN+9	44) SIGRTMIN+10	45) SIGRTMIN+11	46) SIGRTMIN+12	47) SIGRTMIN+13
48) SIGRTMIN+14	49) SIGRTMIN+15	50) SIGRTMAX-14	51) SIGRTMAX-13	52) SIGRTMAX-12
53) SIGRTMAX-11	54) SIGRTMAX-10	55) SIGRTMAX-9	56) SIGRTMAX-8	57) SIGRTMAX-7
58) SIGRTMAX-6	59) SIGRTMAX-5	60) SIGRTMAX-4	61) SIGRTMAX-3	62) SIGRTMAX-2
63) SIGRTMAX-1	64) SIGRTMAX	
[root@Mr_chen ~]# kill -l kill  #可以使用-l參數對信號名和數字信號互換
9
[root@Mr_chen ~]# kill -l 9
KILL

常用信號:

信號 說明
HUP(1) 掛起,通常因終端掉線或用戶退出而引發
INT(2) 中斷,通常是按下Ctrl+c組合鍵來發出這個信號
QUIT(3) 退出,通常是按下CTRL+\組合鍵來發出這個信號
KILL(9) 立即結束進程的運行
TERM(15) 終止,通常在系統關機時發送
TSTP(20) 暫停進程的運行,通常是按下Ctrl+z組合鍵來發出這個信號

(2)終止進程

  • kill指令默認使用的信號為15,用於結束進程。如果進程忽略此信號,則可以使用信號9強制終止進程。
  • 一般是先通過ps等命令獲取到要終止進程的進程號,然后直接使用“kill 進程號”就可以了。
kill 2203   #kill 命令默認使用的信號為15,這種格式最常用、
kill -s 15 2203 #這種格式使用-s參數明確指定發送值為15的信號,效果和kill 2203一樣
kill -15 2203   #上面的-s 15可以簡寫為-15

如果用上面的方法還是無法終止進程,那么我們就可以用KILL(9)信號強制終止進程。

kill -9 2203    #信號9會強行終止進程,這會帶來一些副作用,如數據丟失,或者終端無法恢復到正常狀態等,因此應盡量避免使用,除非進程使用其他信號無法終止。

(3)擴展:特殊信號0的應用案例

在kill的所有信號中,有一個十分特殊的信號值0,使用格式為kill -0 $pid。其中的-0表示不發送任何信號給$pid對應的進程,但是仍然會對$pid是否存在對應的進程進行檢查,如果$pid對應的進程已存在,則返回0,若不存在則返回1。

[root@Mr_chen ~]# pgrep -l sshd
985 sshd
1131 sshd
[root@Mr_chen ~]# kill -s 0 985
[root@Mr_chen ~]# echo $?
0
[root@Mr_chen ~]# kill -s 0 986
bash: kill: (986) - No such process
[root@Mr_chen ~]# echo $?
1

應用:如果同學們想要寫一個管理系統服務的腳本,則可以使用這個技巧。

1.3 killall:通過進程名終止進程

1.3.1 命令解釋

功能說明:

使用kill命令終止進程還需要先獲取進程的pid進程號,這個過程有點繁瑣,而使用killall命令就可以直接用“kill 進程名”這種形式終止進程。

選項說明:

參數選項 解釋說明(帶@為重點)
-I 不區分大小寫匹配
-g 終止屬於該進程組的進程
-i 在終止進程之前詢問是否確認
-l 列出所有已知的信號名
-q 如果沒有進程終止則不提示
-r 使用正則表達式匹配要終止的進程名稱
-s 用指定的信號代替默認信號
-u 終止指定用戶的進程@
-v 報告信號是否發送成功
-w 等待所有被終止的進程死去。killall每秒都會檢查一次被終止的進程是否仍然存在,其僅在都死光后才返回。注意,如果信號被忽略,或者沒有起作用,或者進程停留在僵屍狀態,那么killall可能會永久等待@

1.3.2 使用范例

(1)終止定時任務服務進程的例子

首先我們要知道定時任務的進程名是crond,終止該進程的命令如下:

[root@Mr_chen ~]# killall crond
[root@Mr_chen ~]# killall crond #用killall終止進程可執行多次
crond: no process killed    #等看到這個結果說明進程死了
[root@Mr_chen ~]# 
[root@Mr_chen ~]# /etc/init.d/crond start   #啟動服務
Starting crond:                                            [  OK  ]
[root@Mr_chen ~]# killall -w crond  #使用-w參數,會看到等待幾秒后結束命令操作
[root@Mr_chen ~]# killall -w crond
crond: no process killed

(2)終止指定用戶的所有進程

[root@Mr_chen ~]# ps -u yunjisuan -l    #查看普通用戶的所有進程詳細信息
F S   UID    PID   PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 S   500   1175   1174  0  80   0 - 27076 wait   pts/1    00:00:00 bash
0 S   500   1210   1175  0  80   0 - 27076 n_tty_ pts/1    00:00:00 bash
0 T   500   1235   1210  0  80   0 - 35884 signal pts/1    00:00:00 vim
[root@Mr_chen ~]# killall -u yunjisuan vim  #殺掉指定用戶的vim進程
[root@Mr_chen ~]# ps -u yunjisuan -l    #成功
F S   UID    PID   PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 S   500   1175   1174  0  80   0 - 27076 wait   pts/1    00:00:00 bash
0 S   500   1210   1175  0  80   0 - 27076 n_tty_ pts/1    00:00:00 bash

特別提示:
這種方式可以終止所有歸屬於yunjisuan用戶的vim進程。在之前,我在給同學們講nginx優化時提到過nginx的監牢模式和在和給同學們講解sudo時提到過企業的集權分治策略,他們都是利用普通用戶來啟動服務。此時,我們可以指定用戶殺死該用戶啟動的某一服務的所有進程。

1.4 pkill:通過進程名終止進程

1.4.1 命令解釋

功能說明:

pkill命令可通過進程名終止指定的進程。使用killall終止進程需要連續執行幾次,而pkill可以殺死指定進程及其所有子進程。

選項說明:

參數選項 解釋說明(帶@為重點)
-t終端 殺死指定終端的進程@
-u用戶 殺死指定用戶的進程@

1.4.2 使用范例

(1)通過進程名終止進程

[root@Mr_chen ~]# /etc/init.d/crond status  #查看定時任務程序運行狀態
crond (pid  1274) is running...
[root@Mr_chen ~]# pkill crond   #終止定時任務進程
[root@Mr_chen ~]# /etc/init.d/crond status  
crond dead but subsys locked    #進程被終止

(2)通過終端名終止進程

[root@Mr_chen ~]# w     #第二列TTY就是用戶運行的終端
 15:57:09 up  1:05,  3 users,  load average: 0.00, 0.00, 0.00
USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT
yunjisua tty1     -                15:55   12.00s  0.02s  0.01s vim ttt
root     pts/0    192.168.200.1    14:51    0.00s  0.07s  0.00s w
root     pts/1    192.168.200.1    15:19    3:28   0.01s  0.00s bash
[root@Mr_chen ~]# ps -u yunjisuan -l    #查看用戶的進程
F S   UID    PID   PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 S   500   1175   1174  0  80   0 - 27076 wait   pts/1    00:00:00 bash
0 S   500   1210   1175  0  80   0 - 27076 n_tty_ pts/1    00:00:00 bash
4 S   500   1333   1322  0  80   0 - 27075 wait   tty1     00:00:00 bash
0 S   500   1359   1333  0  80   0 - 35890 poll_s tty1     00:00:00 vim
[root@Mr_chen ~]# pkill -t tty1     #殺掉終端正在運行的進程
[root@Mr_chen ~]# ps -u yunjisuan -l    #vim進程沒了
F S   UID    PID   PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 S   500   1175   1174  0  80   0 - 27076 wait   pts/1    00:00:00 bash
0 S   500   1210   1175  0  80   0 - 27076 n_tty_ pts/1    00:00:00 bash
4 S   500   1333   1322  0  80   0 - 27075 n_tty_ tty1     00:00:00 bash
[root@Mr_chen ~]# pkill -9 -t tty1  #強行殺掉tty1終端(踢掉用戶)
[root@Mr_chen ~]# ps -u yunjisuan -l
F S   UID    PID   PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 S   500   1175   1174  0  80   0 - 27076 wait   pts/1    00:00:00 bash
0 S   500   1210   1175  0  80   0 - 27076 n_tty_ pts/1    00:00:00 bash
[root@Mr_chen ~]# w     #tty1終端沒了
 15:58:17 up  1:06,  2 users,  load average: 0.00, 0.00, 0.00
USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT
root     pts/0    192.168.200.1    14:51    0.00s  0.08s  0.00s w
root     pts/1    192.168.200.1    15:19    4:36   0.01s  0.00s bash

(3)通過用戶名終止進程

[root@Mr_chen ~]# w
 16:08:24 up  1:16,  3 users,  load average: 0.00, 0.00, 0.00
USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT
yunjisua tty1     -                16:01    4.00s  0.03s  0.02s -bash
root     pts/0    192.168.200.1    14:51    0.00s  0.09s  0.00s w
root     pts/1    192.168.200.1    15:19   14:43   0.01s  0.00s bash
[root@Mr_chen ~]# ps -u yunjisuan -l    #查看用戶的進程信息
F S   UID    PID   PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 S   500   1175   1174  0  80   0 - 27076 wait   pts/1    00:00:00 bash
0 S   500   1210   1175  0  80   0 - 27076 n_tty_ pts/1    00:00:00 bash
4 S   500   1387   1366  0  80   0 - 27076 n_tty_ tty1     00:00:00 bash
0 T   500   1430   1387  0  80   0 - 35883 signal tty1     00:00:00 vim
[root@Mr_chen ~]# pkill -u yunjisuan    #殺掉指定用戶所有進程
[root@Mr_chen ~]# ps -u yunjisuan -l    #成功
F S   UID    PID   PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 S   500   1175   1174  0  80   0 - 27076 wait   pts/1    00:00:00 bash
0 S   500   1210   1175  0  80   0 - 27076 n_tty_ pts/1    00:00:00 bash
4 S   500   1387   1366  0  80   0 - 27076 n_tty_ tty1     00:00:00 bash

1.5 top:實時顯示系統中各個進程的資源占用狀況

1.5.1 命令解釋

功能說明:

top命令用於實時地對系統處理器狀態進行監控,它能夠實時地顯示系統中各個進程的資源占用狀況。該命令可以按照CPU的使用,內存的使用和執行時間對系統任務進程進行排序顯示,同時top命令還可以通過交互式命令進行設定顯示。

選項說明:

參數選項 解釋說明(帶@為重點)
-a 將進程按照使用內存排序
-b 以批處理的模式顯示進程信息,輸出結果可以傳遞給其他程序或寫入到文件中。在這種模式下,top命令不會接受任何輸入,一直運行直到達到-n選項設置的閾值,或者按Ctrl+C等組合鍵終止程序
-c 顯示進程的整個命令路徑,而不是只顯示命令名稱
-d 指定每兩次屏幕信息刷新之間的時間間隔
-H 指定這個可以顯示每個線程的情況,否則就是進程的總的狀態
-i 不顯示閑置或者僵死的進程信息
-n top輸出信息更新的次數,完成后將退出top命令
-p 顯示指定的進程信息

1.5.2 使用范例

(1)顯示進程信息

root@Mr_chen ~]# top        #使用top命令通常不接任何參數
top - 16:40:31 up  1:48,  3 users,  load average: 0.00, 0.00, 0.00
Tasks:  77 total,   1 running,  76 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,  0.0%st
Mem:   1004412k total,   152112k used,   852300k free,    11312k buffers
Swap:  2031608k total,        0k used,  2031608k free,    42304k cached

   PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                 
     1 root      20   0 19232 1536 1256 S  0.0  0.2   0:00.76 init                      
     2 root      20   0     0    0    0 S  0.0  0.0   0:00.00 kthreadd                  
     3 root      RT   0     0    0    0 S  0.0  0.0   0:00.00 migration/0               
     4 root      20   0     0    0    0 S  0.0  0.0   0:00.01 ksoftirqd/0
  • 第一行,任務隊列信息,同uptime命令的執行結果
    • [x] 16:40:31 當前系統時間
    • [x] up 1:48 系統已經運行了1小時48分
    • [x] 3 users 當前有2個用戶登錄系統
    • [x] load average:0.00, 0.00, 0.00 load average后面三個數分別是1分鍾、5分鍾、15分鍾的平均負載情況
  • 第二行,Tasks為任務(進程)。從上面的信息可以看出,系統現在共有77個進程,其中處於運行狀態的有1個,76個在休眠(sleep),stoped狀態0個,zombie狀態(僵死)的有0個。
  • 第三行,CPU狀態信息
    • [x] 0.0%us 用戶空間占用CPU的百分比
    • [x] 0.0%sy 內核空間占用CPU的百分比
    • [x] 0.0%ni 改變過優先級的進程占用CPU的百分比
    • [x] 100.0%id 空閑CPU百分比
    • [x] 0.0%wa I/O等待占用CPU的百分比
    • [x] 0.0%hi 硬中斷(Hardware IRQ)占用CPU的百分比
    • [x] 0.0%si 軟中斷(Software Interrupts)占用CPU的百分比
    • [x] 0.0%st 虛擬機占用CPU的百分比
  • 第四行,內存狀態
    • [x] 1004412k total 物理內存總量
    • [x] 152112k used 使用中的內存總量
    • [x] 852300k free 空閑內存總量
    • [x] 11312k buffers 緩沖的內存量
  • 第五行,swap交換分區信息
    • [x] 2031608k total 交換區總量
    • [x] 0k used 使用的交換區總量
    • [x] 2031608k free 空閑交換區總量
    • [x] 42304k cached 緩存的內存量
  • 第六行,空行
  • 第七行開始,給出的是各進程(任務)的狀態監控
    • [x] PID 進程id
    • [x] USER 進程所有者
    • [x] PR 進程優先級
    • [x] NI nice值,負值表示高優先級,正值表示低優先級。
    • [x] VIRT 進程使用的虛擬內存總量,單位kb。
    • [x] RES 進程使用的、未被換出的物理內存大小,單位為kb。
    • [x] SHR 共享內存大小,單位為kb
    • [x] S 進程狀態。D=不可中斷的睡眠狀態 R=運行 S=睡眠 T=跟蹤/停止 Z=僵屍進程
    • [x] %CPU 上次更新到現在的CPU時間占用百分比
    • [x] %MEM 進程使用的物理內存百分比
    • [x] TIME+ 進程使用的CPU時間總計,單位1/100秒
    • [x] COMMAND 進程名稱(命令名/命令行)

特別提示:
1)計算真正可用的內存數為:第四行的free+第四行的buffers+第五行的cached
2)在對內存進行監控時,我們要時刻關注top命令里第五行swap交換分區的used,如果這個數值還在不斷地變化,則說明內核正在不斷進行內存和swap的數據交換,這表示內存真的不夠用了或者程序運行有內存溢出問題。

(2)顯示多核不同核CPU的信息

在top基本視圖中,按鍵盤數字“1”,可監控每個邏輯CPU的狀況。

![1.png-42.8kB][2]

從上圖可以發現,服務器有8個邏輯CPU,實際上是2個物理CPU。再按數字鍵1,就會返回到top基本視圖界面。

(2)將進程按照使用內存排序。

[root@Mr_chen ~]# top -a    #使用參數-a將進程按照使用內存排序
top - 18:07:36 up 42 min,  1 user,  load average: 0.00, 0.00, 0.00
Tasks: 164 total,   1 running, 163 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,  0.0%st
Mem:   1004412k total,   153948k used,   850464k free,    10296k buffers
Swap:  2031608k total,        0k used,  2031608k free,    37868k cached

   PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                 
  1236 root      20   0 98.0m 4036 3056 S  0.0  0.4   0:00.20 sshd                     
  1209 postfix   20   0 81524 3424 2544 S  0.0  0.3   0:00.01 qmgr                     
  1202 root      20   0 81272 3400 2496 S  0.0  0.3   0:00.03 master                   
  1208 postfix   20   0 81352 3380 2504 S  0.0  0.3   0:00.03 pickup  

(3)以批處理模式顯示進程信息

[root@Mr_chen ~]# top -b        #使用參數-b可以看到命令執行結果不停地向下刷新
......
  1229 root      20   0  4064  576  496 S  0.0  0.1   0:00.00 mingetty                 
  1231 root      20   0  4064  576  496 S  0.0  0.1   0:00.00 mingetty                 
  1233 root      20   0  4064  576  496 S  0.0  0.1   0:00.00 mingetty                 
  1235 root      20   0  4064  576  496 S  0.0  0.1   0:00.00 mingetty                 
  1236 root      20   0 98.0m 4036 3056 S  0.0  0.4   0:00.22 sshd                     
  1243 root      18  -2 12344 2580  516 S  0.0  0.3   0:00.00 udevd                    
  1244 root      18  -2 12344 2584  516 S  0.0  0.3   0:00.00 udevd                    
  1248 root      20   0  105m 1876 1520 S  0.0  0.2   0:00.04 bash                     
  1301 root      20   0 17384  668  452 S  0.0  0.1   0:00.00 anacron                  
  1318 root      20   0 15032 1340  984 R  0.0  0.1   0:00.01 top                      
^C  #退出使用快捷鍵Ctrl+C

(4)顯示進程的完整路徑

[root@Mr_chen chen]# top -c #使用參數-c顯示進程的整個命令路徑。
top - 18:19:38 up 54 min,  1 user,  load average: 0.00, 0.00, 0.00
Tasks: 164 total,   1 running, 163 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,  0.0%st
Mem:   1004412k total,   154196k used,   850216k free,    10316k buffers
Swap:  2031608k total,        0k used,  2031608k free,    37904k cached

   PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                 
     1 root      20   0 19232 1484 1220 S  0.0  0.1   0:00.98 /sbin/init               
     2 root      20   0     0    0    0 S  0.0  0.0   0:00.01 [kthreadd]               
     3 root      RT   0     0    0    0 S  0.0  0.0   0:00.00 [migration/0] 

(5) 設置執行top命令后的信息刷新時間

[root@Mr_chen chen]# top -d 3       #使用參數-d指定更新周期為3秒,也就是說命令結果每隔3s刷新一次

(6)設置執行top命令后的信息刷新次數

[root@Mr_chen chen]# top -n 2   #使用參數-n指定更新次數為2次,也就是說命令結果刷新兩次后終止退出,-n參數可以和-b參數配合使用

(7)將top輸出結果的全部信息輸出到文件中

[root@Mr_chen chen]# top -b -n1 > test  #以批處理方式,就刷新1次數據重定向到文件里
[root@Mr_chen chen]# cat test | wc -l
171
[root@Mr_chen chen]# top -n1 > test     #如果不是批處理方式,數據量少
[root@Mr_chen chen]# cat test | wc -l
28

特別提示:
在工作中,如果沒有必要,我們盡量不要在服務器上直接用top無任何參數的方式查看,因為這樣會非常占用系統的資源。我們可以使用top -b -n1 > test的方式將數據重定向到文件里,再進行查看。

(8)顯示指定的進程信息

[root@Mr_chen chen]# top -p 1126    #使用-p選項顯示指定進程號的信息
top - 18:31:18 up  1:06,  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,  0.0%st
Mem:   1004412k total,   154032k used,   850380k free,    10448k buffers
Swap:  2031608k total,        0k used,  2031608k free,    38060k cached

   PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                 
  1126 root      20   0 66604 1184  468 S  0.0  0.1   0:00.00 sshd 

(9)顯示指定用戶的信息

[root@Mr_chen chen]# top -u yunjisuan   #使用-u參數顯示指定用戶的進程信息
top - 18:33:05 up  1:08,  2 users,  load average: 0.00, 0.00, 0.00
Tasks: 165 total,   1 running, 164 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,  0.0%st
Mem:   1004412k total,   160388k used,   844024k free,    10796k buffers
Swap:  2031608k total,        0k used,  2031608k free,    41696k cached

   PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                 
  1384 yunjisua  20   0  105m 1896 1528 S  0.0  0.2   0:00.01 bash                     
  1403 yunjisua  20   0  140m 3968 2684 S  0.0  0.4   0:00.01 vim   

1.6 nohup:用戶退出系統進程繼續工作

1.6.1 命令解釋

功能說明:

  • nohup命令可以將程序以忽略掛起信號的方式運行起來,被運行程序的輸出信息將不會顯示到終端。
  • 無論是否將nohup命令的輸出重定向到終端,輸出都將寫入到當前目錄的nohup.out文件中。如果當前目錄的nohup.out文件不可寫,則輸出重定向到$HOME/nohup.out文件中。

1.6.2 使用范例

(1)讓執行的命令在當前會話終止后繼續保持運行。

正常情況下,如果用戶退出登錄或會話終止,則用戶正在執行並可持續一段時間的命令(非守護進程)將自動終止。使用nohup命令可以實現在用戶退出或當前會話終止后繼續保持運行,具體的例子如下:

[root@Mr_chen ~]# cd chen/
[root@Mr_chen chen]# nohup ping www.baidu.com   #讓當前執行的進程始終運行,關閉界面也不消失
nohup: ignoring input and appending output to `nohup.out'
^C[root@Mr_chen chen]# ls
nohup.out  test
[root@Mr_chen chen]# cat nohup.out #命令的執行記錄會被記錄在當前目錄下的nohup.out中
PING www.a.shifen.com (61.135.169.125) 56(84) bytes of data.
64 bytes from 61.135.169.125: icmp_seq=1 ttl=128 time=4.22 ms
64 bytes from 61.135.169.125: icmp_seq=2 ttl=128 time=4.28 ms
64 bytes from 61.135.169.125: icmp_seq=3 ttl=128 time=4.20 ms
64 bytes from 61.135.169.125: icmp_seq=4 ttl=128 time=4.21 ms
64 bytes from 61.135.169.125: icmp_seq=5 ttl=128 time=4.16 ms
64 bytes from 61.135.169.125: icmp_seq=6 ttl=128 time=4.11 ms
64 bytes from 61.135.169.125: icmp_seq=7 ttl=128 time=4.22 ms
64 bytes from 61.135.169.125: icmp_seq=8 ttl=128 time=4.18 ms
64 bytes from 61.135.169.125: icmp_seq=9 ttl=128 time=4.21 ms

--- www.a.shifen.com ping statistics ---
9 packets transmitted, 9 received, 0% packet loss, time 8508ms
rtt min/avg/max/mdev = 4.114/4.203/4.285/0.097 ms

在工作中我們一般會配合&符號運行nohup命令,讓程序直接在后台運行

[root@Mr_chen chen]# w  #用戶yunjisuan的客戶端已經退出
 05:45:29 up 8 min,  1 user,  load average: 0.00, 0.02, 0.00
USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT
root     pts/0    192.168.200.1    05:37    0.00s  0.12s  0.00s w
[root@Mr_chen chen]# ps -u yunjisuan -l #但是用戶的ping進程還在
F S   UID    PID   PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 S   500   1332      1  0  80   0 - 27394 poll_s ?        00:00:00 ping
[root@Mr_chen chen]# tail -f /home/yunjisuan/nohup.out #nohup.out文件一直在記錄信息
64 bytes from 61.135.169.125: icmp_seq=24 ttl=128 time=4.26 ms
64 bytes from 61.135.169.125: icmp_seq=25 ttl=128 time=4.24 ms
64 bytes from 61.135.169.125: icmp_seq=26 ttl=128 time=4.14 ms
64 bytes from 61.135.169.125: icmp_seq=27 ttl=128 time=4.28 ms
64 bytes from 61.135.169.125: icmp_seq=28 ttl=128 time=6.25 ms
64 bytes from 61.135.169.125: icmp_seq=29 ttl=128 time=4.10 ms

1.7 strace:跟蹤進程的系統調用

1.7.1 命令解釋

功能說明

strace是Linux環境下的一款程序調試工具,用於檢查一個應用程序所使用的系統調用以及它所接收的系統信息。strace會追蹤程序運行時的整個生命周期,輸出每一個系統調用的名字、參數、返回值和執行所消耗的時間等,是高級運維和開發人員排查問題的殺手鐧。

選項說明

參數選項 解釋說明(帶@為重點)
-c 統計每一個系統調用所執行的算時間、次數和出錯的次數等
-d 輸出strace關於標准錯誤的調試信息
-f 跟蹤目標進程,以及目標進程創建的所有子進程@
-ff 如果提供-o filename,則將所有進程的跟蹤結果輸出到相應的filename.pid中,pid是各進程的進程號
-i 輸出系統調用的入口指針
-q 禁止輸出關於脫離的消息
-r 輸出每一個系統調用的相對時間
-t 在輸出中的每一行前加上時間信息。例如:16:45:28
-tt 在輸出中的每一行前加上時間信息,精確到微秒。例如11:18:59.759546@
-ttt 在輸出中的每一行前加上時間信息,精確到微秒,而且時間表示為UNIX時間戳。例如1486111461.650434
-T 顯示每次系統調用所花費的時間
-v 對於某些相關調用,把完整的環境變量、文件stat結構等打印出來
-x 以十六進制形式輸出非標准字符串
-xx 所有字符串以十六進制形式輸出
-o filename 將strace的輸出寫入文件filename
-p pid 指定要跟蹤的進程pid,要同時跟蹤多個pid,重復多次-p選項即可@
-s strsize 指定輸出的字符串的最大長度,默認為32.並沒有將文件名視為字符串,默認全部輸出
-u username 以username的UID和GID執行所跟蹤的命令

輸出過濾器

參數選項 解釋說明(帶@為重點)
-e expr 輸出過濾器,通過表達式,可以過濾掉你不想要的輸出@
-e trace=open 表示只跟蹤open調用而-e trace!=open表示跟蹤除open外所有
-e trace=file 只跟蹤與文件操作有關的系統調用
-e trace=process 只跟蹤與進程有關的系統調用
-e trace=network 只跟蹤與網絡有關的系統調用
-e trace=signal 只跟蹤與系統信號有關的系統調用
-e trace=desc 只跟蹤與文件描述符有關的系統調用
-e trace=ipc 只跟蹤與進程通信有關的系統調用

1.7.2 使用范例

(1)排查Nginx 403 forbidden錯誤

[root@localhost tmp]# strace -tt -f -o /tmp/test.txt /usr/local/nginx/sbin/nginx     #f參數跟蹤目標進程,以及目標進程創建的所有子進程,-tt參數在輸出中的每一行前加上時間信息,-o將跟蹤內容輸出到文件里。
[root@localhost tmp]# cat test.txt 
3824  05:37:14.300486 prctl(PR_SET_DUMPABLE, 1) = 0
3824  05:37:14.300498 rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
3824  05:37:14.300518 epoll_create(512) = 8
3824  05:37:14.300535 eventfd2(0, 0)    = 9
3824  05:37:14.300549 epoll_ctl(8, EPOLL_CTL_ADD, 9, {EPOLLIN|EPOLLET, {u32=7095968, u64=7095968}}) = 0
3824  05:37:14.300569 mmap(NULL, 233472, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f73714f7000
3824  05:37:14.300607 brk(0x1fa5000)    = 0x1fa5000
3824  05:37:14.300693 epoll_ctl(8, EPOLL_CTL_ADD, 6, {EPOLLIN|0x2000, {u32=1901031440, u64=140133798998032}}) = 0
3824  05:37:14.300712 close(3)          = 0
3824  05:37:14.300724 epoll_ctl(8, EPOLL_CTL_ADD, 7, {EPOLLIN|0x2000, {u32=1901031664, u64=140133798998256}}) = 0
3824  05:37:14.300742 epoll_wait(8,     #epoll_wait表示等待連接訪問,因此后面的輸出都是和前一次訪問有關的,下面我們仔細看一下日志輸出。

我們先將test.txt文件的內容清空,然后模擬去訪問nginx

[root@localhost tmp]# cat test.txt 
{{EPOLLIN, {u32=1901031440, u64=140133798998032}}}, 512, 4294967295) = 1
3824  05:57:59.271342 accept4(6, {sa_family=AF_INET, sin_port=htons(64469), sin_addr=inet_addr("192.168.0.254")}, [16], SOCK_NONBLOCK) = 3
3824  05:57:59.271383 epoll_ctl(8, EPOLL_CTL_ADD, 3, {EPOLLIN|EPOLLET|0x2000, {u32=1901031888, u64=140133798998480}}) = 0
3824  05:57:59.271401 epoll_wait(8, {{EPOLLIN, {u32=1901031888, u64=140133798998480}}}, 512, 60000) = 1
3824  05:57:59.271423 recvfrom(3, "GET / HTTP/1.1\r\nHost: 192.168.0."..., 1024, 0, NULL, NULL) = 308        #recvfrom接收到get請求
3824  05:57:59.271483 stat("/usr/local/nginx/html/www/index.html", 0x7fff69246350) = -1 ENOENT (No such file or directory)     #查看index.html文件不存在
3824  05:57:59.271506 stat("/usr/local/nginx/html/www", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
3824  05:57:59.271525 stat("/usr/local/nginx/html/www/index.htm", 0x7fff69246350) = -1 ENOENT (No such file or directory)     #查看index.htm文件不存在
#下面向用戶返回403錯誤,並寫入錯誤日志
3824  05:57:59.271546 write(5, "2018/01/14 05:57:59 [error] 3824"..., 200) = 200
3824  05:57:59.271587 writev(3, [{"HTTP/1.1 403 Forbidden\r\nServer: "..., 155}, {"<html>\r\n<head><title>403 Forbidd"..., 116}, {"<hr><center>nginx/1.10.2</center"..., 53}], 3) = 324
3824  05:57:59.271674 write(4, "192.168.0.254 - - [14/Jan/2018:0"..., 151) = 151
3824  05:57:59.271693 setsockopt(3, SOL_TCP, TCP_NODELAY, [1], 4) = 0
3824  05:57:59.271708 recvfrom(3, 0x1f3e190, 1024, 0, 0, 0) = -1 EAGAIN (Resource temporarily unavailable)
3824  05:57:59.271722 epoll_wait(8, 
#從上面的日志輸出中,我們可以得知是因為2個文件不存在導致的403錯誤,因此我們檢查配置文件就很容易發現問題。
    server {
        listen       80;
        server_name  www.yunjisuan.com;
        location / {
            root   html/www;
            index  index.html index.htm;        #這里缺少了設置首頁文件
        }
    }

(2)只跟蹤與文件操作有關的系統調用

如果命令結果的輸出實在太多了,很容易看花眼,因此可以使用過濾器,過濾掉無關的信息,比如只查看文件操作信息。

[root@localhost tmp]# strace -tt -f -e trace=file -o /tmp/test.txt /usr/local/nginx/sbin/nginx
[root@localhost tmp]# cat test.txt 
3860  06:28:42.306924 stat("/usr/local/nginx/html/www/index.html", 0x7fff3ce39670) = -1 ENOENT (No such file or directory)
3860  06:28:42.306973 stat("/usr/local/nginx/html/www", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
3860  06:28:42.306994 stat("/usr/local/nginx/html/www/index.htm", 0x7fff3ce39670) = -1 ENOENT (No such file or directory)

(3)通過pid跟蹤進程

[root@localhost tmp]# /usr/local/nginx/sbin/nginx   #啟動nginx服務
[root@localhost tmp]# pgrep nginx -l
3873 nginx  #nginx的master進程
3874 nginx  #nginx的worker進程
[root@localhost tmp]# strace -tt -f -e trace=file -p 3874   #使用-p參數,只跟蹤worker進程,結果更加精簡
Process 3874 attached - interrupt to quit
06:49:38.629248 stat("/usr/local/nginx/html/www/index.html", 0x7fffbd4e7fc0) = -1 ENOENT (No such file or directory)
06:49:38.629329 stat("/usr/local/nginx/html/www", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
06:49:38.629353 stat("/usr/local/nginx/html/www/index.htm", 0x7fffbd4e7fc0) = -1 ENOENT (No such file or directory)

(4)跟蹤系統調用統計

strace不僅能夠追蹤系統調用,使用選項-c還能對進程所有的系統調用做一個統計分析

[root@localhost tmp]# strace -c /usr/local/nginx/sbin/nginx     #使用-c參數為進程所有的系統調用做一個統計分析
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
100.00    0.000047          47         1           clone
  0.00    0.000000           0        29           read
  0.00    0.000000           0        31           open
  0.00    0.000000           0        33           close
  0.00    0.000000           0         6           stat
  0.00    0.000000           0        28           fstat
  0.00    0.000000           0         1           lseek
  0.00    0.000000           0        61           mmap
  0.00    0.000000           0        36           mprotect
  0.00    0.000000           0         7           munmap
  0.00    0.000000           0         6           brk
  0.00    0.000000           0        14           rt_sigaction
  0.00    0.000000           0         1           rt_sigprocmask
  0.00    0.000000           0         1           ioctl
  0.00    0.000000           0         2           pread
  0.00    0.000000           0         2         2 access
  0.00    0.000000           0         5           socket
  0.00    0.000000           0         4         4 connect
  0.00    0.000000           0         1           bind
  0.00    0.000000           0         2           listen
  0.00    0.000000           0         1           setsockopt
  0.00    0.000000           0         1           execve
  0.00    0.000000           0         2           uname
  0.00    0.000000           0         3           fcntl
  0.00    0.000000           0         5         5 mkdir
  0.00    0.000000           0         3           getrlimit
  0.00    0.000000           0         1           geteuid
  0.00    0.000000           0         1           statfs
  0.00    0.000000           0         1           arch_prctl
  0.00    0.000000           0         2         1 futex
  0.00    0.000000           0         1           epoll_create
  0.00    0.000000           0         1           set_tid_address
  0.00    0.000000           0         1           set_robust_list
------ ----------- ----------- --------- --------- ----------------
100.00    0.000047                   294        12 total

上面的結果將清楚地告訴我們調用了哪些系統函數,調用的次數是多少,消耗了多少時間等信息,這對我們分析程序來說是非常有用的。

(5)重定向輸出

[root@localhost tmp]# strace -c -o /tmp/test.txt /usr/local/nginx/sbin/nginx #-o選項將strace的結果輸出到文件中
[root@localhost tmp]# cat test.txt 
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
  -nan    0.000000           0        29           read
  -nan    0.000000           0        31           open
  -nan    0.000000           0        33           close
  -nan    0.000000           0         6           stat

(6)對系統調用進行計時

[root@localhost tmp]# /usr/local/nginx/sbin/nginx -s stop
[root@localhost tmp]# strace -T /usr/local/nginx/sbin/nginx #使用-T將每個系統調用所花費的時間打印出來,每個調用的時間花銷在調用行最右邊的尖括號里
execve("/usr/local/nginx/sbin/nginx", ["/usr/local/nginx/sbin/nginx"], [/* 24 vars */]) = 0 <0.000075>
brk(0)                                  = 0x1055000 <0.000003>
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbbf84f6000 <0.000004>
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory) <0.000005>
open("/etc/ld.so.cache", O_RDONLY)      = 3 <0.000004>
fstat(3, {st_mode=S_IFREG|0644, st_size=15441, ...}) = 0 <0.000003>
mmap(NULL, 15441, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fbbf84f2000 <0.000003>
close(3)                                = 0 <0.000003>
open("/lib64/libdl.so.2", O_RDONLY)     = 3 <0.000005>
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\340\r\0\0\0\0\0\0"..., 832) = 832 <0.000003>
fstat(3, {st_mode=S_IFREG|0755, st_size=19536, ...}) = 0 <0.000003>
mmap(NULL, 2109696, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fbbf80d4000 <0.000004>
mprotect(0x7fbbf80d6000, 2097152, PROT_NONE) = 0 <0.000004>
......

1.7.3 小結

strace命令很適合處理程序僵屍、命令執行報錯等問題。如果從程序日志和系統日志中看不出問題出現的原因,則可以strace一下,也許會有答案,不過也需要使用者有足夠的耐心去查看輸出。

1.8 ltrace :跟蹤進程調用庫函數

1.8.1 命令解釋

功能說明:

ltrace能夠跟蹤進程的庫函數調用,它會顯現出調用了哪個庫函數,而strace則是跟蹤進程的每個系統調用

選項說明:

參數選項 解釋說明(帶@為重點)
-c 統計庫函數每次調用的時間,最后程序退出時打印摘要
-C 解碼低級別名稱(內核級)為用戶級名稱
-d 打印調試信息
-e expr 輸出過濾器,通過表達式,可以過濾掉你不想要的輸出@
-e printf 表示只查看printf函數調用
-f 跟蹤子進程
-o filename 將ltrace的輸出寫入文件filename
-p pid 指定要跟蹤的進程pid@
-r 輸出每一個調用的相對時間
-S 顯示系統調用
-t 在輸出中每一行前加上時間信息。例如 16:45:28
-tt 在輸出中每一行前加上時間信息。例如 11:18:59.759546
-ttt 在輸出中每一行前加上時間信息,精確到微妙,而且時間表示為UNIX時間戳。
-T 顯示每次調用所花費時間
-u username 以username的UID和GID執行所跟蹤的命令

1.8.2 使用范例

(1)ltrace使用

ltrace的用法與strace非常相似,選項功能也是類似,下面簡單看一下ltrace命令的執行結果

[root@localhost tmp]# ltrace /usr/local/nginx/sbin/nginx    #ltrace后面直接接上要檢測的命令語句
memcpy(0x1d5b7b0, "www.yunjisuan.com", 17)                              = 0x1d5b7b0
memcpy(0x1d5b7c1, "/usr/local/nginx/", 17)                              = 0x1d5b7c1
malloc(2048)                                                            = 0x1d55530
memset(0x1d55530, '\000', 68)                                           = 0x1d55530
memset(0x1d55530, '\000', 70)                                           = 0x1d55530
memset(0x1d55530, '\000', 72)                                           = 0x1d55530
memset(0x1d55530, '\000', 74)                                           = 0x1d55530
memset(0x1d55530, '\000', 76)                                           = 0x1d55530
memset(0x1d55530, '\000', 78)                                           = 0x1d55530
memset(0x1d55530, '\000', 80)                                           = 0x1d55530
memset(0x1d55530, '\000', 82)                                           = 0x1d55530
memset(0x1d55530, '\000', 84)                                           = 0x1d55530
memset(0x1d55530, '\000', 86)                                           = 0x1d55530
......
sigemptyset(0x7fffb75519f8)                                             = 0
sigaction(17, 0x7fffb75519f0, NULL)                                     = 0
sigemptyset(0x7fffb75519f8)                                             = 0
sigaction(31, 0x7fffb75519f0, NULL)                                     = 0
sigemptyset(0x7fffb75519f8)                                             = 0
sigaction(13, 0x7fffb75519f0, NULL)                                     = 0
fork()                                                                  = 3962
[pid 3961] exit(0 <unfinished ...>
[pid 3961] +++ exited (status 0) +++

(2)通過pid跟蹤進程調用庫函數

[root@localhost tmp]# pgrep -l nginx
3967 nginx
3968 nginx          #nginx的worker進程的pid號
[root@localhost tmp]# ltrace -p 3968        使用-p指定進程號
__errno_location()                                                      = 0x7f0a392e1768
gettimeofday(0x7fff8f684cd0, NULL)                                      = 0
memcpy(0x6b281f, "14", 2)                                               = 0x6b281f
memcpy(0x6b2826, "2018", 4)                                             = 0x6b2826
memcpy(0x6b282b, "12", 2)                                               = 0x6b282b
memcpy(0x6b282e, "28", 2)                                               = 0x6b282e
memcpy(0x6b2831, "30", 2)                                               = 0x6b2831
localtime_r(0x7fff8f684c88, 0x7fff8f684d20, 0x48400a, 12339, 0x7fff8f684b52) = 0x7fff8f684d20
memcpy(0x6b22fc, "2018", 4)                                             = 0x6b22fc
memcpy(0x6b2302, "1", 1)                                                = 0x6b2302
memcpy(0x6b2304, "14", 2)                                               = 0x6b2304
memcpy(0x6b2308, "7", 1)                                                = 0x6b2308
memcpy(0x6b230a, "28", 2)                                               = 0x6b230a
memcpy(0x6b230d, "30", 2)                                               = 0x6b230d
memcpy(0x6b2f91, "14", 2)                                               = 0x6b2f91
memcpy(0x6b2f98, "2018", 4)                                             = 0x6b2f98
memcpy(0x6b2f9e, "7", 1)                                                = 0x6b2f9e
memcpy(0x6b2fa0, "28", 2)                                               = 0x6b2fa0
memcpy(0x6b2fa3, "30", 2)                                               = 0x6b2fa3
memcpy(0x6b2fa8, "5", 1)                                                = 0x6b2fa8
memcpy(0x6b2faa, "0", 1)                                                = 0x6b2faa
memcpy(0x6b364e, "2018", 4)                                             = 0x6b364e
memcpy(0x6b3654, "1", 1)                                                = 0x6b3654
memcpy(0x6b3656, "14", 2)                                               = 0x6b3656
memcpy(0x6b365a, "7", 1)                                                = 0x6b365a
memcpy(0x6b365c, "28", 2)                                               = 0x6b365c
memcpy(0x6b365f, "30", 2)                                               = 0x6b365f
memcpy(0x6b3663, "5", 1)                                                = 0x6b3663
memcpy(0x6b3666, "0", 1)                                                = 0x6b3666
memcpy(0x6b3cb4, "14", 2)                                               = 0x6b3cb4
memcpy(0x6b3cb8, "7", 1)                                                = 0x6b3cb8
memcpy(0x6b3cba, "28", 2)                                               = 0x6b3cba
memcpy(0x6b3cbd, "30", 2)                                               = 0x6b3cbd
epoll_wait(8, 0x2639990, 512, 0xffffffff, 0x7fff8f684b52

二,Linux核心網絡管理命令

2.1 ip:網絡配置工具

2.1.1 命令解釋

功能說明:

ip命令是iproute軟件包中的一個強大的網絡配置工具,用於顯示或管理Linux系統的路由,網絡設備,策略路由和隧道

選項說明:

參數選項 解釋說明(帶@的為重點)
-s 輸出更詳細的信息,為了相似更詳細的信息,可重復使用此選項
-r 顯示主機時,不使用IP地址,而是使用主機的域名
網絡對象 指定要管理的網絡對象(link:網絡設備 address:IP地址 addrlabel:協議地址標簽管理 route:路由表 rule:策略路由表 runnel:IP隧道 )
help ip help:查看ip命令的幫助 ip【object】help:查看指定的網絡對象的幫助
操作命令 對指定的網絡對象完成的具體操作。通常,每一個具體操作的命令后面又有一組相關的命令選項。不同的操作對象所支持的操作命令也不同。下面按照操作的網絡對象給出所支持的常見操作命令
link對象支持的操作命令:set(修改設備屬性),show(顯示設備屬性)
address對象支持的操作命令:add(添加協議地址),del(刪除協議地址),flush(清除協議地址),show(查看協議地址)
addrlabel對象支持的操作命令:add,del,list,flush
route對象支持的操作命令:add,change,replace,delete,show,flush,get
rule對象支持的操作命令:add,delete,flush,show
tunnel對象支持的操作命令:add,change,delete,prl,show

2.1.2 使用范例

(1)顯示網絡設備屬性

[root@Mr_chen ~]# ip link show eth0 #顯示eth1網卡屬性
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:a8:ca:50 brd ff:ff:ff:ff:ff:ff
[root@Mr_chen ~]# ip -s link show eth0  #顯示詳細屬性
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:a8:ca:50 brd ff:ff:ff:ff:ff:ff
    RX: bytes  packets  errors  dropped overrun mcast   #顯示每個網絡設備上數據包的統計信息
    37242      432      0       0       0       0      
    TX: bytes  packets  errors  dropped carrier collsns 
    22769      178      0       0       0       0      
[root@Mr_chen ~]# ip -s -s link show eth0   #使用兩個-s顯示更詳細屬性
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:a8:ca:50 brd ff:ff:ff:ff:ff:ff
    RX: bytes  packets  errors  dropped overrun mcast   
    44464      523      0       0       0       0      
    RX errors: length  crc     frame   fifo    missed
               0        0       0       0       0      
    TX: bytes  packets  errors  dropped carrier collsns 
    26699      209      0       0       0       0      
    TX errors: aborted fifo    window  heartbeat
               0        0       0       0      

(2)關閉和激活網絡設備

[root@Mr_chen ~]# ip link show eth1
3: eth1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000
    link/ether 00:0c:29:a8:ca:5a brd ff:ff:ff:ff:ff:ff
[root@Mr_chen ~]# ip link set eth1 up   #激活eth1網卡
[root@Mr_chen ~]# ip link show dev eth1
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:a8:ca:5a brd ff:ff:ff:ff:ff:ff
[root@Mr_chen ~]# ip link set eth1 down #關閉eth1網卡
[root@Mr_chen ~]# ip link show eth1
3: eth1: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast state DOWN qlen 1000
    link/ether 00:0c:29:a8:ca:5a brd ff:ff:ff:ff:ff:ff

(3)修改網卡MAC地址

[root@Mr_chen ~]# ip link show eth1 
3: eth1: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast state DOWN qlen 1000
    link/ether 00:0c:29:a8:ca:5a brd ff:ff:ff:ff:ff:ff
[root@Mr_chen ~]# ip link set eth1 address 0:0c:29:a8:ca:5f #修改MAC地址
[root@Mr_chen ~]# ip link show eth1
3: eth1: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast state DOWN qlen 1000
    link/ether 00:0c:29:a8:ca:5f brd ff:ff:ff:ff:ff:ff

(4)查看網卡信息

[root@Mr_chen ~]# ip a  #效果與ip address一樣,顯示的結果包括激活和未激活的網卡
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:a8:ca:50 brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.100/24 brd 192.168.0.255 scope global eth0
    inet6 fe80::20c:29ff:fea8:ca50/64 scope link 
       valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast state DOWN qlen 1000
    link/ether 00:0c:29:a8:ca:5f brd ff:ff:ff:ff:ff:ff
[root@Mr_chen ~]# ip link   #和ip a對比,少了具體的IP地址信息
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:a8:ca:50 brd ff:ff:ff:ff:ff:ff
3: eth1: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast state DOWN qlen 1000
    link/ether 00:0c:29:a8:ca:5f brd ff:ff:ff:ff:ff:ff

(5)添加或刪除IP地址

root@Mr_chen ~]# ip a show eth1 #顯示eth1的IP地址,沒有配置
3: eth1: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast state DOWN qlen 1000
    link/ether 00:0c:29:a8:ca:5f brd ff:ff:ff:ff:ff:ff
[root@Mr_chen ~]# ip a add 192.168.0.222/24 dev eth1    #添加一個IP地址
[root@Mr_chen ~]# ip a show eth1    #雖然顯示出了IP地址,但是網卡狀態還是down
3: eth1: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast state DOWN qlen 1000
    link/ether 00:0c:29:a8:ca:5f brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.222/24 scope global eth1
[root@Mr_chen ~]# ip link set eth1 up   #激活網卡
[root@Mr_chen ~]# ip a show eth1    #現在eth1網卡正常運行
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:a8:ca:5f brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.222/24 scope global eth1
    inet6 fe80::20c:29ff:fea8:ca5f/64 scope link 
       valid_lft forever preferred_lft forever
[root@Mr_chen ~]# ip a add 192.168.0.223/24 dev eth1    #可添加多個IP,這種IP稱為輔助IP
[root@Mr_chen ~]# ip a show eth1
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:a8:ca:5f brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.222/24 scope global eth1
    inet 192.168.0.223/24 scope global secondary eth1
    inet6 fe80::20c:29ff:fea8:ca5f/64 scope link 
       valid_lft forever preferred_lft forever
[root@Mr_chen ~]# ip a del 192.168.0.222/24 dev eth1    #刪除主IP也就是第一個IP地址
[root@Mr_chen ~]# ip a show eth1    #所有IP都沒有了
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:a8:ca:5f brd ff:ff:ff:ff:ff:ff
    inet6 fe80::20c:29ff:fea8:ca5f/64 scope link 
       valid_lft forever preferred_lft forever
[root@Mr_chen ~]# ip a add 192.168.0.222/24 dev eth1    #添加兩個IP地址
[root@Mr_chen ~]# ip a add 192.168.0.223/24 dev eth1
[root@Mr_chen ~]# ip a del 192.168.0.223/24 dev eth1    #刪除輔助IP
[root@Mr_chen ~]# ip a show eth1
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:a8:ca:5f brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.222/24 scope global eth1     #主IP仍舊被保留了
    inet6 fe80::20c:29ff:fea8:ca5f/64 scope link 
       valid_lft forever preferred_lft forever

小結:

  • [x] :刪除網卡的主IP地址,同時會刪除該網卡的所有IP地址
  • [x] :刪除網卡的輔助IP地址,不會影響該網卡的其他IP地址。

思考
我們該如何用ip命令創建網卡的別名IP呢?

[root@Mr_chen ~]# ip a add 192.168.0.225/24 dev eth1 label eth1:1   #使用label選項創建別名IP
[root@Mr_chen ~]# ip a show eth1
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:a8:ca:5f brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.222/24 scope global eth1 #eth1網卡的主IP
    inet 192.168.0.223/24 scope global secondary eth1   #eth1網卡的輔助IP
    inet 192.168.0.225/24 scope global secondary eth1:1 #eth1網卡的別名IP
    inet6 fe80::20c:29ff:fea8:ca5f/64 scope link 
       valid_lft forever preferred_lft forever

知識擴展:
我們利用ifconfig命令只能查看到網卡的別名IP而看不到它的輔助IP

[root@Mr_chen ~]# ip a show eth1
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:a8:ca:5f brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.222/24 scope global eth1
    inet 192.168.0.223/24 scope global secondary eth1   #輔助IP
    inet 192.168.0.225/24 scope global secondary eth1:1 #別名IP
    inet6 fe80::20c:29ff:fea8:ca5f/64 scope link 
       valid_lft forever preferred_lft forever
[root@Mr_chen ~]# ifconfig
eth0      Link encap:Ethernet  HWaddr 00:0C:29:A8:CA:50  
          inet addr:192.168.0.100  Bcast:192.168.0.255  Mask:255.255.255.0
          inet6 addr: fe80::20c:29ff:fea8:ca50/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:5857 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1019 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:420049 (410.2 KiB)  TX bytes:119175 (116.3 KiB)

eth1      Link encap:Ethernet  HWaddr 00:0C:29:A8:CA:5F  
          inet addr:192.168.0.222  Bcast:0.0.0.0  Mask:255.255.255.0
          inet6 addr: fe80::20c:29ff:fea8:ca5f/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:32 errors:0 dropped:0 overruns:0 frame:0
          TX packets:12 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:4212 (4.1 KiB)  TX bytes:936 (936.0 b)

eth1:1    Link encap:Ethernet  HWaddr 00:0C:29:A8:CA:5F     #別名IP
          inet addr:192.168.0.225  Bcast:0.0.0.0  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)

(6)查看路由表

[root@Mr_chen ~]# ip route
192.168.0.0/24 dev eth0  proto kernel  scope link  src 192.168.0.100 
192.168.0.0/24 dev eth1  proto kernel  scope link  src 192.168.0.222 
169.254.0.0/16 dev eth0  scope link  metric 1002 
default via 192.168.0.1 dev eth0 
[root@Mr_chen ~]# ip route | column -t  #使用column命令格式化,選項-t,默認根據空格分隔判斷輸入行的列數來創建一個表
192.168.0.0/24  dev  eth0         proto  kernel  scope   link  src  192.168.0.100
192.168.0.0/24  dev  eth1         proto  kernel  scope   link  src  192.168.0.222
169.254.0.0/16  dev  eth0         scope  link    metric  1002
default         via  192.168.0.1  dev    eth0
[root@Mr_chen ~]# route -n  #與我們前面學習過的route命令對比一下
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.0.0     0.0.0.0         255.255.255.0   U     0      0        0 eth0
192.168.0.0     0.0.0.0         255.255.255.0   U     0      0        0 eth1
169.254.0.0     0.0.0.0         255.255.0.0     U     1002   0        0 eth0
0.0.0.0         192.168.0.1     0.0.0.0         UG    0      0        0 eth0

(7)添加或刪除路由表

[root@Mr_chen ~]# ip route add 192.168.1.0/24 via 192.168.0.254 dev eth1    #添加靜態路由
[root@Mr_chen ~]# ip route | column -t
192.168.1.0/24  via  192.168.0.254  dev    eth1
192.168.0.0/24  dev  eth0           proto  kernel  scope   link  src  192.168.0.100
192.168.0.0/24  dev  eth1           proto  kernel  scope   link  src  192.168.0.222
169.254.0.0/16  dev  eth0           scope  link    metric  1002
default         via  192.168.0.1    dev    eth0
[root@Mr_chen ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.1.0     192.168.0.254   255.255.255.0   UG    0      0        0 eth1
192.168.0.0     0.0.0.0         255.255.255.0   U     0      0        0 eth0
192.168.0.0     0.0.0.0         255.255.255.0   U     0      0        0 eth1
169.254.0.0     0.0.0.0         255.255.0.0     U     1002   0        0 eth0
0.0.0.0         192.168.0.1     0.0.0.0         UG    0      0        0 eth0
[root@Mr_chen ~]# ip route del 192.168.1.0/24   #刪除靜態路由
[root@Mr_chen ~]# ip route | column -t
192.168.0.0/24  dev  eth0         proto  kernel  scope   link  src  192.168.0.100
192.168.0.0/24  dev  eth1         proto  kernel  scope   link  src  192.168.0.222
169.254.0.0/16  dev  eth0         scope  link    metric  1002
default         via  192.168.0.1  dev    eth0

2.2 netstat:查看網絡狀態

2.2.1 命令詳解

功能說明:

netstat命令用於顯示本機網絡的連接狀態,運行端口和路由表等信息。

選項說明:

參數選項 解釋說明(帶@的為重點)
-r 顯示路由表信息,該功能類似與前面學過的route和ip route
-g 顯示多播功能群組成員,該功能類似於前面學過的ip maddr
-i 顯示網絡接口信息,該功能類似於前面學過的ip -s link
-s 顯示各類協議的統計信息
-n 顯示數字形式的地址而不是去解析主機,端口或用戶名。默認情況下,netstat命令會嘗試解析並顯示主機的主機名,這個過程通常比較長也是非必需的@
-a 顯示處於監聽狀態和非監聽狀態的socket信息@
-A 顯示指定網絡類型的網絡連接狀態
-c<秒數> 后面跟的秒數表示每隔幾秒就刷新顯示一次@
-l 僅顯示連接狀態為“LISTEN”的服務的網絡狀態
-t 顯示所有的TCP連接情況@
-u 顯示所有的UDP連接情況@
-p 顯示socket所屬進程的PID和名稱@

2.2.2 使用范例

基礎范例

(1)常用選項組合一

[root@localhost ~]# netstat -an
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address               Foreign Address             State      
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      
tcp        0     64 192.168.0.233:22            192.168.0.253:54737         ESTABLISHED 
tcp        0      0 :::22                       :::*                        LISTEN      
Active UNIX domain sockets (servers and established)
Proto RefCnt Flags       Type       State         I-Node Path
unix  2      [ ACC ]     STREAM     LISTENING     7510   @/com/ubuntu/upstart
unix  2      [ ]         DGRAM                    7857   @/org/kernel/udev/udevd
unix  4      [ ]         DGRAM                    8910   /dev/log
unix  2      [ ]         DGRAM                    9187   
unix  2      [ ]         DGRAM                    8976   
unix  3      [ ]         DGRAM                    7874   
unix  3      [ ]         DGRAM                    7873   

第一行活動網絡連接說明:

列數 名稱 含義
第一列 Proto socket使用的協議(TCP,UDP,RAW)
第二列 Recv-Q 接收到但是還未處理的字節數
第三列 Send-Q 已經發送但是未被遠程主機確認收到的字節數
第四列 Local Address 本地主機地址和端口
第五列 Foreign Address 遠程主機地址和端口
第六列 State socket的狀態,通常僅僅有TCP的狀態,狀態值可能有ESTABLISHED,SYN_SENT,SYN_RECV,FIN_WAIT1,FIN_WAIT2,TIME_WAIT等

第6列State狀態信息詳解

狀態 含義
ESTABLISHED socket已經建立連接,表示處於連接的狀態,一般認為有一個ESTABLISHED是一個服務的並發連接。該連接狀態在生產場景中很重要,需要重點關注
SYN_SENT socket正在積極嘗試建立一個連接,即處於發送后連接前的一個等待但未匹配進入連接的狀態
SYN_RECV 已經從網絡上收到一個連接請求
FIN_WAIT1 socket已關閉,連接正在或正要關閉
FIN_WAIT2 連接已關閉,並且socket正在等待遠端結束
TIME_WAIT socket正在等待關閉處理仍在網絡上的數據包,這個連接狀態在生產場景中很重要,需要重點關注
CLOSED socket不再被占用了
CLOSE_WAIT 遠端已經結束,等待socket關閉
LAST_ACK 遠端已經結束,並且socket也已經關閉,等待acknowledgement
LISTEN socket正在監聽連接請求
CLOSING socket關閉,但是我們仍舊沒有發送數據
UNKNOWN socket狀態未知

(2)常用選項組合二

[root@localhost ~]# netstat -lntup
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name   
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      879/sshd            
tcp        0     64 192.168.0.233:22            192.168.0.253:54737         ESTABLISHED 923/sshd            
tcp        0      0 :::22                       :::*                        LISTEN      879/sshd 

以上命令語句的作用為顯示所有TCP和UDP正在監聽的連接信息

  • [x] -l : 顯示所有LISTEN狀態的網絡連接
  • [x] -n : 顯示IP地址,不進行DNS解析成主機名,域名
  • [x] -t : 顯示所有TCP連接
  • [x] -u : 顯示所有UDP連接
  • [x] -p : 顯示進程號和進程名

(3)顯示當前系統的路由表

[root@localhost ~]# netstat -rn #使用-r顯示路由表信息,-n不進行DNS解析,加快命令執行速度
Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
192.168.0.0     0.0.0.0         255.255.255.0   U         0 0          0 eth0
169.254.0.0     0.0.0.0         255.255.0.0     U         0 0          0 eth0
0.0.0.0         192.168.0.1     0.0.0.0         UG        0 0          0 eth0

提示:該命令相當於route -n

(4)選項-i顯示網絡的接口狀況

[root@localhost ~]# netstat -i
Kernel Interface table
Iface       MTU Met    RX-OK RX-ERR RX-DRP RX-OVR    TX-OK TX-ERR TX-DRP TX-OVR Flg
eth0       1500   0     4103      0      0      0      403      0      0      0 BMRU
lo        16436   0        0      0      0      0        0      0      0      0 LRU

以下是命令結果解釋

  • [x] Iface : 表示網絡設備的接口名稱
  • [x] MTU : 表示最大傳輸單元,單位為字節
  • [x] RX-OK/TX-OK : 表示已經准確無誤地接收/發送了多少數據包
  • [x] RX-ERR/TX-ERR : 表示接收/發送數據包時產生了多少錯誤
  • [x] RX-DRP/TX-DRP : 表示接收/發送數據包時丟棄了多少數據包
  • [x] RX-OVR/TX-OVR : 表示由於誤差而遺失了多少數據包。
  • [x] Flg : 表示接口標記,其中各標記含義具體如下。
    • L : 表示該接口是個回環設備。
    • B : 表示設置了廣播地址。
    • M : 表示接收所有數據包。
    • R : 表示接口正在運行。
    • U : 表示接口處於活動狀態。
    • O : 表示在該接口上禁用arp。
    • P : 表示一個點到點的連接

正常情況下,RX-ERR/TX-ERR,RX-DRP/TX-DRP和RX-OVR/TX-OVR的值都應該為0,如果這幾個選項的值不為0,並且很大,那么網絡質量肯定有問題,網絡傳輸性能也一定會下降。

生產案例

(5)統計各個狀態的網絡連接個數

[root@Mr_chen ~]# 
TIME_WAIT 6163
FIN_WAIT1 42
FIN_WAIT2 

netstat -n | awk '/^tcp/{Mr_chen[$NF]++}END{for(i in Mr_chen)print i,Mr_chen[i]}'

1056
ESTABLISHED 4542
SYN_RECV 53
LAST_ACK 30

2.3 ss : 查看網絡狀態

2.3.1 命令詳解

功能說明:

  • ss命令是類似並將取代netstat的工具,它能用來查看網絡狀態信息,包括TCP,UDP連接,端口等。它的優點是能夠顯示更多更詳細的有關網絡連接狀態的信息,而且比netstat更快速更高效。
  • 如果系統沒有ss命令,那就需要安裝一下,ss命令屬於iproute包,因此安裝命令是yum -y install iproute

選項說明:

參數選項 解釋說明(帶@的為重點) 參數選項 解釋說明(帶@的為重點)
-n 顯示IP地址,不進行DNS解析@ -s 顯示socket使用統計
-r 嘗試解析數字IP地址和端口 -4 僅顯示IPV4的socket
-a 顯示所有socket連接@ -6 僅顯示IPv6的socket
-l 顯示所有監聽socket@ -0 僅顯示PACKET的socket
-o 顯示計時器信息 -t 僅顯示TCP的socket@
-e 顯示詳細的socket信息 -u 僅顯示UDP的socket@
-m 顯示socket的內存使用情況 -d 僅顯示DCCP的socket
-p 顯示使用socket的進程@ -w 僅顯示RAW的socket
-i 顯示TCP內部信息 -x 僅顯示Unix的socket

2.3.2 使用范例

(1)常用選項組合一

[root@Mr_chen ~]# ss -an    #顯示所有的socket連接
State       Recv-Q Send-Q                        Local Address:Port                          Peer Address:Port 
LISTEN      0      128                                      :::22                                      :::*     
LISTEN      0      128                                       *:22                                       *:*     
ESTAB       0      64                            192.168.0.233:22                           192.168.0.253:50985 
[root@Mr_chen ~]# ss -an | column -t    #上面的輸出寫在文檔中會有點亂,下面用column格式化一下。
State   Recv-Q  Send-Q  Local             Address:Port         Peer  Address:Port
LISTEN  0       128     :::22             :::*
LISTEN  0       128     *:22              *:*
ESTAB   0       64      192.168.0.233:22  192.168.0.253:50985

(2)常用選項組合二

[root@Mr_chen ~]# ss -lntup | column -t #顯示所有正在監聽的TCP和UDP連接
Netid  State   Recv-Q  Send-Q  Local  Address:Port  Peer                    Address:Port
tcp    LISTEN  0       128     :::22  :::*          users:(("sshd",879,4))
tcp    LISTEN  0       128     *:22   *:*           users:(("sshd",879,3))

(3)顯示socket統計

[root@Mr_chen ~]# ss -s #統計當前的established,closed,orphaned和waiting的TCP socket數量
Total: 282 (kernel 285)
TCP:   3 (estab 1, closed 0, orphaned 0, synrecv 0, timewait 0/0), ports 1

Transport Total     IP        IPv6
*	  285       -         -        
RAW	  0         0         0        
UDP	  0         0         0        
TCP	  3         2         1        
INET	  3         2         1        
FRAG	  0         0         0     

當服務器產生大量的socket連接時,通常會使用該命令來做宏觀數據統計;ss的大部分參數應用和netstat很像。

2.4 ping : 測試主機之間的網絡連通性

2.4.1 命令詳解

功能說明:

ping命令可用於測試主機之間網絡的連通性。執行ping命令會使用ICMP傳輸協議,發出要求回應的信息,若遠端主機的網絡功能沒有問題,就會回應該信息,因而可得知該主機運作正常。

選項說明:

參數選項 解釋說明(帶@的為重點)
-c <次數> 指定發送ICMP報文的次數。否則,ping命令將一直發送報文@
-i <時間間隔> 相鄰兩次發送報文的時間間隔,默認時間間隔1s@
-n 不查詢主機名,直接顯示其IP地址
-q 只顯示命令開始時的信息和運行結束的統計信息。忽略命令運行過程中的輸出信息
-s <數據包大小> 設置發送數據包的大小,默認大小為56字節,再加上8字節的ICMP頭,一共是64字節的ICMP包
-t <生存期> 設置發送的數據包其生存期(TTL)的值
-w 截止時間 超過截止時間,立即退出ping程序
-W 超時時間 等待響應的超時時間

2.4.2 使用范例

(1)測試到目標主機的網絡連通性

[root@localhost ~]# ping www.baidu.com  #ping命令直接接域名或IP,會一直顯示ping結果
PING www.a.shifen.com (61.135.169.121) 56(84) bytes of data.
#顯示ping的域名及其IP地址,發送的是56字節的數據
64 bytes from 61.135.169.121: icmp_seq=1 ttl=57 time=10.1 ms
#從目標主機收到的數據是64字節,icmp_seq是收到包的序列號,ttl是數據包的生存期,time是延遲。
64 bytes from 61.135.169.121: icmp_seq=2 ttl=57 time=46.4 ms
64 bytes from 61.135.169.121: icmp_seq=3 ttl=57 time=62.5 ms
^C  #直到Ctrl+c強制終止
--- www.a.shifen.com ping statistics ---    #這里是ping的統計結果
3 packets transmitted, 3 received, 0% packet loss, time 2632ms  #發了3個包,收到3個,丟失率0%,時間為2632ms
rtt min/avg/max/mdev = 10.175/39.730/62.569/21.911 ms
#rtt是傳輸的時間延遲。min/avg/max/mdev==>最小/平均/最大/算數平均差

擴展知識:

1)ping命令會顯示一個時間作為衡量網絡參數延遲的參數,以判斷源主機與目標主機之間網絡的質量。
2)ping命令的輸出信息中含有TTL值。TTL(Time To Life)稱為生存周期,它是ICMP報文在網絡上的存活時間。不同的操作系統發出的ICMP報文的生存期各不相同,常見的生存期為32,64,128和255等。TTL值反映了ICMP報文所能夠經過的路由器數目,每經過一個路由器,路由器都會將其數據包的生存期減去1,如果TTL值變為0,則路由器將不再轉發此報文。

(2)使用ping參數的不同組合的例子

[root@Mr_chen ~]# ping -c 3 -i 3 -s 1024 -t 255 www.baidu.com
PING www.baidu.com (61.135.169.121) 1024(1052) bytes of data.
1032 bytes from 61.135.169.121: icmp_seq=1 ttl=57 time=5.29 ms
1032 bytes from 61.135.169.121: icmp_seq=2 ttl=57 time=4.79 ms
1032 bytes from 61.135.169.121: icmp_seq=3 ttl=57 time=5.50 ms

--- www.baidu.com ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 6014ms
rtt min/avg/max/mdev = 4.795/5.198/5.507/0.304 ms

以下是命令說明

  • [x] -c 3:發送3次ICMP包
  • [x] -i 3:每次發包時間間隔為3s
  • [x] -s 1024:設置發送的數據包大小為1024字節
  • [x] -t 255:設置發送數據包的ttl值為255

2.5 nmap:網絡探測工具和安全/端口掃描器

2.5.1 命令詳解

功能說明:

nmap命令是一款開放源代碼的網絡探測和安全審核工具,是Network Mapper的縮寫。其設計目標是快速地掃描大型網絡。nmap可以發現網絡上有哪些主機,主機提供了什么服務(應用程序名稱和版本號),並探測操作系統的類型及版本信息。
如果系統沒有nmap命令,則可以使用下面的命令來安裝:
yum -y install nmap

選項說明:

參數選項 解釋說明(帶@的為重點)
-sS TCP同步掃描(TCP SYN)@
-sT TCP連接掃描
-sn 不進行端口掃描,只檢查主機正在運行。該選項與老版本的-sP相同@
-sU 掃描UDP端口
-sV 探測服務版本信息
-Pn 只進行掃描,不ping主機
-PS 使用SYN包對目標主機進行掃描。默認是80端口,也可以指定端口,格式為-PS22或-PS22-25,80,113,1050,35000,記住PS和端口號之間不要有空格
-PU 使用udp ping掃描端口
-O 激活對TCP/IP指紋特征(fingerprinting)的掃描,獲得遠程主機的標志,也就是操作系統類型
-v 顯示掃描過程中的詳細信息@
-S 設置掃描的源IP地址
-g port 設置掃描的源端口
-oN 把掃描的結果重定向到文件中
-iL filename 從文件中讀取掃描的目標
-p <端口> 指定要掃描的端口,可以是一個單獨的端口,也可以用逗號分隔開多個端口,或者使用“-”表示端口范圍@
-n 不進行DNS解析,加快掃描速度@
-exclude 排除指定主機
-excludefile 排除指定文件中的主機

2.5.2 使用范例

(1)查看主機當前開放的端口

[root@Mr_chen ~]# nmap 192.168.0.1  #直接接目標主機,默認會掃描1~1000端口

Starting Nmap 5.51 ( http://nmap.org ) at 2018-02-28 08:23 EST
Nmap scan report for localhost (192.168.0.1)
Host is up (0.014s latency).        #目標主機正在運行
Not shown: 999 closed ports         #999個端口關閉
PORT   STATE SERVICE
80/tcp open  http                   #開放的80端口http服務
MAC Address: CC:B2:55:DF:3C:83 (Unknown)

Nmap done: 1 IP address (1 host up) scanned in 0.37 seconds

(2)掃描主機的指定端口

[root@Mr_chen ~]# nmap -p 1024-65535 192.168.0.1    #-p選項指定掃描范圍

Starting Nmap 5.51 ( http://nmap.org ) at 2018-02-28 08:26 EST
Nmap scan report for localhost (192.168.0.1)
Host is up (0.039s latency).
Not shown: 64511 closed ports
PORT     STATE SERVICE
1780/tcp open  unknown
MAC Address: CC:B2:55:DF:3C:83 (Unknown)

Nmap done: 1 IP address (1 host up) scanned in 17.46 seconds

(3)掃描局域網內所有的IP

[root@Mr_chen ~]# nmap 192.168.0.0/24   #使用網段的格式掃描局域網

Starting Nmap 5.51 ( http://nmap.org ) at 2018-02-28 08:29 EST
Nmap scan report for localhost (192.168.0.1)
Host is up (0.0072s latency).
Not shown: 999 closed ports
PORT   STATE SERVICE
80/tcp open  http
MAC Address: CC:B2:55:DF:3C:83 (Unknown)

Nmap scan report for localhost (192.168.0.129)
Host is up (0.092s latency).
Not shown: 999 closed ports
PORT   STATE SERVICE
80/tcp open  http
MAC Address: F0:FE:6B:69:5B:1E (Unknown)

Nmap scan report for localhost (192.168.0.133)
Host is up (0.33s latency).
All 1000 scanned ports on localhost (192.168.0.133) are closed
MAC Address: BC:3D:85:FE:3F:DA (Unknown)

Nmap scan report for localhost (192.168.0.233)
Host is up (0.0000010s latency).
Not shown: 999 closed ports
PORT   STATE SERVICE
22/tcp open  ssh

Nmap scan report for localhost (192.168.0.254)
Host is up (0.00016s latency).
Not shown: 992 closed ports
PORT      STATE SERVICE
135/tcp   open  msrpc
139/tcp   open  netbios-ssn
443/tcp   open  https
445/tcp   open  microsoft-ds
902/tcp   open  iss-realsecure
912/tcp   open  apex-mesh
5678/tcp  open  rrac
10000/tcp open  snet-sensor-mgmt
MAC Address: 30:B4:9E:74:1B:3B (Unknown)

Nmap done: 256 IP addresses (5 hosts up) scanned in 19.27 seconds

[root@Mr_chen ~]# nmap -sn 192.168.0.0/24   #使用-sn選項不掃描端口

Starting Nmap 5.51 ( http://nmap.org ) at 2018-02-28 08:32 EST
Nmap scan report for localhost (192.168.0.1)
Host is up (0.0027s latency).
MAC Address: CC:B2:55:DF:3C:83 (Unknown)
Nmap scan report for localhost (192.168.0.233)
Host is up.
Nmap scan report for localhost (192.168.0.254)
Host is up (0.000071s latency).
MAC Address: 30:B4:9E:74:1B:3B (Unknown)
Nmap done: 256 IP addresses (3 hosts up) scanned in 2.56 seconds

[root@Mr_chen ~]# nmap -sn 192.168.0.232-234    #使用這種地址范圍進行掃描

Starting Nmap 5.51 ( http://nmap.org ) at 2018-02-28 08:34 EST
Nmap scan report for localhost (192.168.0.233)
Host is up.
Nmap done: 3 IP addresses (1 host up) scanned in 0.81 seconds

(4)探測目標主機的服務和操作系統的版本

[root@Mr_chen ~]# nmap -O -sV 192.168.0.1

Starting Nmap 5.51 ( http://nmap.org ) at 2018-02-28 08:43 EST
Nmap scan report for localhost (192.168.0.1)
Host is up (0.0037s latency).
Not shown: 999 closed ports
PORT   STATE SERVICE VERSION
80/tcp open  http    Linksys wireless-G WAP http config (Name D-Link Wireless N Router DIR-600M)
MAC Address: CC:B2:55:DF:3C:83 (Unknown)
Device type: general purpose
Running: Linux 2.4.X
OS details: Linux 2.4.18 - 2.4.35 (likely embedded)
Network Distance: 1 hop
Service Info: Device: WAP

OS and Service detection performed. Please report any incorrect results at http://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 2.93 seconds

上邊的輸出信息中不僅包含了端口號,而且還包括了服務的版本號。在網絡安全性要求較高的主機上,最好能夠屏蔽服務版本號,以防止黑客利用特定版本的服務漏洞進行攻擊。

2.6 tcpdump:監聽網絡流量

2.6.1 命令詳解

功能說明:

  • tcpdump命令是一個截獲網絡數據包的包分析工具。tcpdump可以將網絡中傳送的數據包的“頭”完全截獲下來以提供分析。它支持針對網絡層,協議,主機,端口等的過濾,並支持與,或,非邏輯語句協助過濾有效信息。
  • tcpdump命令工作時要先把網卡的工作模式切換到混雜模式(promiscuous mode)。因為要修改網絡接口的工作模式,所以tcpdump命令需要以root的身份運行。

選項說明:

參數選項 解釋說明(帶@的為重點)
-A 以ASCII碼的方式顯示每一個數據包(不會顯示數據包中鏈路層的頭部信息)。在抓取包含網頁數據的數據包時,可方便查看數據
-c <數據包數目> 接收到指定的數據包數目后退出命令@
-e 每行的打印輸出中將包含數據包的數據鏈路層頭部信息
-i <網絡接口> 指定要監聽數據包的網絡接口@
-n 不進行DNS解析,加快顯示速度@
-nn 不將協議和端口數字等轉換成名字@
-q 以快速輸出的方式運行,此選項僅顯示數據包的協議概要信息,輸出信息較短@
-s <數據包大小> 設置數據包抓取長度,如果不設置則默認為68字節,設置為0則自動選擇合適的長度來抓取數據包
-t 在每行輸出信息中不顯示時間戳標記
-tt 在每行輸出信息中顯示無格式的時間戳標記
-ttt 顯示當前行與前一行的延遲
-tttt 在每行打印的時間戳之前添加日期
-ttttt 顯示當前行與第一行的延遲
-v 顯示命令執行的詳細信息
-vv 顯示比-v選項更加詳細的信息
-vvv 顯示比-vv選項更加詳細的輸出

2.6.2 使用范例

(1)不加參數運行tcpdump命令監聽網絡

[root@localhost ~]# tcpdump #默認情況下,直接啟動tcpdump將監視第一個網絡接口上所有流過的數據包
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
05:12:45.464963 IP localhost.ssh > localhost.50832: Flags [P.], seq 898292388:898292596, ack 861396487, win 317, length 208
05:12:45.465055 IP localhost.50832 > localhost.ssh: Flags [.], ack 208, win 523, length 0
05:12:45.465215 IP localhost.57595 > localhost.domain: 4104+ PTR? 254.0.168.192.in-addr.arpa. (44)
05:12:45.467851 IP localhost.domain > localhost.57595: 4104 1/0/0 PTR localhost. (67)
05:12:45.467906 IP localhost.57067 > localhost.domain: 107+ PTR? 233.0.168.192.in-addr.arpa. (44)
05:12:45.469444 IP localhost.domain > localhost.57067: 107 1/0/0 PTR localhost. (67)
05:12:45.469504 IP localhost.34192 > localhost.domain: 2703+ PTR? 1.0.168.192.in-addr.arpa. (42)
05:12:45.621206 IP localhost.ssh > localhost.50832: Flags [P.], seq 3120:3280, ack 1, win 317, length 160
05:12:45.621258 IP localhost.50832 > localhost.ssh: Flags [.], ack 3280, win 524, length 0
05:12:45.636742 IP localhost.ssh > localhost.50832: Flags [P.], seq 3280:3536, ack 1, win 317, length 256
05:12:45.643843 IP localhost.50832 > localhost.ssh: Flags [P.], seq 1:65, ack 3536, win 523, length 64
05:12:45.643889 IP localhost.ssh > localhost.50832: Flags [P.], seq 3536:3696, ack 65, win 317, length 160
^C              #tcpdump命令在運行期間可以使用組合Ctrl+C終止程序
29 packets captured     #最后三行就是按CTRL+C后輸出的監聽到的數據包匯總信息
32 packets received by filter
0 packets dropped by kernel

使用tcpdump命令時,如果不輸入過濾規則,則輸出的數據量將會很大。

(2)精簡輸出信息

[root@localhost ~]# tcpdump -q  #默認情況下,tcpdump命令的輸出信息較多,為了顯示精簡的信息,可以使用-q選項
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
05:33:01.438200 IP localhost.ssh > localhost.50832: tcp 208
05:33:01.479036 IP localhost.50832 > localhost.ssh: tcp 0
05:33:01.494539 IP localhost.ssh > localhost.50832: tcp 176
05:33:01.510460 IP localhost.ssh > localhost.50832: tcp 112
05:33:01.510907 IP localhost.50832 > localhost.ssh: tcp 0
05:33:01.525789 IP localhost.ssh > localhost.50832: tcp 176
05:33:01.541450 IP localhost.ssh > localhost.50832: tcp 112
05:33:01.541548 IP localhost.50832 > localhost.ssh: tcp 0
05:33:01.557049 IP localhost.ssh > localhost.50832: tcp 176
05:33:01.574173 IP localhost.ssh > localhost.50832: tcp 112
05:33:01.574486 IP localhost.50832 > localhost.ssh: tcp 0
05:33:01.583765 IP localhost.50832 > localhost.ssh: tcp 64
05:33:01.583857 IP localhost.ssh > localhost.50832: tcp 176
^C
24 packets captured
26 packets received by filter
0 packets dropped by kernel
[root@localhost ~]# tcpdump -c 5    #使用-c選項指定監聽的數據包數量,這樣就不需要使用Ctrl+C了
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
05:34:24.515192 IP localhost.ssh > localhost.50832: Flags [P.], seq 898300004:898300212, ack 861398503, win 317, length 208
05:34:24.515301 IP localhost.50832 > localhost.ssh: Flags [.], ack 208, win 519, length 0
05:34:24.515445 IP localhost.60389 > localhost.domain: 26412+ PTR? 254.0.168.192.in-addr.arpa. (44)
05:34:24.518180 IP localhost.domain > localhost.60389: 26412 1/0/0 PTR localhost. (67)
05:34:24.518247 IP localhost.38804 > localhost.domain: 7473+ PTR? 233.0.168.192.in-addr.arpa. (44)
5 packets captured
10 packets received by filter
0 packets dropped by kernel

(3)監聽指定網卡收到的數據包

[root@Mr_chen ~]# tcpdump -i eth0   #使用-i選項可以指定要監聽的網卡
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
05:46:06.865643 IP localhost.ssh > localhost.50832: Flags [P.], seq 898335828:898336036, ack 861403175, win 317, length 208
05:46:06.865721 IP localhost.50832 > localhost.ssh: Flags [.], ack 208, win 524, length 0
05:46:06.865876 IP localhost.37090 > localhost.domain: 16313+ PTR? 254.0.168.192.in-addr.arpa. (44)
^C
49 packets captured
52 packets received by filter
0 packets dropped by kernel

以下是命令的結果說明

  • [x] 05:46:06.865643:當前時間,精確到微妙
  • [x] IP localhost.ssh > localhost.50832:從主機localhost的SSH端口發送數據到localhost的50832端口,“>”代表數據流向
  • [x] Flags [P.]:TCP包中的標志信息,S是SYN標志的縮寫,F(FIN),P(PUSH),R(RST),“.”(沒有標記)。
  • [x] seq:數據包中的數據的順序號。
  • [x] ack:下次期望的順序號
  • [x] win:接收緩存的窗口大小
  • [x] length:數據包長度

(4)監聽指定主機的數據包

[root@Mr_chen ~]# tcpdump -n -c 5 host 192.168.0.254    #使用-n選項不進行DNS解析,加快顯示速度。監聽指定主機的關鍵字為host,后面直接接主機名或IP地址即可。本行命令的作用是監聽所有192.168.0.254的主機收到的和發出的數據包
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
06:18:59.812585 IP 192.168.0.233.ssh > 192.168.0.254.50832: Flags [P.], seq 898389300:898389508, ack 861410071, win 317, length 208
06:18:59.812763 IP 192.168.0.254.50832 > 192.168.0.233.ssh: Flags [.], ack 208, win 524, length 0
06:18:59.813478 IP 192.168.0.233.ssh > 192.168.0.254.50832: Flags [P.], seq 208:496, ack 1, win 317, length 288
06:18:59.814441 IP 192.168.0.233.ssh > 192.168.0.254.50832: Flags [P.], seq 496:672, ack 1, win 317, length 176
06:18:59.814534 IP 192.168.0.254.50832 > 192.168.0.233.ssh: Flags [.], ack 672, win 522, length 0
5 packets captured
5 packets received by filter
0 packets dropped by kernel
[root@Mr_chen ~]# tcpdump -n -c 5 src host 192.168.0.254    #只監聽從192.168.0.254發出的數據包,即源地址為192.168.0.254,關鍵字為src(source,源地址)
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
06:19:45.439633 IP 192.168.0.254.50832 > 192.168.0.233.ssh: Flags [.], ack 898393156, win 522, length 0
06:19:45.511489 IP 192.168.0.254.50832 > 192.168.0.233.ssh: Flags [.], ack 161, win 521, length 0
06:19:45.589521 IP 192.168.0.254.50832 > 192.168.0.233.ssh: Flags [.], ack 321, win 520, length 0
06:19:45.667712 IP 192.168.0.254.50832 > 192.168.0.233.ssh: Flags [.], ack 481, win 520, length 0
06:19:45.733979 IP 192.168.0.254.50832 > 192.168.0.233.ssh: Flags [.], ack 641, win 519, length 0
5 packets captured
6 packets received by filter
0 packets dropped by kernel
[root@Mr_chen ~]# tcpdump -n -c 5 dst host 192.168.0.254    #只監聽192.168.0.254收到的數據包,即目標地址為192.168.0.254,關鍵字為dst(destination,目的地)
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
18:21:33.783811 IP 192.168.0.233.ssh > 192.168.0.254.55962: Flags [P.], seq 1885784800:1885785008, ack 322191067, win 317, length 208
18:21:33.785709 IP 192.168.0.233.ssh > 192.168.0.254.55962: Flags [P.], seq 208:400, ack 1, win 317, length 192
18:21:33.786677 IP 192.168.0.233.ssh > 192.168.0.254.55962: Flags [P.], seq 400:576, ack 1, win 317, length 176
18:21:33.787676 IP 192.168.0.233.ssh > 192.168.0.254.55962: Flags [P.], seq 576:752, ack 1, win 317, length 176
18:21:33.788684 IP 192.168.0.233.ssh > 192.168.0.254.55962: Flags [P.], seq 752:928, ack 1, win 317, length 176
5 packets captured
5 packets received by filter
0 packets dropped by kernel

(5)監聽指定端口的數據包

[root@Mr_chen ~]# tcpdump -nn -c 5 port 22  #-nn不進行DNS解析,不將端口轉換成服務名字, port指定監聽端口
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
18:27:25.472624 IP 192.168.0.233.22 > 192.168.0.254.55962: Flags [P.], seq 1886385856:1886386064, ack 322195131, win 317, length 208
18:27:25.472764 IP 192.168.0.254.55962 > 192.168.0.233.22: Flags [.], ack 208, win 522, length 0
18:27:25.473731 IP 192.168.0.233.22 > 192.168.0.254.55962: Flags [P.], seq 208:496, ack 1, win 317, length 288
18:27:25.474746 IP 192.168.0.233.22 > 192.168.0.254.55962: Flags [P.], seq 496:672, ack 1, win 317, length 176
18:27:25.474836 IP 192.168.0.254.55962 > 192.168.0.233.22: Flags [.], ack 672, win 520, length 0
5 packets captured
5 packets received by filter
0 packets dropped by kernel

(6)監聽指定協議的數據包

[root@Mr_chen ~]# tcpdump -n -c 5 arp   #監聽arp協議數據包,因此表達式直接寫arp即可
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
18:29:08.056959 ARP, Request who-has 192.168.0.111 tell 192.168.0.1, length 46
18:29:08.978765 ARP, Request who-has 192.168.0.111 tell 192.168.0.1, length 46
18:29:09.900334 ARP, Request who-has 192.168.0.111 tell 192.168.0.1, length 46
18:29:10.822093 ARP, Request who-has 192.168.0.111 tell 192.168.0.1, length 46
18:29:12.050836 ARP, Request who-has 192.168.0.111 tell 192.168.0.1, length 46
5 packets captured
5 packets received by filter
0 packets dropped by kernel
[root@Mr_chen ~]# tcpdump -n -c 5 icmp  #監聽icmp數據包(想要查看下面的監控數據,可以使用其他機器ping本機即可)
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
18:30:55.576828 IP 192.168.0.254 > 192.168.0.233: ICMP echo request, id 1, seq 19956, length 40
18:30:55.576844 IP 192.168.0.233 > 192.168.0.254: ICMP echo reply, id 1, seq 19956, length 40
18:30:56.578427 IP 192.168.0.254 > 192.168.0.233: ICMP echo request, id 1, seq 19958, length 40
18:30:56.578445 IP 192.168.0.233 > 192.168.0.254: ICMP echo reply, id 1, seq 19958, length 40
18:30:57.582167 IP 192.168.0.254 > 192.168.0.233: ICMP echo request, id 1, seq 19960, length 40
5 packets captured
6 packets received by filter
0 packets dropped by kernel

常見的協議關鍵字有ip,arp,icmp,tcp,udp等類型

(7)利用tcpdump抓包詳解tcp/ip連接和斷開過程的案例

1)正常的TCP連接的三個階段

  • [x] :TCP三次握手
  • [x] :數據傳送
  • [x] :TCP四次斷開

2)TCP連接圖示

TCP連接的狀態機制如下圖所示

QQ截圖20180303114730.png-137.5kB

3)TCP的狀態標識

  • [x] SYN:(同步序列編號,Synchronize Sequence Numbers)該標志僅在三次握手建立TCP連接時有效。表示一個新的TCP連接請求
  • [x] ACK:(確認編號,Acknowledgement Number)是對TCP請求的確認標志,同時提示對端系統已經成功接收了所有的數據。
  • [x] FIN:(結束標志,FINish)用來結束一個TCP回話。但對應端口仍然處於開放狀態,准備接收后續數據。

4)使用tcpdump對tcp數據進行抓包

[root@Mr_chen www]# tcpdump tcp port 80 or dst 192.168.0.114 -i eth0 -n
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
#抓包分析:三次握手過程
22:38:18.564320 ARP, Reply 192.168.0.233 is-at 00:0c:29:a8:ca:50, length 28 
#發送了一個ARP響應包給目標MAC地址,告知對方本機的MAC地址
22:38:18.564418 IP 192.168.0.114.52367 > 192.168.0.233.http: Flags [S], seq 3675775834, win 14600, options [mss 1460,sackOK,TS val 4294710555 ecr 0,nop,wscale 6], length 0 
#IP為192.168.0.114(client)通過臨時端口52367向本機192.168.0.233(server)的80監聽端口發起連接,client的初始包序號為3675775834,滑動窗口大小為14600字節(即TCP接收緩沖區的大小,用於TCP擁塞控制),mss大小為1460(即可接收的最大包長度),[S]=[SYN](發起連接標志)
22:38:18.564434 IP 192.168.0.233.http > 192.168.0.114.52367: Flags [S.], seq 2909831439, ack 3675775835, win 14480, options [mss 1460,sackOK,TS val 15157720 ecr 4294710555,nop,wscale 6], length 0
#Server的響應連接,同時帶上上一個包的ack信息(為client端的初始包序號+1,即3675775835,也就是server端下次等待接收這個包序號的包,用於TCP字節流的順序控制。Server端的初始包序號為2909831439,mss也是1460)
22:38:18.564541 IP 192.168.0.114.52367 > 192.168.0.233.http: Flags [.], ack 1, win 229, options [nop,nop,TS val 4294710556 ecr 15157720], length 0
#Client端再次確認,tcp三次握手完成。“.”表示沒有任何標識


以下是數據傳輸過程:

22:38:18.564654 IP 192.168.0.114.52367 > 192.168.0.233.http: Flags [P.], seq 1:169, ack 1, win 229, options [nop,nop,TS val 4294710557 ecr 15157720], length 168
#Client端發請求包,包長度是168字節。[P]=[push](傳送數據標志)
22:38:18.564658 IP 192.168.0.233.http > 192.168.0.114.52367: Flags [.], ack 169, win 243, options [nop,nop,TS val 15157720 ecr 4294710557], length 0  #Server端回應Client端表示收到請求,並確認已經收到了之前的168字節
22:38:18.564707 IP 192.168.0.233.http > 192.168.0.114.52367: Flags [P.], seq 1:237, ack 169, win 243, options [nop,nop,TS val 15157720 ecr 4294710557], length 236    #Server回包,包長度236字節
22:38:18.564755 IP 192.168.0.233.http > 192.168.0.114.52367: Flags [P.], seq 237:258, ack 169, win 243, options [nop,nop,TS val 15157720 ecr 4294710557], length 21
22:38:18.564773 IP 192.168.0.114.52367 > 192.168.0.233.http: Flags [.], ack 237, win 245, options [nop,nop,TS val 4294710557 ecr 15157720], length 0
22:38:18.564818 IP 192.168.0.114.52367 > 192.168.0.233.http: Flags [.], ack 258, win 245, options [nop,nop,TS val 4294710557 ecr 15157720], length 0

以下是4次揮手過程:

22:38:18.564946 IP 192.168.0.114.52367 > 192.168.0.233.http: Flags [F.], seq 169, ack 258, win 245, options [nop,nop,TS val 4294710557 ecr 15157720], length 0  
#Client端發送關閉連接請求,F=FIN(斷開連接標志)
22:38:18.564956 IP 192.168.0.233.http > 192.168.0.114.52367: Flags [F.], seq 258, ack 170, win 243, options [nop,nop,TS val 15157720 ecr 4294710557], length 0
#Server端回應並確認了Client端的斷開連接請求,並且也發送了FIN標志關閉。(只有當服務器傳輸未完成時,此處才會出現兩次揮手,如果Clinet發起斷開請求時,服務器已經傳輸數據完成,則此處服務端會直接回應關閉標志FIN)
22:38:18.565022 IP 192.168.0.114.52367 > 192.168.0.233.http: Flags [.], ack 259, win 245, options [nop,nop,TS val 4294710557 ecr 15157720], length 0
#Clinet端響應ack,關閉連接的四次揮手完成

提示:
tcpdump是一個非常強大並且好用的命令,請同學們多花精力來掌握,當然,要想掌握好,還需要一定的網絡知識才行

三,Linux核心系統管理命令

3.1 lsof:查看進程打開的文件

3.1.1 命令詳解

功能說明:

lsof全名為list open files,也就是列舉系統中已經被打開的文件,通過lsof命令,就可以根據文件找到對應的進程信息,也可以根據進程信息找到進程打開的文件

選項說明:

參數選項 解釋說明
-c <進程名> 顯示指定的進程名所打開的文件
-p <進程號> 顯示指定的進程號所打開的文件
-i 通過監聽指定的協議,端口和主機等信息,顯示符合條件的進程信息
-u 顯示指定用戶使用的文件
-U 顯示所有socket文件

3.1.2 使用范例

(1)顯示使用文件的進程

[root@Mr_chen ~]# lsof /var/log/messages    #顯示使用文件的進程
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME
rsyslogd 870 root    1w   REG  253,0   501224 262654 /var/log/messages

如果想知道某個特定的文件是由哪個進程在使用,就可以通過“lsof 文件名”的方式來得到。從上面的輸出可以得知,/var/log/messages文件是由rsyslogd進程在使用。
輸出中每列的含義具體如下:

  • [x] COMMAND:命令,進程的名稱。
  • [x] PID:進程號。
  • [x] USER:進程的所有者。
  • [x] FD:文件描述符,它又包含如下內容
    • 0:表示標准輸出。
    • 1:表示標准輸入。
    • 2:表示標准錯誤。
    • u:表示該文件被打開並處於讀取/寫入模式
    • r:表示該文件被打開並處於只讀模式
    • w:表示該文件被打開並處於寫入模式
  • [x] TYPE:文件類型,REG(regular)為普通文件
  • [x] DEVICE:指定磁盤的名稱。
  • [x] SIZE/OFF:文件的大小
  • [x] NODE:索引節點
  • [x] NAME:文件名稱

(2)顯示指定進程所打開的文件

[root@Mr_chen ~]# lsof -c rsyslog   #使用-c選項顯示指定進程所打開的文件
COMMAND  PID USER   FD   TYPE             DEVICE SIZE/OFF       NODE NAME
rsyslogd 870 root  cwd    DIR              253,0     4096          2 /
rsyslogd 870 root  rtd    DIR              253,0     4096          2 /
rsyslogd 870 root  txt    REG              253,0   396064     130951 /sbin/rsyslogd
rsyslogd 870 root  mem    REG              253,0    27232     393534 /lib64/rsyslog/imklog.so
rsyslogd 870 root  mem    REG              253,0   340568     393540 /lib64/rsyslog/imuxsock.so
rsyslogd 870 root  mem    REG              253,0    65928     392495 /lib64/libnss_files-2.12.so
rsyslogd 870 root  mem    REG              253,0    26984     393541 /lib64/rsyslog/lmnet.so
rsyslogd 870 root  mem    REG              253,0  1921216     392479 /lib64/libc-2.12.so
rsyslogd 870 root  mem    REG              253,0    90880     392452 /lib64/libgcc_s-4.4.7-20120601.so.1
rsyslogd 870 root  mem    REG              253,0    43832     392507 /lib64/librt-2.12.so
rsyslogd 870 root  mem    REG              253,0    19536     392485 /lib64/libdl-2.12.so
rsyslogd 870 root  mem    REG              253,0   142640     392503 /lib64/libpthread-2.12.so
rsyslogd 870 root  mem    REG              253,0    88600     392529 /lib64/libz.so.1.2.3
rsyslogd 870 root  mem    REG              253,0   154520     392472 /lib64/ld-2.12.so
rsyslogd 870 root    0u  unix 0xffff880037d8b6c0      0t0       8910 /dev/log
rsyslogd 870 root    1w   REG              253,0   501224     262654 /var/log/messages
rsyslogd 870 root    2w   REG              253,0     5164     262655 /var/log/secure
rsyslogd 870 root    3r   REG                0,3        0 4026532040 /proc/kmsg
rsyslogd 870 root    4w   REG              253,0    18512     262652 /var/log/cron

(3)顯示指定進程號說打開的文件

[root@Mr_chen ~]# lsof -p 870   #使用-p選項顯示指定進程號所打開的文件
COMMAND  PID USER   FD   TYPE             DEVICE SIZE/OFF       NODE NAME
rsyslogd 870 root  cwd    DIR              253,0     4096          2 /
rsyslogd 870 root  rtd    DIR              253,0     4096          2 /
rsyslogd 870 root  txt    REG              253,0   396064     130951 /sbin/rsyslogd
rsyslogd 870 root  mem    REG              253,0    27232     393534 /lib64/rsyslog/imklog.so
rsyslogd 870 root  mem    REG              253,0   340568     393540 /lib64/rsyslog/imuxsock.so
rsyslogd 870 root  mem    REG              253,0    65928     392495 /lib64/libnss_files-2.12.so
rsyslogd 870 root  mem    REG              253,0    26984     393541 /lib64/rsyslog/lmnet.so
rsyslogd 870 root  mem    REG              253,0  1921216     392479 /lib64/libc-2.12.so
rsyslogd 870 root  mem    REG              253,0    90880     392452 /lib64/libgcc_s-4.4.7-20120601.so.1
rsyslogd 870 root  mem    REG              253,0    43832     392507 /lib64/librt-2.12.so
rsyslogd 870 root  mem    REG              253,0    19536     392485 /lib64/libdl-2.12.so
rsyslogd 870 root  mem    REG              253,0   142640     392503 /lib64/libpthread-2.12.so
rsyslogd 870 root  mem    REG              253,0    88600     392529 /lib64/libz.so.1.2.3
rsyslogd 870 root  mem    REG              253,0   154520     392472 /lib64/ld-2.12.so
rsyslogd 870 root    0u  unix 0xffff880037d8b6c0      0t0       8910 /dev/log
rsyslogd 870 root    1w   REG              253,0   501224     262654 /var/log/messages
rsyslogd 870 root    2w   REG              253,0     5164     262655 /var/log/secure
rsyslogd 870 root    3r   REG                0,3        0 4026532040 /proc/kmsg
rsyslogd 870 root    4w   REG              253,0    18512     262652 /var/log/cron

(4)監聽指定的協議,端口和主機等信息,顯示符合條件的進程信息

在講解范例之前,我們先來看看相應語法格式:
lsof -i [46] [protocol] [@hostname] [:service|port]
其中各項的含義如下:

  • [x] 46:4代表IPv4,6代表IPv6
  • [x] protocol:傳輸協議,可以是TCP或UDP
  • [x] hostname:主機名稱或者IP地址
  • [x] service:進程的服務名,例如NFS,SSH和FTP等。
  • [x] port:系統中與服務對應的端口號。例如HTTP服務默認對應的端口號為80,SSH服務默認對應的端口號為22.
[root@Mr_chen ~]# lsof -i   #查看所有進程
COMMAND PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
sshd    885 root    3u  IPv4   8948      0t0  TCP *:ssh (LISTEN)
sshd    885 root    4u  IPv6   8950      0t0  TCP *:ssh (LISTEN)
sshd    918 root    3r  IPv4   9075      0t0  TCP localhost:ssh->localhost:54216 (ESTABLISHED)
[root@Mr_chen ~]# lsof -i tcp   #顯示所有tcp網絡連接的進程信息
COMMAND PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
sshd    885 root    3u  IPv4   8948      0t0  TCP *:ssh (LISTEN)
sshd    885 root    4u  IPv6   8950      0t0  TCP *:ssh (LISTEN)
sshd    918 root    3r  IPv4   9075      0t0  TCP localhost:ssh->localhost:54216 (ESTABLISHED)
[root@Mr_chen ~]# lsof -i:22    #顯示端口為22的進程,這條命令很常用
COMMAND PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
sshd    885 root    3u  IPv4   8948      0t0  TCP *:ssh (LISTEN)
sshd    885 root    4u  IPv6   8950      0t0  TCP *:ssh (LISTEN)
sshd    918 root    3r  IPv4   9075      0t0  TCP localhost:ssh->localhost:54216 (ESTABLISHED)
[root@Mr_chen ~]# lsof -i tcp:22    #顯示同時滿足TCP和端口為22的進程
COMMAND PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
sshd    885 root    3u  IPv4   8948      0t0  TCP *:ssh (LISTEN)
sshd    885 root    4u  IPv6   8950      0t0  TCP *:ssh (LISTEN)
sshd    918 root    3r  IPv4   9075      0t0  TCP localhost:ssh->localhost:54216 (ESTABLISHED)

(5)顯示指定用戶使用的文件

[root@Mr_chen ~]# lsof -u Mr_chen   #使用-u選項顯示Mr_chen用戶使用的文件
COMMAND  PID    USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME
bash    1012 Mr_chen  cwd    DIR  253,0     4096 138686 /home/Mr_chen
bash    1012 Mr_chen  rtd    DIR  253,0     4096      2 /
bash    1012 Mr_chen  txt    REG  253,0   903336 786016 /bin/bash
bash    1012 Mr_chen  mem    REG  253,0 99158576 655748 /usr/lib/locale/locale-archive
bash    1012 Mr_chen  mem    REG  253,0    65928 392495 /lib64/libnss_files-2.12.so
bash    1012 Mr_chen  mem    REG  253,0  1921216 392479 /lib64/libc-2.12.so
bash    1012 Mr_chen  mem    REG  253,0    19536 392485 /lib64/libdl-2.12.so
bash    1012 Mr_chen  mem    REG  253,0   135896 392521 /lib64/libtinfo.so.5.7
bash    1012 Mr_chen  mem    REG  253,0   154520 392472 /lib64/ld-2.12.so
bash    1012 Mr_chen  mem    REG  253,0    26060 916570 /usr/lib64/gconv/gconv-modules.cache
bash    1012 Mr_chen    0u   CHR  136,1      0t0      4 /dev/pts/1
bash    1012 Mr_chen    1u   CHR  136,1      0t0      4 /dev/pts/1
bash    1012 Mr_chen    2u   CHR  136,1      0t0      4 /dev/pts/1
bash    1012 Mr_chen  255u   CHR  136,1      0t0      4 /dev/pts/1

(6)顯示所有socket文件

[root@Mr_chen ~]# lsof -U   #使用-U選項顯示所有socket文件
COMMAND   PID USER   FD   TYPE             DEVICE SIZE/OFF  NODE NAME
init        1 root    7u  unix 0xffff880037afa680      0t0  7510 socket
udevd     360 root    4u  unix 0xffff880037afa980      0t0  7857 socket
udevd     360 root    8u  unix 0xffff880037afac80      0t0  7873 socket
udevd     360 root    9u  unix 0xffff880037afa080      0t0  7874 socket
udevd     635 root    9u  unix 0xffff880037afa080      0t0  7874 socket
rsyslogd  870 root    0u  unix 0xffff880037d8b6c0      0t0  8910 /dev/log
crond     893 root    4u  unix 0xffff880037d8b3c0      0t0  8976 socket
sshd      918 root    4w  unix 0xffff880037d8b0c0      0t0  9125 socket
anacron   983 root    4u  unix 0xffff880037d8b9c0      0t0 10018 socket
su       1011 root    3u  unix 0xffff880037d8bcc0      0t0 10151 socket

3.2 free:查看系統內存信息

3.2.1 命令詳解

功能說明:

free命令用於顯示系統內存狀態,具體包括系統物理內存,虛擬內存,共享內存和系統緩存等。

選項說明:

參數選項 解釋說明(帶@的為重點)
-b 以Byte為單位顯示內存的使用情況
-m 以MB為單位顯示內存的使用情況@
-K 以KB為單位顯示內存的使用情況
-h 以人類可讀的形式顯示內存的使用情況@
-t 顯示內存總和列
-s <間隔秒數> 根據指定的間隔秒數持續顯示內存的使用情況@
-o 不顯示系統緩沖區列

3.2.2 使用范例

(1)查看系統內存

[root@Mr_chen ~]# free  #不加參數默認顯示的是字節數,很難讀懂
             total       used       free     shared    buffers     cached
Mem:       1004412      85788     918624          0       6168      22904
-/+ buffers/cache:      56716     947696
Swap:      2031608          0    2031608
[root@Mr_chen ~]# free -m   #使用-m選項,以MB為單位顯示內存的使用情況
             total       used       free     shared    buffers     cached
Mem:           980         83        897          0          6         22
-/+ buffers/cache:         55        925
Swap:         1983          0       1983

針對上面的輸出,有以下說明

  • [x] Linux系統的特性是將不用的物理內存緩存起來,因此897MB不是系統的真實剩余內存。
  • [x] 系統真正可用的內存為925MB
  • [x] buffers為寫入數據緩沖區
  • [x] cache為讀取數據緩存區

(2)定時查詢內存

[root@Mr_chen ~]# free -s 10    #使用-s選項定時刷新內存的使用情況,單位為秒
             total       used       free     shared    buffers     cached
Mem:       1004412      85888     918524          0       6168      22932
-/+ buffers/cache:      56788     947624
Swap:      2031608          0    2031608

3.3 iftop:動態顯示網絡接口流量信息

3.3.1 命令詳解

功能說明:

  • iftop是一款實時流量監控工具,可用於監控TCP/IP連接等,必須以root用戶的身份運行。
  • 一般最小化安裝系統都是沒有這個命令的,需要使用yum命令額外安裝,而且還要從epel源下載。
    epel源的安裝幫助請參見:http://mirrors.aliyun.com/help/epel
    安裝iftop命令的步驟請參見:
    wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
    yum -y install iftop

選項說明:

參數選項 解釋說明(帶@的為重點)
-i 指定監聽的網絡接口@
-n 不進行DNS解析@
-N 不將端口號解析成服務名@
-B 以byte為單位顯示流量(默認是bit)@
-p 設置網卡為混雜模式,以便不直接通過指定接口傳遞的流量也能被計數
-P(大寫) 顯示端口號@
-m 設置界面最上邊的刻度的最大值,刻度分為五個大段顯示
-F 顯示特定網段的進出流量

3.3.2 使用范例

(1)不接任何參數啟動iftop命令監控流量。

[root@Mr_chen yum.repos.d]# iftop
interface: eth0 #默認監聽系統的第一塊網卡,可以使用-i選項指定監聽網卡
IP address is: 192.168.0.233
MAC address is: 00:0c:29:a8:ca:50

QQ截圖20180306231637.png-16.2kB

上圖為iftop界面,相關說明如下:

  • [x] 界面上顯示的是類似刻度尺的刻度范圍,是以標尺的形式顯示流量圖形的長條
  • [x] 中間的<=或=>這兩個左右箭頭,表示的是流量的反向
  • [x] TX:發送流量
  • [x] RX:接收流量
  • [x] TOTAL:總流量
  • [x] Cum:運行iftop到目前時間的總流量
  • [x] peak:流量峰值
  • [x] rates:分別表示過去2s,10s,40s的平均流量

(2)常用命令組合

[root@Mr_chen yum.repos.d]# iftop -nNBP
interface: eth0
IP address is: 192.168.0.233
MAC address is: 00:0c:29:a8:ca:50

QQ截圖20180306231637.png-17.2kB

命令說明具體如下:

  • [x] -n:不進行DNS解析,顯示IP數字地址
  • [x] -N:顯示數字形式的端口號
  • [x] -P:顯示端口號
  • [x] -B:默認是以bit為單位顯示流量,需要經過計算才能符合我們的認知,但是使用-B選項就會直接顯示以字節為單位的流量。

3.4 vmstat:虛擬內存統計

3.4.1 命令詳解

功能說明:

vmstat是Virtual Memory Statistics(虛擬內存統計)的縮寫,利用vmstat命令可以對操作系統的內存信息,進程狀態和CPU活動等進行監視。但是只能對系統的整體情況進行統計,無法對某個進程進行深入分析。

選項說明:

參數選項 解釋說明(帶@的為重點)
-a 顯示活躍和非活躍內存
-f 顯示從系統啟動至今的fork進程數量
-m 顯示slab信息
-n 只在開始時顯示一次各字段名稱
-s 顯示內存相關統計信息及多種系統活動數量@
-d 顯示磁盤相關統計信息
-p 顯示指定磁盤分區統計信息
-S 使用指定單位顯示。參數有k,K,m,M,分別代表1000,1024,1000000,1048576字節(byte)。默認單位為K(1024byte)
-t 統計信息帶上時間戳

3.4.2 使用范例

(1)顯示虛擬內存的使用情況

[root@Mr_chen ~]# vmstat    #如果省略“間隔時間”和“次數”的參數,則僅顯示一次報告后就退出
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 915796   8792  22900    0    0  1188    54  203  474  2  6 90  1  0
 [root@Mr_chen ~]# vmstat 5 #表示每5秒鍾更新一次輸出信息,循環輸出,按Ctrl + C組合鍵停止輸出
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 915796   8792  22928    0    0   343    24   64  144  1  2 97  0  0	
[root@Mr_chen ~]# vmstat 5 6    #表示每5秒鍾更新一次輸出信息,統計6次后停止輸出
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 915796   8792  22928    0    0   781    53  137  316  1  4 94  1  0	

以下是命令結果的詳解說明
第1列:procs

  • [x] r列表示運行和等待CPU時間片的進程數。
  • [x] b列表示正在等待資源的進程數。

第2列:memory

  • [x] swpd列表示使用虛擬內存的大小。
  • [x] free列表示當前空閑的物理內存數量.
  • [x] buff列表示buffers的內存數量.
  • [x] cache列表示cache的內存數量.

第3列:swap

  • [x] si(swap in)列表示由磁盤調入內存,也就是內存進入內存交換區的數量。
  • [x] so(swap out)列表示由內存調入磁盤,也就是內存交換區進入內存的數量。

第4列:I/O項顯示磁盤讀寫狀況

  • [x] bi列表示從塊設備讀入數據的總量(即讀磁盤)(塊/s)
  • [x] bo列表示寫入塊設備的數據總量(即寫磁盤))(塊/s)

第5列:system顯示采集間隔內發生的中斷數

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

第6列:CPU項顯示了CPU的使用狀態

  • [x] us列顯示了用戶進程消耗的CPU時間百分比。
  • [x] sy列顯示了系統(內核)進程消耗的CPU時間百分比。
  • [x] id列顯示了CPU處在空閑狀態的時間百分比。
  • [x] wa列顯示了I/O等待所占用的CPU時間百分比
  • [x] st列顯示了虛擬機占用的CPU時間的百分比。

(2)顯示活躍和非活躍內存

[root@Mr_chen ~]# vmstat -a 2 5
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
 r  b   swpd   free  inact active   si   so    bi    bo   in   cs us sy id wa st
 0  0      0 915324  19284  18180    0    0     5     0    6    9  0  0 100  0  0	
 0  0      0 915284  19284  18180    0    0     0     0   10    9  0  0 100  0  0	
 0  0      0 915284  19284  18180    0    0     0     0   10   10  0  0 100  0  0	
 0  0      0 915284  19284  18212    0    0     0     0    9   10  0  0 100  0  0	
 0  0      0 915284  19284  18212    0    0     0     0    9   11  0  0 100  0  0	

使用-a選項顯示活躍和非活躍內存時,所顯示的內容除去增加了inact和active之外,其他顯示內容與范例11-12相同。
memory列增加了inact和active兩列,其說明具體如下。

  • [x] inact:非活躍的內存大小(當使用-a選項時顯示)
  • [x] active:活躍的內存大小(當使用-a選項時顯示)

(3)查看內存使用的詳細信息

[root@Mr_chen ~]# vmstat -s
      1004412  total memory
        89096  used memory
        18196  active memory
        19268  inactive memory
       915316  free memory
         8816  buffer memory
        23244  swap cache
      2031608  total swap
            0  used swap
      2031608  free swap
......

這些信息分別來自於/proc/meminfo,/proc/stat和/proc/vmstat

(4)查看磁盤的讀/寫

[root@Mr_chen ~]# vmstat -d
disk- ------------reads------------ ------------writes----------- -----IO------
       total merged sectors      ms  total merged sectors      ms    cur    sec
ram0       0      0       0       0      0      0       0       0      0      0
ram1       0      0       0       0      0      0       0       0      0      0
ram2       0      0       0       0      0      0       0       0      0      0
ram3       0      0       0       0      0      0       0       0      0      0
ram4       0      0       0       0      0      0       0       0      0      0
ram5       0      0       0       0      0      0       0       0      0      0
ram6       0      0       0       0      0      0       0       0      0      0
ram7       0      0       0       0      0      0       0       0      0      0
ram8       0      0       0       0      0      0       0       0      0      0
ram9       0      0       0       0      0      0       0       0      0      0
ram10      0      0       0       0      0      0       0       0      0      0
ram11      0      0       0       0      0      0       0       0      0      0
ram12      0      0       0       0      0      0       0       0      0      0
ram13      0      0       0       0      0      0       0       0      0      0
ram14      0      0       0       0      0      0       0       0      0      0
ram15      0      0       0       0      0      0       0       0      0      0
loop0      0      0       0       0      0      0       0       0      0      0
loop1      0      0       0       0      0      0       0       0      0      0
loop2      0      0       0       0      0      0       0       0      0      0
loop3      0      0       0       0      0      0       0       0      0      0
disk- ------------reads------------ ------------writes----------- -----IO------
       total merged sectors      ms  total merged sectors      ms    cur    sec
loop4      0      0       0       0      0      0       0       0      0      0
loop5      0      0       0       0      0      0       0       0      0      0
loop6      0      0       0       0      0      0       0       0      0      0
loop7      0      0       0       0      0      0       0       0      0      0
sr0       33      0     264      47      0      0       0       0      0      0
sda     2144   1571   70016     659    411    452    6898     277      0      0
dm-0    2786      0   62426    1755    854      0    6832     583      0      0
dm-1     287      0    2296      35      0      0       0       0      0      0

這些信息主要來自於/proc/diskstats。其中的merged表示一次來自於合並的寫/讀請求,系統一般會把多個連接/鄰近的讀/寫請求合並到一起來操作。

(5)查看/dev/sda1磁盤的讀寫統計信息

[root@Mr_chen ~]# vmstat -p /dev/sda1
sda1          reads   read sectors  writes    requested writes
                 431       3518          9         66

這些信息主要來自於/proc/diskstats。各列的說明具體如下

  • [x] reads:來自於該分區的讀的次數
  • [x] read sectors:來自於該分區的讀扇區的次數
  • [x] writes:來自於該分區的寫的次數
  • [x] requested writes:來自於該分區的寫請求次數。

3.5 mpstat:CPU信息統計

3.5.1 命令詳解

功能說明:

  • mpstat是Multiprocessor Statistics的縮寫,是一種實時系統監控工具。mpstat命令會輸出CPU的一些統計信息,這些信息存放在/proc/stat文件中。在多CPU的系統里,此命令不但能用來查看所有CPU的平均狀態信息,而且還能夠用來查看特定CPU的信息。
    mpstat命令的最大特點是:可以查看多核心CPU中每個計算核心的統計數據,而類似命令vmstat只能查看系統整體的CPU情況。

選項說明:

參數選項 解釋說明
-P 指定CPU編號,例如:-P 0表示第一個CPU,-P 1表示第二個CPU,-P ALL表示所有CPU

3.5.2 使用范例

(1)顯示CPU信息統計

[root@Mr_chen ~]# mpstat    #如果省略“時間間隔”和“次數”參數,則僅顯示一次報告后就退出
Linux 2.6.32-431.el6.x86_64 (Mr_chen) 	03/10/2018 	_x86_64_	(1 CPU)

06:13:34 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle
06:13:34 PM  all    0.01    0.00    0.06    0.01    0.00    0.00    0.00    0.00   99.93
[root@Mr_chen ~]# mpstat 5 6    #表示每5秒更新一次輸出信息,統計6次后停止輸出。
Linux 2.6.32-431.el6.x86_64 (Mr_chen) 	03/10/2018 	_x86_64_	(1 CPU)

06:15:16 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle
06:15:21 PM  all    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
06:15:26 PM  all    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
06:15:31 PM  all    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
06:15:36 PM  all    0.00    0.00    0.20    0.00    0.00    0.00    0.00    0.00   99.80
06:15:41 PM  all    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
06:15:46 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.03    0.00    0.00    0.00    0.00    0.00   99.97

以下是命令結果的詳細說明
第1列:06:13:34 PM,表示當前時間
第2列:CPU,all表示所有CPU,0表示第一個CPU...
后面9列的含義分別如下:

  • [x] %usr:用戶進程消耗的CPU時間百分比。
  • [x] %nice:改變過優先級的進程占用的CPU時間百分比
  • [x] %sys:系統(內核)進程消耗的CPU時間百分比
  • [x] %iowait:IO等待所占用的CPU時間百分比
  • [x] %irq:硬中斷占用的CPU時間百分比
  • [x] %soft:軟中斷占用的CPU時間百分比
  • [x] %steal:虛擬機強制CPU等待的時間百分比
  • [x] %guest:虛擬機占用CPU時間的百分比
  • [x] %idle:CPU處於空閑狀態的時間百分比

(2)顯示指定CPU信息的統計

[root@Mr_chen ~]# mpstat -P 0   #顯示第一個CPU信息
Linux 2.6.32-431.el6.x86_64 (Mr_chen) 	03/10/2018 	_x86_64_	(1 CPU)

06:29:46 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle
06:29:46 PM    0    0.01    0.00    0.05    0.01    0.00    0.00    0.00    0.00   99.93

3.6 iostat:I/O信息統計

3.6.1 命令詳解

功能說明:

iostat是I/O statistics(輸入/輸出統計)的縮寫,其主要功能是對系統的磁盤I/O操作進行監視。它的輸出主要是顯示磁盤讀寫操作的統計信息,同時也會給出CPU的使用情況。同vmstat命令一樣,iostat命令也不能對某個進程進行深入分析,僅會對系統的整體情況進行分析。

選項說明:

參數選項 解釋說明(帶@為重點)
-c 顯示CPU的使用情況@
-d 顯示磁盤的使用情況@
-k 每秒以kB為單位顯示數據
-m 每秒以MB為單位顯示數據
-n 顯示NFS的使用情況
-t 顯示每次統計的執行時間
-p device 指定要統計的磁盤設備名稱,默認為所有的磁盤設備
-x 顯示擴展統計

3.6.2 使用范例

(1)顯示所有設備的負載情況

[root@Mr_chen ~]# iostat    #如果省略“時間間隔”和“次數”參數,則僅顯示一次報告后就退出
Linux 2.6.32-431.el6.x86_64 (Mr_chen) 	03/10/2018 	_x86_64_	(1 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.02    0.00    0.05    0.01    0.00   99.93

Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
scd0              0.02         0.13         0.00       1976          0
sda               0.34        28.21         7.76     445866     122724
dm-0              1.30        27.73         7.76     438306     122664
dm-1              0.02         0.15         0.00       2296          0

以下是命令結果說明
第1~2行中各列的含義具體如下

  • [x] %user : 用戶進程消耗的CPU時間百分比

  • [x] %nice : 改變過優先級的進程占用的CPU時間百分比

  • [x] %system : 系統(內核)進程消耗的CPU時間百分比

  • [x] %iowait : IO等待所占用的CPU時間百分比

  • [x] %steal : 虛擬機強制CPU等待的時間百分比

  • [x] %idle : CPU處在空閑狀態的時間百分比
    第3~4行中各列的含義如下

  • [x] tps : 表示該設備每秒的傳輸次數,“一次傳輸”的意思是“一次I/O請求”,多個邏輯請求可能會被合並為“一次I/O請求”,“一次傳輸”請求的大小是未知的。

  • [x] Blk_read/s : 表示每秒讀取的數據塊數

  • [x] Blk_wrtn/s : 表示每秒寫入的數據塊數

  • [x] Blk_read : 表示讀取的所有塊數

  • [x] Blk_wrtn : 表示寫入的所有塊數

(2)定時顯示所有信息

[root@Mr_chen ~]#  iostat 2 3   #每隔2秒刷新顯示一次,共顯示3次
Linux 2.6.32-431.el6.x86_64 (Mr_chen) 	03/10/2018 	_x86_64_	(1 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.01    0.00    0.04    0.00    0.00   99.94

Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
scd0              0.02         0.09         0.00       1976          0
sda               0.25        19.82         5.51     445866     123988
dm-0              0.92        19.48         5.51     438306     123928
dm-1              0.01         0.10         0.00       2296          0

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.00    0.00    0.00    0.00    0.00  100.00

Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
scd0              0.00         0.00         0.00          0          0
sda               0.00         0.00         0.00          0          0
dm-0              0.00         0.00         0.00          0          0
dm-1              0.00         0.00         0.00          0          0

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.00    0.00    0.50    0.00    0.00   99.50

Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
scd0              0.00         0.00         0.00          0          0
sda               0.00         0.00         0.00          0          0
dm-0              0.00         0.00         0.00          0          0
dm-1              0.00         0.00         0.00          0          0

(3)只顯示磁盤統計信息

[root@Mr_chen ~]# iostat -d #選項-d只顯示磁盤的統計信息
Linux 2.6.32-431.el6.x86_64 (Mr_chen) 	03/10/2018 	_x86_64_	(1 CPU)

Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
scd0              0.02         0.09         0.00       1976          0
sda               0.24        19.50         5.43     445866     124108
dm-0              0.91        19.17         5.42     438306     124048
dm-1              0.01         0.10         0.00       2296          0
[root@Mr_chen ~]# iostat -d -k  #選項-k以KB為單位顯示數據
Linux 2.6.32-431.el6.x86_64 (Mr_chen) 	03/10/2018 	_x86_64_	(1 CPU)

Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
scd0              0.02         0.04         0.00        988          0
sda               0.24         9.72         2.70     222933      62054
dm-0              0.91         9.55         2.70     219153      62024
dm-1              0.01         0.05         0.00       1148          0
[root@Mr_chen ~]# iostat -d -m  #選項-m以MB為單位顯示數據
Linux 2.6.32-431.el6.x86_64 (Mr_chen) 	03/10/2018 	_x86_64_	(1 CPU)

Device:            tps    MB_read/s    MB_wrtn/s    MB_read    MB_wrtn
scd0              0.02         0.00         0.00          0          0
sda               0.24         0.01         0.00        217         60
dm-0              0.90         0.01         0.00        214         60
dm-1              0.01         0.00         0.00          1          0

(4)查看擴展信息

[root@Mr_chen ~]# iostat -d -x -k   #選項-x顯示擴展信息
Linux 2.6.32-431.el6.x86_64 (Mr_chen) 	03/10/2018 	_x86_64_	(1 CPU)

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await  svctm  %util
scd0              0.00     0.00    0.02    0.00     0.04     0.00     5.41     0.00    1.09   1.09   0.00
sda               0.08     0.61    0.18    0.05     9.49     2.65   102.62     0.00    0.79   0.42   0.01
dm-0              0.00     0.00    0.22    0.66     9.33     2.65    27.03     0.01    6.17   0.11   0.01
dm-1              0.00     0.00    0.01    0.00     0.05     0.00     8.00     0.00    0.24   0.13   0.00

以下是命令結果說明

  • [x] rrqm/s:每秒進行merge的讀操作數目
  • [x] wrqm/s:每秒進行merge的寫操作數目
  • [x] r/s:每秒完成的讀I/O設備次數
  • [x] w/s:每秒完成的寫I/O設備次數
  • [x] rkB/s:每秒讀入的千字節數
  • [x] wkB/s:每秒寫入的千字節數
  • [x] avgrq-sz:設備平均每次進行I/O操作的數據大小(扇區)
  • [x] avgqu-sz:平均I/O隊列長度
  • [x] await:設備平均每次I/O操作的等待時間(毫秒)
  • [x] svctm:設備平均每次I/O操作的服務時間(毫秒)
  • [x] %util:每秒鍾用於I/O操作的百分比

(5)只查看CPU的統計信息

[root@Mr_chen ~]# iostat -c #使用-c選項只顯示系統CPU的統計信息
Linux 2.6.32-431.el6.x86_64 (Mr_chen) 	03/10/2018 	_x86_64_	(1 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.01    0.00    0.04    0.00    0.00   99.95

3.7 iotop:動態顯示磁盤I/O統計信息

3.7.1 命令詳解

功能說明:

iotop命令是一款實時監控磁盤I/O的工具,但必須以root用戶的身份運行。使用iotop命令可以很方便地查看每個進程使用磁盤I/O的情況。
最小化安裝系統一般是沒有這個命令的,需要使用yum命令額外安裝,安裝命令如下:yum -y install iotop

選項說明:

參數選項 解釋說明(帶@為重點)
-o 顯示正在使用I/O的進程或者線程,默認是顯示所有@
-d 設置顯示的間隔秒數
-p 只顯示指定PID的信息@
-u 顯示指定用戶的信息
-P(大寫) 只顯示進程,一般是顯示所有的線程
-a 顯示從iotop啟動后每個線程完成了的I/O總數
-k 設置顯示單位為KB
-t 在每一行前添加一個當前的時間

3.7.2 使用范例

(1)不接任何參數啟動iotop命令

[root@Mr_chen ~]# iotop     

Total DISK READ: 0.00 B/s | Total DISK WRITE: 0.00 B/s
  TID  PRIO  USER     DISK READ  DISK WRITE  SWAPIN     IO>    COMMAND                                                                      
    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]
    3 rt/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [migration/0]
    4 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [ksoftirqd/0]
    5 rt/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [migration/0]
    6 rt/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [watchdog/0]
    7 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [events/0]
    8 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [cgroup]
    9 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [khelper]
   10 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [netns]
   11 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [async/mgr]
   12 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [pm]
   13 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [sync_supers]
   14 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [bdi-default]
   15 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [kintegrityd/0]
   16 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [kblockd/0]
   17 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [kacpid]
   18 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [kacpi_notify]
   19 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [kacpi_hotplug]
   20 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [ata_aux]
   21 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [ata_sff/0]
   22 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [ksuspend_usbd]
   23 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [khubd]
   24 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [kseriod]

以下是命令結果的具體說明

  • [x] Total DISK READ:總的磁盤讀取速度
  • [x] Total DISK WRITE:總的磁盤寫入速度
  • [x] TID:進程pid值
  • [x] PRIO:優先級
  • [x] USER:用戶
  • [x] DISK READ:磁盤讀取速度
  • [x] DISK WRITE:磁盤寫入速度
  • [x] SWAPIN:從swap分區讀取數據占用的百分比
  • [x] IO:I/O占用的百分比
  • [x] COMMAND:消耗I/O的進程名

3.8 sar:收集系統信息

3.8.1 命令詳解

功能說明:

通過sar命令,可以全面地獲取系統的CPU,運行隊列,磁盤I/O,分頁(交換區),內存,CPU中斷和網絡等性能數據

選項說明:

參數選項 解釋說明(帶@的為重點)
-A 顯示系統所有資源設備(CPU,內存,磁盤)的運行狀態
-u 顯示系統所有CPU在采樣時間內的負載狀態@
-P 顯示當前系統中指定CPU的使用情況
-d 顯示系統所有硬盤設備在采樣時間內的使用狀況@
-r 顯示在采樣時間內系統內存的使用狀況@
-b 顯示在采樣時間內緩沖區的使用情況@
-v 顯示索引節點,文件和其他內核表的狀態
-n 顯示網絡運行狀態@
-q 顯示運行隊列的大小,它與系統當時的平均負載相同@
-R 顯示進程在采樣時間內的活動情況
-y 顯示終端設備在采樣時間內的活動情況
-w 顯示系統交換活動在采樣時間內的狀態
-o filename 將命令結果以二進制格式存放在文件中,filename是文件名

3.8.2 使用范例

(1)查看系統CPU的整體負載情況

[root@Mr_chen ~]# sar -u 2 3
Linux 2.6.32-431.el6.x86_64 (Mr_chen) 	03/10/2018 	_x86_64_	(1 CPU)

11:44:34 PM     CPU     %user     %nice   %system   %iowait    %steal     %idle
11:44:36 PM     all      0.00      0.00      1.00      0.00      0.00     99.00
11:44:38 PM     all      0.00      0.00      0.50      0.00      0.00     99.50
11:44:40 PM     all      0.00      0.00      0.00      0.00      0.00    100.00
Average:        all      0.00      0.00      0.50      0.00      0.00     99.50

以下是命令結果的詳細說明

  • [x] %user:用戶進程消耗的CPU時間百分比
  • [x] %nice:改變過優先級的進程占用的CPU時間百分比
  • [x] %system:系統(內核)進程消耗的CPU時間百分比
  • [x] %iowait:IO等待所占用的CPU時間百分比
  • [x] steal:虛擬機強制CPU等待的時間百分比
  • [x] idle:CPU處在空閑狀態的時間百分比

(2)顯示運行隊列的大小

[root@localhost ~]# sar -q 2 3  #使用-q選項顯示運行隊列的大小
Linux 2.6.32-431.el6.x86_64 (localhost) 	03/14/2018 	_x86_64_	(1 CPU)

04:59:18 PM   runq-sz  plist-sz   ldavg-1   ldavg-5  ldavg-15
04:59:20 PM         0        69      0.00      0.00      0.00
04:59:22 PM         0        69      0.00      0.00      0.00
04:59:24 PM         0        70      0.00      0.00      0.00
Average:            0        69      0.00      0.00      0.00

以下是命令結果的詳解說明

  • [x] runq-sz:運行隊列的長度(等待運行的進程數)
  • [x] plist-sz:進程列表中進程(process)和線程(thread)的數量
  • [x] ldavg-1:最后一分鍾的系統平均負載(system load average)
  • [x] ldavg-5:過去5分鍾的系統平均負載
  • [x] ldavg-15:過去15分鍾的系統平均負載

(3)顯示系統內存的使用狀況

[root@localhost ~]# sar -r 2 3  #使用-r選項顯示系統內存在采樣時間內的使用狀況
Linux 2.6.32-431.el6.x86_64 (localhost) 	03/14/2018 	_x86_64_	(1 CPU)

05:03:44 PM kbmemfree kbmemused  %memused kbbuffers  kbcached  kbcommit   %commit
05:03:46 PM    913012     91400      9.10     11136     23324     43344      1.43
05:03:48 PM    913012     91400      9.10     11136     23324     43344      1.43
05:03:50 PM    913012     91400      9.10     11136     23324     43344      1.43
Average:       913012     91400      9.10     11136     23324     43344      1.43

以下命令結果的詳細說明

  • [x] kbmemfree:空閑物理內存量
  • [x] kbmemused:使用中的物理內存量
  • [x] %memused:物理內存量的使用率
  • [x] kbbuffers:內核中作為緩沖區使用的物理內存容量
  • [x] kbcached:內核中作為緩存使用的物理內存容量
  • [x] kbcommit:應用程序當前使用的內存大小
  • [x] %commit:應用程序當前使用的內存大小占總大小的使用百分比

(4)顯示緩沖區的使用情況

[root@localhost ~]# sar -b 2 3  #使用-b選項顯示緩沖區在采樣時間內的使用情況
Linux 2.6.32-431.el6.x86_64 (localhost) 	03/14/2018 	_x86_64_	(1 CPU)

05:15:01 PM       tps      rtps      wtps   bread/s   bwrtn/s
05:15:03 PM      0.00      0.00      0.00      0.00      0.00
05:15:05 PM      0.00      0.00      0.00      0.00      0.00
05:15:07 PM      0.00      0.00      0.00      0.00      0.00
Average:         0.00      0.00      0.00      0.00      0.00

以下是命令的詳細結果說明

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

(5)顯示網絡的運行狀態

我們先來看一下顯示網絡接口信息的命令

[root@localhost ~]# sar -n DEV 2 3  #使用-n DEV顯示網絡接口的信息
Linux 2.6.32-431.el6.x86_64 (localhost) 	03/14/2018 	_x86_64_	(1 CPU)

05:22:13 PM     IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s
05:22:15 PM        lo      0.00      0.00      0.00      0.00      0.00      0.00      0.00
05:22:15 PM      eth0      0.00      0.00      0.00      0.00      0.00      0.00      0.00
05:22:15 PM      eth1      0.00      0.00      0.00      0.00      0.00      0.00      0.00

05:22:15 PM     IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s
05:22:17 PM        lo      0.00      0.00      0.00      0.00      0.00      0.00      0.00
05:22:17 PM      eth0      0.50      0.50      0.03      0.24      0.00      0.00      0.00
05:22:17 PM      eth1      0.00      0.00      0.00      0.00      0.00      0.00      0.00

05:22:17 PM     IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s
05:22:19 PM        lo      0.00      0.00      0.00      0.00      0.00      0.00      0.00
05:22:19 PM      eth0      0.50      0.50      0.03      0.24      0.00      0.00      0.00
05:22:19 PM      eth1      0.00      0.00      0.00      0.00      0.00      0.00      0.00

Average:        IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s
Average:           lo      0.00      0.00      0.00      0.00      0.00      0.00      0.00
Average:         eth0      0.33      0.33      0.02      0.16      0.00      0.00      0.00
Average:         eth1      0.00      0.00      0.00      0.00      0.00      0.00      0.00

以下是命令結果的詳細說明

  • [x] IFACE:網絡接口
  • [x] rxpck/s:每秒鍾接收的數據包
  • [x] txpck/s:每秒鍾發送的數據包
  • [x] rxkB/s:每秒鍾接收的字節數
  • [x] txkB/s:每秒鍾發送的字節數
  • [x] rxcmp/s:每秒鍾接收的壓縮數據包
  • [x] txcmp/s:每秒鍾發送的壓縮數據包
  • [x] rxmcst/s:每秒鍾接收的多播數據包

下面的命令用來顯示網絡錯誤的統計數據

[root@localhost ~]# sar -n EDEV 2 3 #使用-n EDEV顯示網絡錯誤的統計數據
Linux 2.6.32-431.el6.x86_64 (localhost) 	03/14/2018 	_x86_64_	(1 CPU)

05:32:03 PM     IFACE   rxerr/s   txerr/s    coll/s  rxdrop/s  txdrop/s  txcarr/s  rxfram/s  rxfifo/s  txfifo/s
05:32:05 PM        lo      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
05:32:05 PM      eth0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
05:32:05 PM      eth1      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00

05:32:05 PM     IFACE   rxerr/s   txerr/s    coll/s  rxdrop/s  txdrop/s  txcarr/s  rxfram/s  rxfifo/s  txfifo/s
05:32:07 PM        lo      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
05:32:07 PM      eth0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
05:32:07 PM      eth1      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00

05:32:07 PM     IFACE   rxerr/s   txerr/s    coll/s  rxdrop/s  txdrop/s  txcarr/s  rxfram/s  rxfifo/s  txfifo/s
05:32:09 PM        lo      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
05:32:09 PM      eth0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
05:32:09 PM      eth1      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00

Average:        IFACE   rxerr/s   txerr/s    coll/s  rxdrop/s  txdrop/s  txcarr/s  rxfram/s  rxfifo/s  txfifo/s
Average:           lo      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
Average:         eth0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
Average:         eth1      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00

以下是命令結果的詳細說明

  • [x] IFACE:網絡接口
  • [x] rxerr/s:每秒鍾接收的壞數據包
  • [x] txerr/s:每秒鍾發送的壞數據包
  • [x] coll/s:每秒的沖突數
  • [x] rxdrop/s:因為緩沖充滿,每秒鍾丟棄的已接收數據包數
  • [x] txdrop/s:因為緩沖充滿,每秒鍾丟棄的已發送數據包數
  • [x] txcarr/s:發送數據包時,每秒載波錯誤數
  • [x] rxfram/s:每秒接收數據包的幀對齊錯誤數
  • [x] rxfifo/s:接收的數據包每秒FIFO過速的錯誤數
  • [x] txfifo/s:發送的數據包每秒FIFO過速的錯誤數

下面的命令用於顯示套接字信息

[root@Mr_chen ~]# sar -n SOCK 2 3   #使用-n SOCK顯示套接字信息
Linux 2.6.32-431.el6.x86_64 (Mr_chen) 	03/14/2018 	_x86_64_	(1 CPU)

05:42:12 PM    totsck    tcpsck    udpsck    rawsck   ip-frag    tcp-tw
05:42:14 PM       281         2         0         0         0         0
05:42:16 PM       281         2         0         0         0         0
05:42:18 PM       281         2         0         0         0         0
Average:          281         2         0         0         0         0

以下是命令結果的詳細說明

  • [x] totsck:使用的套接字總數量
  • [x] tcpsck:使用的TCP套接字數量
  • [x] udpsck:使用的UDP套接字數量
  • [x] rawsck:使用的raw套接字數量
  • [x] ip-frag:使用的IP段數量
  • [x] tcp-tw:處於TIME_WAIT狀態的TCP套接字數量

(6)查看系統磁盤的讀寫性能

[root@Mr_chen ~]# sar -d 2 3    #使用-d選項顯示系統所有硬盤設備在采樣時間內的使用狀況
Linux 2.6.32-431.el6.x86_64 (Mr_chen) 	03/14/2018 	_x86_64_	(1 CPU)

05:47:59 PM       DEV       tps  rd_sec/s  wr_sec/s  avgrq-sz  avgqu-sz     await     svctm     %util
05:48:01 PM   dev11-0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
05:48:01 PM    dev8-0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
05:48:01 PM  dev253-0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
05:48:01 PM  dev253-1      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00

05:48:01 PM       DEV       tps  rd_sec/s  wr_sec/s  avgrq-sz  avgqu-sz     await     svctm     %util
05:48:03 PM   dev11-0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
05:48:03 PM    dev8-0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
05:48:03 PM  dev253-0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
05:48:03 PM  dev253-1      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00

05:48:03 PM       DEV       tps  rd_sec/s  wr_sec/s  avgrq-sz  avgqu-sz     await     svctm     %util
05:48:05 PM   dev11-0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
05:48:05 PM    dev8-0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
05:48:05 PM  dev253-0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
05:48:05 PM  dev253-1      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00

Average:          DEV       tps  rd_sec/s  wr_sec/s  avgrq-sz  avgqu-sz     await     svctm     %util
Average:      dev11-0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
Average:       dev8-0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
Average:     dev253-0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
Average:     dev253-1      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00

以下是命令結果的詳細說明

  • [x] DEV:表示磁盤的設備名稱
  • [x] tps:表示該設備每秒的傳輸次數,“一次傳輸”的意思是“一次I/O請求”,多個邏輯請求可能會被合並為“一次I/O請求”,“一次傳輸”請求的大小是未知的。
  • [x] rd_sec/s:表示每秒從設備讀取的扇區數
  • [x] wr_sec/s:表示每秒寫入設備的扇區數目
  • [x] avgrq-sz:設備平均每次I/O操作的數據大小(扇區)
  • [x] avgqu-sz:平均I/O隊列長度
  • [x] await:設備平均每次I/O操作的等待時間(毫秒)
  • [x] svctm:設備平均每次I/O操作的服務時間(毫秒)
  • [x] %util:每秒鍾用於I/O操作的百分比

四,Linux核心內置管理命令

4.1 占位符“:”

(1)在Shell腳本中使用占位符的例子

if [ $i -eq 1 ] #條件表達式
    then
        :  #在Shell腳本里若用到了if判斷語句,那么判斷成功后通常會執行某些操作,但有時會不                 知道執行什么操作或者不需要執行某些操作。但是又礙於if語句的固定語法格式,不                 得不寫一個命令占位置,因為這一行如果沒有內容就會語法報錯,此時就會用到“:”                 這個占位符,不過請放心,這個命令不會對你的Shell腳本造成任何影響,其有點像                 其他編程語言的pass字段一樣
else
    echo “hello world”
fi

4.2 ulimit修改系統資源使用限制

4.2.1 命令詳解

功能說明:

ulimit命令用於查看系統資源的使用情況,同時也可以修改進程或用戶等對系統資源分配的額度

選項說明:

參數選項 解釋說明
-a 顯示當前所有系統資源使用限制
-n 顯示或設置最多打開的文件數目

4.2.2 使用范例

(1)顯示當前所有系統資源使用限制

[root@Mr_chen ~]# ulimit -a 
core file size          (blocks, -c) 0  #core文件的最大值為100blocks
data seg size           (kbytes, -d) unlimited  #進程的數據段可以任意大
scheduling priority             (-e) 0          #調度優先級
file size               (blocks, -f) unlimited  #文件可以任意大
pending signals                 (-i) 7696       #最多有7696個待處理的信號
max locked memory       (kbytes, -l) 64         #一個任務鎖住的物理內存的最大值為64KB
max memory size         (kbytes, -m) unlimited  #一個任務的常駐物理內存的最大值
open files                      (-n) 1024       #一個任務最多可以同時打開1024個文件
pipe size            (512 bytes, -p) 8          #管道的最大空間為4096(512*8)字節
POSIX message queues     (bytes, -q) 819200     #POSIX的消息隊列的最大值為819200字節
real-time priority              (-r) 0          #real-time調度優先級
stack size              (kbytes, -s) 10240      #進程的棧的最大值為10240字節
cpu time               (seconds, -t) unlimited  #進程使用的CPU時間
max user processes              (-u) 7696       #當前用戶同時打開的進程(包括線程)的最大個數為7696
virtual memory          (kbytes, -v) unlimited  #沒有限制進程的最大地址空間
file locks                      (-x) unlimited  #所能鎖住的文件的最大個數沒有限制

(2)加大服務器打開文件描述符的數量

[root@Mr_chen ~]# ulimit -n
1024        #默認新系統的最大文件打開數(也叫文件描述符)為1024,這個值對於生產環境的服務器來說太小了,因此通常會在優化服務器環節把這個值調大
[root@Mr_chen ~]# ulimit -n 65535   #調整數量為65535,但是通過命令調整的只對當前窗口生效,因此需要修改配置文件
[root@Mr_chen ~]# ulimit -n
65535
[root@Mr_chen ~]# echo "* - nofile 65535" >> /etc/security/limits.conf  #修改配置文件永久生效,*表示針對任意用戶生效


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM