對於系統和網絡管理員來說每天監控和調試Linux系統的性能問題是一項繁重的工作。這些命令行工具可以在各種Linux系統下使用,可以用於監控和查找產生性能問題的原因。這個命令行工具列表提供了足夠的工具,您可以挑選適用於您的監控場景的工具。
1. lsof - 列出打開的文件
在許多Linux或者類Unix系統裡都有lsof命令,它常用於以列表的形式顯示所有打開的文件和進程。打開的文件包括磁盤文件、網絡套接字、管道、設備和進程。使用這條命令的主要情形之一就是在無法掛載磁盤和顯示正在使用或者打開某個文件的錯誤信息的時候。
常用的參數列表:
lsof filename 顯示打開指定文件的所有進程
lsof -a 表示兩個參數都必須滿足時才顯示結果
lsof -c string 顯示COMMAND列中包含指定字符的進程所有打開的文件
lsof -u username 顯示所屬user進程打開的文件
lsof -g gid 顯示歸屬gid的進程情況
lsof +d /DIR/ 顯示目錄下被進程打開的文件
lsof +D /DIR/ 同上,但是會搜索目錄下的所有目錄,時間相對較長
lsof -d FD 顯示指定文件描述符的進程
lsof -n 不將IP轉換為hostname,缺省是不加上-n參數
lsof -i 用以顯示符合條件的進程情況
查看22端口現在運行的情況
[root@CentOS7 ~]# lsof -i :22
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 925 root 3u IPv4 18374 0t0 TCP *:ssh (LISTEN)
sshd 925 root 4u IPv6 18383 0t0 TCP *:ssh (LISTEN)
sshd 9452 root 3u IPv4 1169003 0t0 TCP CentOS7.2:ssh->192.168.56.1:61347 (ESTABLISHED)
查看所屬root用戶進程所打開的文件類型為txt的文件
[root@CentOS7 ~]# lsof -a -u root -d txt
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd 1 root txt REG 0,34 1489960 56083 /usr/lib/systemd/systemd
kthreadd 2 root txt unknown /proc/2/exe
ksoftirqd 3 root txt unknown /proc/3/exe
migration 7 root txt unknown /proc/7/exe
rcu_bh 8 root txt unknown /proc/8/exe
2. top - 進程活動
top提供一個當前運行系統實時動態的視圖,也就是正在運行進程。在默認情況下,顯示系統中CPU使用率最高的任務,並每5秒鐘刷新一次。
常用熱鍵
t:顯示摘要信息開關
top - 11:20:12 up 2 days, 18:39, 3 users, load average: 0.00, 0.01, 0.05
Tasks: 173 total, 1 running, 172 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.3/0.7 1[| ]
KiB Mem : 500780 total, 13236 free, 249296 used, 238248 buff/cache
KiB Swap: 8388604 total, 7848788 free, 539816 used. 200108 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
17166 root 20 0 0 0 0 S 0.3 0.0 0:09.05 kworker/0:2
19196 root 20 0 146144 2056 1420 R 0.3 0.4 0:02.25 top
23944 root 20 0 1239128 38724 8388 S 0.3 7.7 6:39.63 firefox
1 root 20 0 191492 4212 2328 S 0.0 0.8 0:27.20 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:02.22 kthreadd
3 root 20 0 0 0 0 S 0.0 0.0 7:11.69 ksoftirqd/0
7 root rt 0 0 0 0 S 0.0 0.0 0:00.00 migration/0
8 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcu_bh
9 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcuob/0
10 root 20 0 0 0 0 S 0.0 0.0 6:09.07 rcu_sched
11 root 20 0 0 0 0 S 0.0 0.0 14:11.36 rcuos/0
12 root rt 0 0 0 0 S 0.0 0.0 0:03.03 watchdog/0
13 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 khelper
14 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kdevtmpfs
15 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 netns
16 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 perf
m:顯示內存信息開關
top - 11:22:12 up 2 days, 18:41, 3 users, load average: 0.00, 0.01, 0.05
Tasks: 173 total, 1 running, 172 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.3 sy, 0.0 ni, 99.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 60.0/500780 [|||||||||||||||||||||||||||||||||||||||||||||| ]
KiB Swap: 6.4/8388604 [||||| ]
A:分類顯示系統不同資源的使用大戶,有助於快速識別系統中資源消耗多的任務
1:Def - 11:23:40 up 2 days, 18:42, 3 users, load average: 0.00, 0.01, 0.05
Tasks: 174 total, 1 running, 173 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.7 us, 0.7 sy, 0.0 ni, 98.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 500780 total, 21124 free, 249376 used, 230280 buff/cache
KiB Swap: 8388604 total, 7848788 free, 539816 used. 200072 avail Mem
1 PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
920 root 20 0 644044 11096 3360 S 0.3 2.2 10:28.34 daomonit
19196 root 20 0 146144 2056 1420 R 0.3 0.4 0:03.00 top
1 root 20 0 191492 4212 2328 S 0.0 0.8 0:27.20 systemd
2 PID PPID TIME+ %CPU %MEM PR NI S VIRT RES UID COMMAND
24416 2 0:03.29 0.0 0.0 0 -20 S 0 0 0 kworker/0:2H
24365 1 0:00.04 0.0 0.3 20 0 S 238724 1380 0 gvfsd-metadata
23944 23598 6:40.25 0.0 7.7 20 0 S 1239128 38724 0 firefox
3 PID %MEM VIRT RES CODE DATA SHR nMaj nDRT %CPU COMMAND
23598 10.7 1473588 53752 16 746528 8912 26k 0 0.0 gnome-shell
23944 7.7 1239128 38724 108 582752 8388 46k 0 0.0 firefox
18581 3.2 110512 15824 392 12292 3364 23 0 0.0 dhclient
4 PID PPID UID USER RUSER TTY TIME+ %CPU %MEM S COMMAND
536 1 172 rtkit rtkit ? 0:03.06 0.0 0.1 S rtkit-daemon
1 0 0 root root ? 0:27.20 0.0 0.8 S systemd
2 0 0 root root ? 0:02.22 0.0 0.0 S kthreadd
3 2 0 root root ? 7:11.70 0.0 0.0 S ksoftirqd/0
f:添加刪除所要顯示欄位
Fields Management for window 1:Def, whose current sort field is PPID
Navigate with Up/Dn, Right selects for move then
'd' or
* PID = Process Id GROUP = Group Name TGID = Thread Group Id
* USER = Effective User Name PGRP = Process Group Id ENVIRON = Environment vars* PR = Priority TTY = Controlling Tty vMj = Major Faults delta
* NI = Nice Value TPGID = Tty Process Grp Id vMn = Minor Faults delta
* VIRT = Virtual Image (KiB) SID = Session Id USED = Res+Swap Size (KiB)
* RES = Resident Size (KiB) nTH = Number of Threads nsIPC=IPC namespace Inode
* SHR = Shared Memory (KiB) P = Last Used Cpu (SMP) nsMNT = MNT namespace Inode
* S = Process Status TIME = CPU Time nsNET = NET namespace Inode
* %MEM = Memory Usage (RES) SWAP = Swapped Size (KiB) nsPID=PID namespace Inode
* TIME+ = CPU Time, hundredths CODE = Code Size (KiB) nSUSER=USER namespace Inode
* COMMAND = Command Name/Line DATA = Data+Stack (KiB) nsUTS= UTS namespace Inode
* %CPU = CPU Usage nMaj = Major Page Faults
PPID = Parent Process pid nMin = Minor Page Faults
UID = Effective User Id nDRT = Dirty Pages Count
RUID = Real User Id WCHAN = Sleeping in Function
RUSER = Real User Name Flags = Task Flags
SUID = Saved User Id CGROUPS = Control Groups
SUSER = Saved User Name SUPGIDS = Supp Groups IDs
GID = Group Id SUPGRPS = Supp Groups Names
r:調整一個正在運行的進程Nice值
PID to renice [default pid = 920]
k:結束一個正在運行的進程
PID to signal/kill [default pid = 19156]
z:彩色/黑白顯示開關
3. vmstat -系統活動、硬件及系統信息
使用vmstat命令可以得到關於進程、內存、內存分頁、堵塞IO、traps及CPU活動的信息。
r:表示運行隊列(就是說多少個進程真的分配到CPU),我測試的服務器目前CPU比較空閒,沒 什麼程序在跑,當這個值超過了CPU數目,就會出現CPU瓶頸了。 這個也和top的負載有關系,一般負載超過了3就比較高,超過了5就高,超過了10就不正常了,服務器的狀態很危險。top的負載類似每秒的運行隊列。如果 運行隊列過大,表示你的CPU很繁忙,一般會造成CPU使用率很高。
b:表示阻塞的進程,這個不多說,進程阻塞,大家懂的。
swpd:虛擬內存已使用的大小,如果大於0,表示你的機器物理內存不足了,如果不是程序內存洩露的原因,那麼你該升級內存了或者把耗內存的任務遷移到其他機器。free:空閒的物理內存的大小,我的機器內存總共8G,剩余3415M。
buff:Linux/Unix系統是用來存儲,目錄裡面有什麼內容,權限等的緩存,我本機大概占用300多M
cache:cache直接用來記憶我們打開的文件,給文件做緩沖,我本機大概占用300多M(這裡是Linux/Unix的聰明之處,把空閒的物理內存的一部分拿來做文件和目錄的緩存,是為了提高程序執行的性能,當程序使用內存時,buffer/cached會很快地被使用。)
si:每秒從磁盤讀入虛擬內存的大小,如果這個值大於0,表示物理內存不夠用或者內存洩露了,要查找耗內存進程解決掉。我的機器內存充裕,一切正常。
so:每秒虛擬內存寫入磁盤的大小,如果這個值大於0,同上。
bi:塊設備每秒接收的塊數量,這裡的塊設備是指系統上所有的磁盤和其他塊設備,默認塊大小是1024byte,我本機上沒什麼IO操作,所以一直是0,但是我曾在處理拷貝大量數據(2-3T)的機器上看過可以達到140000/s,磁盤寫入速度差不多140M每秒。
bo:塊設備每秒發送的塊數量,例如我們讀取文件,bo就要大於0。bi和bo一般都要接近0,不然就是IO過於頻繁,需要調整。
in:每秒CPU的中斷次數,包括時間中斷
cs:每秒上下文切換次數,例如我們調用系統函數,就要進行上下文切換,線程的切換,也要進程上下文切換,這個值要越小越好,太大了,要考慮調低線程或者進程的數目,例如在apache和nginx這種web服務器中,我們一般做性能測試時會進行幾千並發甚至幾萬並發的測試,選擇web服務器的進程可以由進程或者線程的峰值一直下調,壓測,直到cs到一個比較小的值,這個進程和線程數就是比較合適的值了。系統調用也是,每次調用系統函數,我們的代碼就會進入內核空間,導致上下文切換,這個是很耗資源,也要盡量避免頻繁調系統函數。上下文切換次數過多表示你的CPU大部分浪費在上下文切換,導致CPU干正經事的時間少了,CPU沒有充分利用,是不可取的。
us:用戶CPU時間,我曾經在一個做加密解密很頻繁的服務器上,可以看到us接近100,r運行隊列達到80(機器在做壓力測試,性能表現不佳)。
sy:系統CPU時間,如果太高,表示系統調用時間長,例如是IO操作頻繁。
id:空閒 CPU時間,一般來說,id + us + sy = 100,一般我認為id是空閒CPU使用率,us是用戶CPU使用率,sy是系統CPU使用率。
wt:等待IO CPU時間。
[root@CentOS7 ~]# vmstat -m
Cache Num Total Size Pages
fuse_inode 10 10 768 10
nf_conntrack_ffff88001a2d8000 0 0 320 12
nf_conntrack_ffffffff81a25e00 180 180 320 12
kcopyd_job 0 0 3312 9
dm_uevent 0 0 2608 12
dm_rq_target_io 0 0 136 30
每隔3秒5次:
1 [root@CentOS7 ~]# vmstat 3 5
2 procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
3 r b swpd free buff cache si so bi bo in cs us sy id wa st
4 0 0 539680 17040 8 234828 508 252 7085 420 84 176 6 4 86 4 0
5 0 0 539680 17040 8 234828 0 0 0 0 29 53 0 0 100 0 0
6 1 0 539680 17040 8 234828 0 0 0 0 31 58 0 0 100 0 0
7 0 0 539680 17008 8 234828 0 0 0 0 34 67 0 0 100 0 0
8 1 0 539680 16668 8 234828 0 0 0 0 71 151 1 2 97 0 0
4. w - 顯示誰已登錄
w命令顯示系統當前用戶及其運行進程的信息。
[root@CentOS7 ~]# w root
12:26:14 up 2 days, 19:45, 3 users, load average: 0.05, 0.12, 0.13
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root :0 :0 Sat23 ?xdm? 1:08m 0.65s gdm-session-worker [pam/gdm-password]
root pts/0 192.168.56.1 Sun22 4:35m 0.61s 0.00s lsof
root pts/1 192.168.56.1 11:09 6.00s 0.20s 0.01s w root
5. uptime - 告訴系統已經運行了多久
uptime命令過去只顯示系統運行多久。現在,可以顯示系統運行多久、當前有多少的用戶登錄、在過去的1,5,15分鐘裡平均負載時多少。
[root@CentOS7 ~]# uptime
12:30:39 up 2 days, 19:49, 3 users, load average: 0.06, 0.08, 0.12
何為系統負載呢?
系統平均負載被定義為在特定時間間隔內運行隊列中的平均進程樹。如果一個進程滿足以下條件則其就會位於運行隊列中:
它沒有在等待I/O操作的結果
它沒有主動進入等待狀態(也就是沒有調用'wait')
沒有被停止(例如:等待終止)
一般來說,每個CPU內核當前活動進程數不大於3,則系統運行表現良好!當然這裡說的是每個cpu內核,也就是如果你的主機是四核cpu的話,那麼只要uptime最後輸出的一串字符數值小於12即表示系統負載不是很嚴重。當然如果達到20,那就表示當前系統負載非常嚴重。
6. ps - 顯示進程
Linux中的ps命令是Process Status的縮寫。ps命令用來列出系統中當前運行的那些進程。ps命令列出的是當前那些進程的快照,就是執行ps命令的那個時刻的那些進程,如果想要動態的顯示進程信息,就可以使用top命令。
要對進程進行監測和控制,首先必須要了解當前進程的情況,也就是需要查看當前進程,而 ps 命令就是最基本同時也是非常強大的進程查看命令。使用該命令可以確定有哪些進程正在運行和運行的狀態、進程是否結束、進程有沒有僵死、哪些進程占用了過多的資源等等。總之大部分信息都是可以通過執行該命令得到的。
ps為我們提供了進程的一次性的查看,它所提供的查看結果並不動態連續的;如果想對進程時間監控,應該用 top 工具。
linux上進程有5種狀態:
1. 運行(正在運行或在運行隊列中等待)
2. 中斷(休眠中, 受阻, 在等待某個條件的形成或接受到信號)
3. 不可中斷(收到信號不喚醒和不可運行, 進程必須等待直到有中斷發生)
4. 僵死(進程已終止, 但進程描述符存在, 直到父進程調用wait4()系統調用後釋放)
5. 停止(進程收到SIGSTOP, SIGSTP, SIGTIN, SIGTOU信號後停止運行運行)
ps工具標識進程的5種狀態碼:
D 不可中斷 uninterruptible sleep (usually IO)
R 運行 runnable (on run queue) S 中斷 sleeping T 停止 traced or stopped Z 僵死 a defunct (”zombie”) process
[root@linux ~]# ps aux
[root@linux ~]# ps -lA
[root@linux ~]# ps axjf
參數:
-A :所有的 process 均顯示出來,與 -e 具有同樣的效用;
-a :不與 terminal 有關的所有 process ;
-u :有效使用者 (effective user) 相關的 process ;
x :通常與 a 這個參數一起使用,可列出較完整信息。
輸出格式規劃:
l :較長、較詳細的將該 PID 的的信息列出;
j :工作的格式 (jobs format)
-f :做一個更為完整的輸出。
特別說明:由於 ps 能夠支持的 OS 類型相當的多,所以他的參數多的離譜!而且有沒有加上 - 差很多!詳細的用法應該要參考 man ps。
例1.將目前屬於您自己這次登入的 PID 與相關信息列示出來
[root@CentOS7 ~]# ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 19160 19156 0 80 0 - 29172 wait pts/1 00:00:00 bash
0 R 0 20465 19160 0 80 0 - 34343 - pts/1 00:00:00 ps
上面這個信息其實很多,各相關信息的意義為:
F:代表這個程序的flag,4代表使用者為super user
S:代表這個程序的狀態
PID:這個程序的ID
C:CPU 使用的資源百分比
PRI:這個是 Priority (優先執行序) 的縮寫
NI:這個是 Nice 值
ADDR:這個是 kernel function,指出該程序在內存的那個部分。如果是個 running的程序,一般就是『 - 』的啦!
SZ:使用掉的內存大小
WCHAN:目前這個程序是否正在運作當中,若為 - 表示正在運作
TTY:登入者的終端
TIME:使用掉的CPU時間
CMD:所下達的指令
例2.列出目前所有的正在內存當中的程序
[root@CentOS7 ~]# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.8 191492 4300 ? Ss May20 0:28 /usr/lib/systemd/systemd
root 2 0.0 0.0 0 0 ? S May20 0:02 [kthreadd]
root 3 0.1 0.0 0 0 ? S May20 7:12 [ksoftirqd/0]
root 7 0.0 0.0 0 0 ? S May20 0:00 [migration/0]
root 8 0.0 0.0 0 0 ? S May20 0:00 [rcu_bh]
root 9 0.0 0.0 0 0 ? S May20 0:00 [rcuob/0]
root 10 0.1 0.0 0 0 ? S May20 6:10 [rcu_sched]
root 11 0.3 0.0 0 0 ? S May20 14:13 [rcuos/0]
root 12 0.0 0.0 0 0 ? S May20 0:03 [watchdog/0]
root 13 0.0 0.0 0 0 ? S< May20 0:00 [khelper]
root 14 0.0 0.0 0 0 ? S May20 0:00 [kdevtmpfs]
root 15 0.0 0.0 0 0 ? S< May20 0:00 [netns]
root 16 0.0 0.0 0 0 ? S< May20 0:00 [perf]
USER:該 process 屬於那個使用者賬號的
PID :該 process 的號碼
%CPU:該 process 使用掉的 CPU 資源百分比
%MEM:該 process 所占用的物理內存百分比
VSZ :該 process 使用掉的虛擬內存量 (Kbytes)
RSS :該 process 占用的固定的內存量 (Kbytes)
TTY :該 process 是在那個終端機上面運作,若與終端機無關,則顯示 ?,另外, tty1-tty6 是本機上面的登入者
程序,若為 pts/0 等等的,則表示為由網絡連接進主機的程序
STAT:該程序目前的狀態,主要的狀態有:
R:該程序目前正在運作,或者是可被運作
S:該程序目前正在睡眠當中 (可說是 idle 狀態啦!),但可被某些訊號 (signal) 喚醒。
T:該程序目前正在偵測或者是停止了;
Z:該程序應該已經終止,但是其父程序卻無法正常的終止他,造成 zombie (疆屍) 程序的狀態
START:該 process 被觸發啟動的時間
TIME :該 process 實際使用 CPU 運作的時間
COMMAND:該程序的實際指令為
例3.顯示出所有的程序
[root@CentOS7 ~]# ps -lA
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 1 0 0 80 0 - 47873 ep_pol ? 00:00:29 systemd
1 S 0 2 0 0 80 0 - 0 kthrea ? 00:00:02 kthreadd
1 S 0 3 2 0 80 0 - 0 smpboo ? 00:07:13 ksoftirqd/0
1 S 0 7 2 0 -40 - - 0 smpboo ? 00:00:00 migration/0
1 S 0 8 2 0 80 0 - 0 rcu_gp ? 00:00:00 rcu_bh
1 S 0 9 2 0 80 0 - 0 rcu_no ? 00:00:00 rcuob/0
1 S 0 10 2 0 80 0 - 0 rcu_gp ? 00:06:12 rcu_sched
1 S 0 11 2 0 80 0 - 0 rcu_no ? 00:14:16 rcuos/0
5 S 0 12 2 0 -40 - - 0 smpboo ? 00:00:03 watchdog/0
1 S 0 13 2 0 60 -20 - 0 rescue ? 00:00:00 khelper
例4.列出類似程序樹的程序顯示
[root@CentOS7 ~]# ps -axjf
PPID PID PGID SID TTY TPGID STAT UID TIME COMMAND
0 2 0 0 ? -1 S 0 0:02 [kthreadd]
2 3 0 0 ? -1 S 0 7:13 \_ [ksoftirqd/0]
2 7 0 0 ? -1 S 0 0:00 \_ [migration/0]
2 8 0 0 ? -1 S 0 0:00 \_ [rcu_bh]
2 9 0 0 ? -1 S 0 0:00 \_ [rcuob/0]
2 10 0 0 ? -1 S 0 6:12 \_ [rcu_sched]
2 11 0 0 ? -1 S 0 14:16 \_ [rcuos/0]
例5.找出與 crypto 與 bash 這兩個服務有關的 PID 號碼
[root@CentOS7 ~]# ps aux | egrep '(crypto|bash)'
root 30 0.0 0.0 0 0 ? S< May20 0:00 [crypto]
root 597 0.0 0.1 115240 772 ? S May20 0:14 /bin/bash /usr/sbin/ksmtuned
root 23362 0.0 0.6 116556 3272 pts/0 Ss 16:50 0:00 -bash
root 23521 0.0 0.0 52852 44 ? Ss May21 0:01 /usr/bin/ssh-agent /bin/sh -c exec -l /bin/bash -c "env GNOME_SHELL_SESSION_MODE=classic gnome-session --session gnome-classic"
root 25992 0.0 0.1 112648 956 pts/0 S+ 20:08 0:00 grep -E --color=auto (crypto|bash)
7. free - 內存使用情況
[root@CentOS7 ~]# free
1 2 3 4 5 6
1 total used free shared buffers cached
2 Mem: 24677460 23276064 1401396 0 870540 12084008
3 -/+ buffers/cache: 10321516 14355944
4 Swap: 25151484 224188 24927296
free的輸出一共有四行,第四行為交換區的信息,分別是交換的總量(total),使用量(used)和有多少空閒的交換區(free),這個比較清楚,不說太多。
free輸出地第二行和第三行是比較讓人迷惑的。這兩行都是說明內存使用情況的。第一列是總量(total),第二列是使用量(used),第三列是可用量(free)。
第一行的輸出時從操作系統(OS)來看的。也就是說,從OS的角度來看,計算機上一共有:
24677460KB(缺省時free的單位為KB)物理內存,即FO[2][1];
在這些物理內存中有23276064KB(即FO[2][2])被使用了;
還用1401396KB(即FO[2][3])是可用的;
這裡得到第一個等式:
FO[2][1] = FO[2][2] + FO[2][3]
FO[2][4]表示被幾個進程共享的內存的,現在已經deprecated,其值總是0(當然在一些系統上也可能不是0,主要取決於free命令是怎麼實現的)。FO[2][5]表示被OS buffer住的內存。FO[2][6]表示被OS cache的內存。在有些時候buffer和cache這兩個詞經常混用。不過在一些比較低層的軟件裡是要區分這兩個詞的,看老外的洋文:
A buffer is something that has yet to be "written" to disk.
A cache is something that has been "read" from the disk and stored for later use.
free輸出的第二行是從一個應用程序的角度看系統內存的使用情況。
對於FO[3][2],即-buffers/cache,表示一個應用程序認為系統被用掉多少內存
對於FO[3][3],即+buffers/cache,表示一個應用程序認為系統還有多少內存
因為被系統cache和buffer占用的內存可以被快速回收,所以通常FO[3][3]比FO[2][3]會大很多。
這裡還用兩個等式:也就是說buffer是用於存放要輸出到disk(塊設備)的數據的,而cache是存放從disk上讀出的數據。這二者是為了提高IO性能的,並由OS管理。
FO[3][2] = FO[2][2] - FO[2][5] - FO[2][6]
FO[3][3] = FO[2][3] + FO[2][5] + FO[2][6]
8. iostat - CPU平均負載,硬盤活動
iostat命令可報告中央處理器(CPU)的統計信息,各種設備、分區及網絡文件系統輸入/輸出的統計信息。
[root@CentOS7 ~]# iostat
Linux 3.10.0-327.el7.x86_64 (CentOS7.2) 05/23/2016 _x86_64_ (1 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
5.20 0.00 3.53 3.54 0.00 87.73
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda 197.17 6120.99 371.74 1677443445 101873448
avg-cpu段:
%user: 在用戶級別運行所使用的CPU的百分比
%nice: nice操作所使用的CPU的百分比
%sys: 在系統級別(kernel)運行所使用CPU的百分比
%iowait: CPU等待硬件I/O時,所占用CPU百分比
%idle: CPU空閒時間的百分比
Device段:
tps: 每秒鐘發送到的I/O請求數
Blk_read /s: 每秒讀取的block數
Blk_wrtn/s: 每秒寫入的block數
Blk_read: 讀入的block總數
Blk_wrtn: 寫入的block總數
例.每隔2秒顯示一次sda及上面所有分區的統計信息,共輸出1次
[root@CentOS7 ~]# iostat -p sda 2 1
Linux 3.10.0-327.el7.x86_64 (CentOS7.2) 05/23/2016 _x86_64_ (1 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
5.19 0.00 3.52 3.54 0.00 87.75
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda 196.83 6110.31 371.21 1677443609 101907192
sda1 0.01 0.02 0.01 4585 2060
sda2 43.56 438.87 217.75 120482400 59778512
sda3 152.42 5671.42 153.45 1556955824 42126620
9. mpstat - 多處理器使用率
mpstat命令可以顯示所有可用處理器的使用情況,處理器編號從0開始。mpstat -P ALL顯示每個處理器的平均使用率。
[root@CentOS7 ~]# mpstat -P ALL
Linux 3.10.0-327.el7.x86_64 (CentOS7.2) 05/23/2016 _x86_64_ (1 CPU)
10:45:33 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
10:45:33 PM all 5.19 0.00 2.70 3.54 0.00 0.81 0.00 0.00 0.00 87.76
10:45:33 PM 0 5.19 0.00 2.70 3.54 0.00 0.81 0.00 0.00 0.00 87.76
10. pmap - 進程的內存使用
pmap命令可以顯示進程的內存映射,使用這個命令可以找出造成內存瓶頸的原因。
[root@CentOS7 ~]# pmap -d 23362
23362: -bash
Address Kbytes Mode Offset Device Mapping
0000000000400000 884 r-x-- 0000000000000000 000:00020 bash
00000000006dc000 4 r---- 00000000000dc000 000:00020 bash
00000000006dd000 36 rw--- 00000000000dd000 000:00020 bash
00000000006e6000 24 rw--- 0000000000000000 000:00000 [ anon ]
000000000221d000 1576 rw--- 0000000000000000 000:00000 [ anon ]
00007f7d3fc3d000 103580 r---- 0000000000000000 000:00020 locale-archive
00007f7d46164000 44 r-x-- 0000000000000000 000:00020 libnss_files-2.17.so
00007f7d4616f000 2044 ----- 000000000000b000 000:00020 libnss_files-2.17.so
00007f7d4636e000 4 r---- 000000000000a000 000:00020 libnss_files-2.17.so
00007f7d4636f000 4 rw--- 000000000000b000 000:00020 libnss_files-2.17.so
00007f7d46370000 24 rw--- 0000000000000000 000:00000 [ anon ]
00007f7d46376000 1752 r-x-- 0000000000000000 000:00020 libc-2.17.so
00007f7d4652c000 2048 ----- 00000000001b6000 000:00020 libc-2.17.so
00007f7d4672c000 16 r---- 00000000001b6000 000:00020 libc-2.17.so
00007f7d46730000 8 rw--- 00000000001ba000 000:00020 libc-2.17.so
00007f7d46732000 20 rw--- 0000000000000000 000:00000 [ anon ]
00007f7d46737000 12 r-x-- 0000000000000000 000:00020 libdl-2.17.so
00007f7d4673a000 2044 ----- 0000000000003000 000:00020 libdl-2.17.so
00007f7d46939000 4 r---- 0000000000002000 000:00020 libdl-2.17.so
00007f7d4693a000 4 rw--- 0000000000003000 000:00020 libdl-2.17.so
00007f7d4693b000 148 r-x-- 0000000000000000 000:00020 libtinfo.so.5.9
00007f7d46960000 2048 ----- 0000000000025000 000:00020 libtinfo.so.5.9
00007f7d46b60000 16 r---- 0000000000025000 000:00020 libtinfo.so.5.9
00007f7d46b64000 4 rw--- 0000000000029000 000:00020 libtinfo.so.5.9
00007f7d46b65000 132 r-x-- 0000000000000000 000:00020 ld-2.17.so
00007f7d46d6d000 12 rw--- 0000000000000000 000:00000 [ anon ]
00007f7d46d7c000 4 rw--- 0000000000000000 000:00000 [ anon ]
00007f7d46d7d000 28 r--s- 0000000000000000 000:00020 gconv-modules.cache
00007f7d46d84000 8 rw--- 0000000000000000 000:00000 [ anon ]
00007f7d46d86000 4 r---- 0000000000021000 000:00020 ld-2.17.so
00007f7d46d87000 4 rw--- 0000000000022000 000:00020 ld-2.17.so
00007f7d46d88000 4 rw--- 0000000000000000 000:00000 [ anon ]
00007fffc4354000 132 rw--- 0000000000000000 000:00000 [ stack ]
00007fffc43e0000 8 r-x-- 0000000000000000 000:00000 [ anon ]
ffffffffff600000 4 r-x-- 0000000000000000 000:00000 [ anon ]
mapped: 116688K writeable/private: 1864K shared: 28K
最後一行非常重要:
mapped: 116688K 內存映射所占空間大小
writeable/private: 1864K 私有地址空間大小
shared: 28K 共享地址空間大小
11. netstat和ss - 網絡相關信息
Netstat 命令用於顯示各種網絡相關信息,如網絡連接,路由表,接口狀態 (Interface Statistics),masquerade 連接,多播成員 (Multicast Memberships) 等等。
從整體上看,netstat的輸出結果可以分為兩個部分:
一個是Active Internet connections,稱為有源TCP連接,其中"Recv-Q"和"Send-Q"指%0A的是接收隊列和發送隊列。這些數字一般都應該是0。如果不是則表示軟件包正在隊列中堆積。這種情況只能在非常少的情況見到。
另一個是Active UNIX domain sockets,稱為有源Unix域套接口(和網絡套接字一樣,但是只能用於本機通信,性能可以提高一倍)。Proto顯示連接使用的協議,RefCnt表示連接到本套接口上的進程號,Types顯示套接口的類型,State顯示套接口當前的狀態,Path表示連接到套接口的其它進程使用的路徑名。
[root@CentOS7 ~]# netstat
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 10.0.2.15:33164 ec2-54-191-11-118:https ESTABLISHED
tcp 0 0 10.0.2.15:52665 123.59.42.81:https ESTABLISHED
tcp 0 52 CentOS7.2:ssh 192.168.56.1:61340 ESTABLISHED
tcp 0 0 10.0.2.15:53607 123.59.42.81:https ESTABLISHED
tcp 0 0 10.0.2.15:52666 123.59.42.81:https ESTABLISHED
tcp 0 0 10.0.2.15:52321 123.59.42.81:https ESTABLISHED
tcp 0 0 10.0.2.15:40108 123.59.138.92:https ESTABLISHED
tcp 0 0 10.0.2.15:55494 123.59.42.81:https ESTABLISHED
tcp 0 0 10.0.2.15:55490 123.59.42.81:https ESTABLISHED
tcp 0 0 10.0.2.15:53608 123.59.42.81:https ESTABLISHED
tcp 0 0 10.0.2.15:55495 123.59.42.81:https ESTABLISHED
tcp 0 0 10.0.2.15:54883 123.59.42.81:https ESTABLISHED
Active UNIX domain sockets (w/o servers)
Proto RefCnt Flags Type State I-Node Path
unix 2 [ ] DGRAM 6846 /run/systemd/notify
unix 5 [ ] DGRAM 6858 /run/systemd/journal/socket
unix 22 [ ] DGRAM 6860 /dev/log
unix 2 [ ] DGRAM 9469 /run/systemd/shutdownd
unix 2 [ ] DGRAM 14069
unix 2 [ ] DGRAM 1048183
unix 3 [ ] STREAM CONNECTED 1046317
常見參數
-a (all)顯示所有選項,默認不顯示LISTEN相關
-t (tcp)僅顯示tcp相關選項
-u (udp)僅顯示udp相關選項
-n 拒絕顯示別名,能顯示數字的全部轉化成數字。
-l 僅列出有在 Listen (監聽) 的服務狀態
-p 顯示建立相關鏈接的程序名
-r 顯示路由信息,路由表
-e 顯示擴展信息,例如uid等
-s 按各個協議進行統計
-c 每隔一個固定時間,執行該netstat命令。
提示:LISTEN和LISTENING的狀態只有用-a或者-l才能看到
[root@CentOS7 ~]# netstat -at 列出所有 tcp 端口
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 192.168.122.1:domain 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:ssh 0.0.0.0:* LISTEN
tcp 0 0 localhost:ipp 0.0.0.0:* LISTEN
tcp 0 0 localhos:x11-ssh-offset 0.0.0.0:* LISTEN
tcp 0 0 10.0.2.15:33164 ec2-54-191-11-118:https ESTABLISHED
tcp 0 0 10.0.2.15:52665 123.59.42.81:https ESTABLISHED
tcp 0 52 CentOS7.2:ssh 192.168.56.1:61340 ESTABLISHED
tcp 0 0 10.0.2.15:53607 123.59.42.81:https ESTABLISHED
tcp 0 0 10.0.2.15:52666 123.59.42.81:https ESTABLISHED
tcp 0 0 10.0.2.15:37671 123.59.87.202:https ESTABLISHED
tcp 0 0 10.0.2.15:52321 123.59.42.81:https ESTABLISHED
tcp 0 0 10.0.2.15:55494 123.59.42.81:https ESTABLISHED
tcp 0 0 10.0.2.15:55490 123.59.42.81:https ESTABLISHED
tcp 0 0 10.0.2.15:53608 123.59.42.81:https ESTABLISHED
tcp 0 0 10.0.2.15:55495 123.59.42.81:https ESTABLISHED
tcp 0 0 10.0.2.15:54883 123.59.42.81:https ESTABLISHED
tcp6 0 0 [::]:ssh [::]:* LISTEN
tcp6 0 0 localhost:ipp [::]:* LISTEN
tcp6 0 0 localhos:x11-ssh-offset [::]:* LISTEN
[root@CentOS7 ~]# netstat -au 列出所有 udp 端口
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
udp 0 0 0.0.0.0:mdns 0.0.0.0:*
udp 0 0 0.0.0.0:53491 0.0.0.0:*
udp 0 0 0.0.0.0:47643 0.0.0.0:*
udp 0 0 192.168.122.1:domain 0.0.0.0:*
udp 0 0 0.0.0.0:bootps 0.0.0.0:*
udp 0 0 localhost:323 0.0.0.0:*
udp 0 0 0.0.0.0:bootpc 0.0.0.0:*
udp 0 0 0.0.0.0:bootpc 0.0.0.0:*
udp 0 0 0.0.0.0:14662 0.0.0.0:*
udp6 0 0 [::]:49441 [::]:*
udp6 0 0 localhost:323 [::]:*
udp6 0 0 [::]:61519 [::]:*
[root@CentOS7 ~]# netstat -lt 只列出所有監聽 tcp 端口
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 192.168.122.1:domain 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:ssh 0.0.0.0:* LISTEN
tcp 0 0 localhost:ipp 0.0.0.0:* LISTEN
tcp 0 0 localhos:x11-ssh-offset 0.0.0.0:* LISTEN
tcp6 0 0 [::]:ssh [::]:* LISTEN
tcp6 0 0 localhost:ipp [::]:* LISTEN
tcp6 0 0 localhos:x11-ssh-offset [::]:* LISTEN
[root@CentOS7 ~]# netstat -lu 只列出所有監聽 udp 端口
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
udp 0 0 0.0.0.0:mdns 0.0.0.0:*
udp 0 0 0.0.0.0:53491 0.0.0.0:*
udp 0 0 0.0.0.0:47643 0.0.0.0:*
udp 0 0 192.168.122.1:domain 0.0.0.0:*
udp 0 0 0.0.0.0:bootps 0.0.0.0:*
udp 0 0 localhost:323 0.0.0.0:*
udp 0 0 0.0.0.0:bootpc 0.0.0.0:*
udp 0 0 0.0.0.0:bootpc 0.0.0.0:*
udp 0 0 0.0.0.0:14662 0.0.0.0:*
udp6 0 0 [::]:49441 [::]:*
udp6 0 0 localhost:323 [::]:*
udp6 0 0 [::]:61519 [::]:*
[root@CentOS7 ~]# netstat -lu 只列出所有監聽 udp 端口
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
udp 0 0 0.0.0.0:mdns 0.0.0.0:*
udp 0 0 0.0.0.0:53491 0.0.0.0:*
udp 0 0 0.0.0.0:47643 0.0.0.0:*
udp 0 0 192.168.122.1:domain 0.0.0.0:*
udp 0 0 0.0.0.0:bootps 0.0.0.0:*
udp 0 0 localhost:323 0.0.0.0:*
udp 0 0 0.0.0.0:bootpc 0.0.0.0:*
udp 0 0 0.0.0.0:bootpc 0.0.0.0:*
udp 0 0 0.0.0.0:14662 0.0.0.0:*
udp6 0 0 [::]:49441 [::]:*
udp6 0 0 localhost:323 [::]:*
udp6 0 0 [::]:61519 [::]:*
[root@CentOS7 ~]# netstat -lx 只列出所有監聽 UNIX 端口
Active UNIX domain sockets (only servers)
Proto RefCnt Flags Type State I-Node Path
unix 2 [ ACC ] STREAM LISTENING 1046533 /run/user/0/pulse/native
unix 2 [ ACC ] STREAM LISTENING 9738 /run/lvm/lvmpolld.socket
unix 2 [ ACC ] STREAM LISTENING 1046289 /run/user/0/keyring/pkcs11
unix 2 [ ACC ] STREAM LISTENING 1046292 /run/user/0/keyring/ssh
unix 2 [ ACC ] STREAM LISTENING 1044502 /run/user/0/keyring/control
unix 2 [ ACC ] STREAM LISTENING 19100 @/tmp/.X11-unix/X0
顯示 TCP 或 UDP 端口的統計信息 netstat -st 或 -su
[root@CentOS7 ~]# netstat -st
IcmpMsg:
InType3: 42
InType11: 24
OutType3: 48
Tcp:
71276 active connections openings
26415 passive connection openings
443 failed connection attempts
22567 connection resets received
13 connections established
6169222 segments received
6167435 segments send out
1531 segments retransmited
0 bad segments received.
101775 resets sent
UdpLite:
TcpExt:
4160 TCP sockets finished time wait in fast timer
159348 delayed acks sent
243 delayed acks further delayed because of locked socket
Quick ack mode was activated 64 times
119 packets directly queued to recvmsg prequeue.
113274 bytes directly in process context from backlog
346692 bytes directly received in process context from prequeue
642042 packet headers predicted
151 packets header predicted and directly queued to user
2108179 acknowledgments not containing data payload received
833025 predicted acknowledgments
49 congestion windows recovered without slow start after partial ack
6 retransmits in slow start
172 other TCP timeouts
TCPLossProbes: 855
TCPLossProbeRecovery: 831
48 DSACKs sent for old packets
863 DSACKs received
20455 connections reset due to unexpected data
44 connections reset due to early user close
21 connections aborted due to timeout
TCPDSACKIgnoredNoUndo: 833
TCPSpuriousRTOs: 4
IPReversePathFilter: 314
TCPRetransFail: 10
TCPRcvCoalesce: 30786
TCPChallengeACK: 7
TCPSpuriousRtxHostQueues: 29
TCPAutoCorking: 1236
TCPSynRetrans: 616
TCPOrigDataSent: 1370187
TCPHystartTrainDetect: 4
TCPHystartTrainCwnd: 82
IpExt:
InNoRoutes: 32
InMcastPkts: 1724
OutMcastPkts: 738
InBcastPkts: 43901
InOctets: 1655483718
OutOctets: 1440836672
InMcastOctets: 374261
OutMcastOctets: 119692
InBcastOctets: 3810738
InNoECTPkts: 6421160
[root@CentOS7 ~]# netstat -su
IcmpMsg:
InType3: 42
InType11: 24
OutType3: 48
Udp:
115000 packets received
48 packets to unknown port received.
0 packet receive errors
114624 packets sent
0 receive buffer errors
0 send buffer errors
UdpLite:
IpExt:
InNoRoutes: 32
InMcastPkts: 1724
OutMcastPkts: 738
InBcastPkts: 43901
InOctets: 1655485325
OutOctets: 1440841862
InMcastOctets: 374261
OutMcastOctets: 119692
InBcastOctets: 3810738
InNoECTPkts: 6421188
在 netstat 輸出中顯示 PID 和進程名稱
[root@CentOS7 ~]# netstat -pt
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 10.0.2.15:33164 ec2-54-191-11-118:https ESTABLISHED 23944/firefox
tcp 0 0 10.0.2.15:52665 123.59.42.81:https ESTABLISHED 24872/daotunnel
tcp 0 388 CentOS7.2:ssh 192.168.56.1:61340 ESTABLISHED 23358/sshd: root@pt
tcp 0 0 10.0.2.15:53607 123.59.42.81:https ESTABLISHED 24872/daotunnel
tcp 0 0 10.0.2.15:52666 123.59.42.81:https ESTABLISHED 24872/daotunnel
tcp 0 0 10.0.2.15:52321 123.59.42.81:https ESTABLISHED 24872/daotunnel
tcp 0 0 10.0.2.15:40833 123.59.87.200:https ESTABLISHED 920/daomonit
netstat 將每隔一秒輸出網絡信息
[root@CentOS7 ~]# netstat -c
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 10.0.2.15:33164 ec2-54-191-11-118:https ESTABLISHED
tcp 0 0 10.0.2.15:52665 123.59.42.81:https ESTABLISHED
tcp 0 52 CentOS7.2:ssh 192.168.56.1:61340 ESTABLISHED
顯示系統不支持的地址族
[root@CentOS7 ~]# netstat --verbose
netstat: no support for `AF IPX' on this system.
netstat: no support for `AF AX25' on this system.
netstat: no support for `AF X25' on this system.
netstat: no support for `AF NETROM' on this system.
顯示核心路由信息
[root@CentOS7 ~]# netstat -r
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
default 10.0.2.2 0.0.0.0 UG 0 0 0 eth0
10.0.2.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker0
192.168.56.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
192.168.122.0 0.0.0.0 255.255.255.0 U 0 0 0 virbr0
找出程序運行的端口
[root@CentOS7 ~]# netstat -ap | grep ssh
tcp 0 0 0.0.0.0:ssh 0.0.0.0:* LISTEN 925/sshd
tcp 0 0 localhos:x11-ssh-offset 0.0.0.0:* LISTEN 23358/sshd: root@pt
tcp 0 52 CentOS7.2:ssh 192.168.56.1:61340 ESTABLISHED 23358/sshd: root@pt
顯示網絡接口列表
[root@CentOS7 ~]# netstat -i
Kernel Interface table
Iface MTU RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg
docker0 1500 186339 0 0 0 186275 0 0 0 BMU
eth0 1500 866623 0 0 0 747980 0 0 0 BMRU
eth1 1500 101288 0 0 0 83187 0 0 0 BMRU
lo 65536 5276771 0 0 0 5276771 0 0 0 LRU
virbr0 1500 0 0 0 0 0 0 0 0 BMU
ss是Socket Statistics的縮寫。顧名思義,ss命令可以用來獲取socket統計信息,它可以顯示和netstat類似的內容。但ss的優勢在於它能夠顯示更多更詳細的有關TCP和連接狀態的信息,而且比netstat更快速更高效。
命令參數:
-h, --help 幫助信息
-V, --version 程序版本信息
-n, --numeric 不解析服務名稱
-r, --resolve 解析主機名
-a, --all 顯示所有套接字(sockets)
-l, --listening 顯示監聽狀態的套接字(sockets)
-o, --options 顯示計時器信息
-e, --extended 顯示詳細的套接字(sockets)信息
-m, --memory 顯示套接字(socket)的內存使用情況
-p, --processes 顯示使用套接字(socket)的進程
-i, --info 顯示 TCP內部信息
-s, --summary 顯示套接字(socket)使用概況
-4, --ipv4 僅顯示IPv4的套接字(sockets)
-6, --ipv6 僅顯示IPv6的套接字(sockets)
-0, --packet 顯示 PACKET 套接字(socket)
-t, --tcp 僅顯示 TCP套接字(sockets)
-u, --udp 僅顯示 UCP套接字(sockets)
-d, --dccp 僅顯示 DCCP套接字(sockets)
-w, --raw 僅顯示 RAW套接字(sockets)
-x, --unix 僅顯示 Unix套接字(sockets)
-f, --family=FAMILY 顯示 FAMILY類型的套接字(sockets),FAMILY可選,支持 unix, inet, inet6, link, netlink
-A, --query=QUERY, --socket=QUERY
QUERY := {all|inet|tcp|udp|raw|unix|packet|netlink}[,QUERY]
-D, --diag=FILE 將原始TCP套接字(sockets)信息轉儲到文件
-F, --filter=FILE 從文件中都去過濾器信息
FILTER := [ state TCP-STATE ] [ EXPRESSION ]
顯示TCP連接
[root@CentOS7 ~]# ss -t -a
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 5 192.168.122.1:domain *:*
LISTEN 0 128 *:ssh *:*
LISTEN 0 128 127.0.0.1:ipp *:*
LISTEN 0 128 127.0.0.1:x11-ssh-offset *:*
ESTAB 0 0 10.0.2.15:33164 54.191.11.118:https
顯示 Sockets 摘要
[root@CentOS7 ~]# ss -s
Total: 555 (kernel 567)
TCP: 21 (estab 13, closed 1, orphaned 0, synrecv 0, timewait 0/0), ports 0
Transport Total IP IPv6
* 567 - -
RAW 2 0 2
UDP 14 11 3
TCP 20 17 3
INET 36 28 8
FRAG 0 0 0
列出所有打開的網絡連接端口
[root@CentOS7 ~]# ss -l
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
nl UNCONN 0 0 rtnl:1216349100 *
nl UNCONN 0 0 rtnl:2059403794 *
nl UNCONN 0 0 rtnl:geoclue/23600 *
查看進程使用的socket
[root@CentOS7 ~]# ss -pl
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
nl UNCONN 0 0 rtnl:1216349100 *
nl UNCONN 0 0 rtnl:2059403794 *
顯示所有UDP Sockets
[root@CentOS7 ~]# ss -u -a
State Recv-Q Send-Q Local Address:Port Peer Address:Port
UNCONN 0 0 *:mdns *:*
UNCONN 0 0 *:53491 *:*
ESTAB 0 0 10.0.2.15:42245 120.25.108.11:ntp
UNCONN 0 0 *:47643 *:*
UNCONN 0 0 192.168.122.1:domain *:*
UNCONN 0 0 *%virbr0:bootps *:*
UNCONN 0 0 127.0.0.1:323 *:*
UNCONN 0 0 *:bootpc *:*
UNCONN 0 0 *:bootpc *:*
UNCONN 0 0 *:14662 *:*
ESTAB 0 0 10.0.2.15:39026 202.118.1.81:ntp
12. tcpdump:詳細的網絡流量分析
用簡單的話來定義tcpdump,就是:dump the traffic on a network,根據使用者的定義對網絡上的數據包進行截獲的包分析工具。 tcpdump可以將網絡中傳送的數據包的“頭”完全截獲下來提供分析。它支持針對網絡層、協議、主機、網絡或端口的過濾,並提供and、or、not等邏輯語句來幫助你去掉無用的信息。
參數:
-nn,直接以 IP 及 Port Number 顯示,而非主機名與服務名稱。
-i,後面接要「監聽」的網絡接口,例如 eth0, lo, ppp0 等等的接口。
-w,如果你要將監聽所得的數據包數據儲存下來,用這個參數就對了。後面接文件名。
-c,監聽的數據包數,如果沒有這個參數, tcpdump 會持續不斷的監聽,直到用戶輸入 [ctrl]-c 為止。
-A,數據包的內容以 ASCII 顯示,通常用來捉取 WWW 的網頁數據包資料。
-e,使用資料連接層 (OSI 第二層) 的 MAC 數據包數據來顯示。
-q,僅列出較為簡短的數據包信息,每一行的內容比較精簡。
-X,可以列出十六進制 (hex) 以及 ASCII 的數據包內容,對於監聽數據包內容很有用。
-r,從後面接的文件將數據包數據讀出來。那個「文件」是已經存在的文件,並且這個「文件」是由 -w 所制作出來的。
所欲捕獲的數據內容:我們可以專門針對某些通信協議或者是 IP 來源進行數據包捕獲。那就可以簡化輸出的結果,並取得最有用的信息。
常見的表示方法有:
'host foo', 'host 127.0.0.1' :針對單台主機來進行數據包捕獲。
'net 192.168' :針對某個網段來進行數據包的捕獲。
'src host 127.0.0.1' 'dst net 192.168':同時加上來源(src)或目標(dst)限制。
'tcp port 21':還可以針對通信協議檢測,如tcp、udp、arp、ether 等。
除了這三種類型的關鍵字之外,其他重要的關鍵字如下:gateway, broadcast,less,greater,還有三種邏輯運算,取非運算是 'not ' '! ', 與運算是'and','&&';或運算 是'or' ,'||'。
[root@CentOS7 ~]# tcpdump -i eth0
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
02:58:12.453576 IP 10.0.2.15.41384 > 123.59.138.93.https: Flags [F.], seq 3046243613, ack 2957421906, win 42600, length 0
02:58:12.453863 IP 123.59.138.93.https > 10.0.2.15.41384: Flags [.], ack 1, win 65535, length 0
02:58:12.454352 IP 10.0.2.15.43009 > 112.54.207.8.domain: 15449+ PTR? 93.138.59.123.in-addr.arpa. (44)
02:58:12.484893 IP 123.59.138.93.https > 10.0.2.15.41384: Flags [P.], seq 1:54, ack 1, win 65535, length 53
02:58:12.484932 IP 10.0.2.15.41384 > 123.59.138.93.https: Flags [R], seq 3046243614, win 0, length 0
02:58:12.485000 IP 123.59.138.93.https > 10.0.2.15.41384: Flags [F.], seq 54, ack 1, win 65535, length 0
35 packets captured
162 packets received by filter
97 packets dropped by kernel