1. 程式人生 > >系統運行狀態查看和抓包工具的使用

系統運行狀態查看和抓包工具的使用

輸出顯示 inux 系統時間 iotop request deb 指定 sock tcp

監控io性能

iostat 命令
iostat 數值 #一秒輸出結果一次動態顯示

[root@localhost ~]# iostat 1
Linux 3.10.0-514.el7.x86_64 (localhost.localdomain) 2018年07月06日 _x86_64_    (1 CPU)

avg-cpu: %user %nice %system %iowait %steal %idle
           0.59 0.00 0.09 0.02 0.00 99.30

Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda 0.47 4.07 14.33 615626 2168024
sdb 0.00 0.02 0.00 2436 0
dm-0 0.00 0.01 0.00 912 0

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

Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda 0.00 0.00 0.00 0 0
sdb 0.00 0.00 0.00 0 0
dm-0 0.00 0.00 0.00 0 0

iostat -x 顯示io占用

[root@localhost ~]# iostat -x
Linux 3.10.0-514.el7.x86_64 (localhost.localdomain) 2018年07月06日 _x86_64_    (1 CPU)

avg-cpu: %user %nice %system %iowait %steal %idle
           0.59 0.00 0.09 0.02 0.00 99.30

Device: rrqm/s wrqm/s r/s w/s  rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sda     0.00   0.24  0.14 0.33 4.06  14.31 77.69    0.01     17.92  2.19    24.57  0.90  0.04
sdb     0.00   0.00  0.00 0.00 0.02  0.00  12.40    0.00     0.55   0.55    0.00   0.39  0.00
dm-0    0.00   0.00  0.00 0.00 0.01  0.00  15.20    0.00     0.33   0.33    0.00   0.30  0.00

iostat命令我們只可以關註%util 這項, 表示為io讀寫狀態占比,數值大表示io占用越高

iotop 命令
默認沒有iotop命令,需要使用yum安裝
yum install -y iotop
直接執行iotop就可以動態顯示出io動態讀寫狀態

 Total DISK READ :        0.00 B/s  |Total DISK WRITE :        3.90 K/s
  Actual DISK READ:        0.00 B/s  |Actual DISK WRITE:        39.01 K/s 
  TID   PRIO USER   DISK_READ DISK_WRITE   SWAPIN    IO>          COMMAND
  285   be/3 root   0.00 B/s  0.00 B/s      0.00 %   0.35 %       [jbd27vda18]
  24755 be/4 root   0.00 B/s  0.00 B/s      0.00 %   0.03 %       [kworker/l:21]
  2027  be/4 tomcat 0.OO B/s  3.90 K/s      0.00 %   0.00 %       java -server - Xms2048m - Xmx409~atalina .startup .Bootstrap start
  1     be/4 root   0.00 B/s  0.00 B/s      0.00 %   0.00 %       systemd --system --deserialize 
  212   be/4 root   0.00 B/s  0.00 B/s      0.00 %   0.00 %       [kthreadd]
  3     be/4 root   0.00 B/s I0.00 B/s      0.00 %   0.00 %       [ksoftirqd/0]
  6150  be/4 tomcat 0.00 B/s  0.O0 B/s      0.O0 %   0.O0 %       java -server - Xms2048m - Xmx4o9~atalina . startup.Bootstrap start

DISK READ:為磁盤的讀取速度,會以常見的容量單位顯示
DISK WRITE :為磁盤的寫入速度,同樣以常見的容量單位顯示
第三行分別為
TID 進程的IO使用ID
USER 運行用戶
DISK_READ 使用磁盤的讀取速度
DISK_WRITE 使用磁盤的寫入速度
SWAPIN 數據使用交換分區的占比
IO> 進程正在使用磁盤io的占比
COMMAND 使用磁盤的io進程

free查看內存使用狀態

 [root@localhost ~]# free
              total        used        free      shared  buff/cache   available
Mem:        1016476      117676      139440        6816      759360      692296
Swap:       2097148         228     2096920
[root@localhost ~]# free -m
              total        used        free      shared  buff/cache   available
Mem:            992         114         136           6         741         676
Swap:          2047           0        2047
[root@localhost ~]# free -h
              total        used        free      shared  buff/cache   available
Mem:           992M        114M        136M        6.7M        741M        676M
Swap:          2.0G        228K        2.0G

linux中內存表述是:總內存(total) = used + free + buff/cache 的容量,buff/cache是系統預分配內存
avaliable包含free和buff/cache剩余部分內存
關於buff/cache理解
buff/cache是系統預分配的內存空間,這部分空間是未使用的,作為緩存緩沖使用
計算機讀取運算數據時,會從硬盤讀數據到CPU處理,但是這中間磁盤的傳輸速率遠遠低於CPU運算速率,這樣會導致CPU會長時間等待硬盤的數據,為了時CPU不等待硬盤的數據讀取的怠慢,在CPU和硬盤間建立cache緩存層,CPU讀取數據時會從內存的cache當中讀取,不需要從硬盤讀取
當CPU處理完數據時會存儲到硬盤中,但是兩者數量相差大,CPU處理完的數據不可能等待數據慢慢存儲到硬盤,這時候就需要把CPU處理完的數據交給內存存儲,這部分數據叫做buff緩沖層,內存中的buff再存儲到硬盤中

ps命令

ps aux 查看系統中所有進程信息
ps -elf 查看系統中所有進程信息

[root@localhost ~]# ps -aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.3  43360  3244 ?        Ss   7月04   0:01 /usr/lib/systemd/systemd --system --deserialize 15
root         2  0.0  0.0      0     0 ?        S    7月04   0:00 [kthreadd]
root         9  0.0  0.0      0     0 ?        R    7月04   0:02 [rcu_sched]
root        12  0.0  0.0      0     0 ?        S<   7月04   0:00 [khelper]
root        27  0.0  0.0      0     0 ?        SN   7月04   0:00 [ksmd]
root       601  0.0  0.1  55476  1328 ?        S<sl 7月04   0:00 /sbin/auditd -n
polkitd    632  0.0  0.8 528332  8144 ?        Ssl  7月04   0:00 /usr/lib/polkit-1/polkitd --no-debu
root      2199  0.0  0.2 115836  2352 tty1     Ss+  7月04   0:00 -bash
root      3569  0.0  0.1 151112  1848 pts/0    R+   10:18   0:00 ps -aux

USER 運行進程的用戶
PID 進程的PID號,可以通過PID來查找PID進程的路徑,使用ls -l /proc/進程PID來查看進程所在目錄
%CPU cpu使用百分比
%MEM 內存使用百分比
VSZ 虛擬內存使用量
RSS 物理內存使用量
TTY 在哪個終端運行
STAT 進程運行狀態,這個是需要著重關註的,下面會詳解各種進程狀態
START 進程啟動時間
TIME 進程運行的累計時間
COMMAND 進程的運行路徑

STAT進程運行狀態

  • 正在前臺終端裏運行的進程
    D 不能中斷的進程,這類進程會使平均負載增高的假象,這時只能看CPU使用率來判斷是否負載過高
    R run運行狀態的進程
    S sleep休眠狀態的進程,這類進程可能是每隔一段時間運行一次,不運行狀態時會是sleep狀態,即休眠狀態
    T 暫停的進程,這類進程是命令或執行文件中止掛起的狀態,如top查看後按ctrl+z掛起
    Z 僵屍進程,主進程崩潰,遺留的子進程就有可能成為僵屍進程
    < 高優先級進程,進程會比其他進程優先得到CPU運算處理
    N 低優先級進程,不重要進程任務,會其次得到CPU運算
    L 內存中被鎖了內存分頁的進程,不常見
    s 主進程,屬於程序主進程,在該進程下會有其他類型的子進程,如Ssl 這是一個休眠中的多線程進程
    l 多線程進程,如httpd這樣的程序會生成多個進程,httpd的多線程如下:
    [root@localhost ~]# ps -aux |grep httpd
    root 1325 0.0 0.2 70956 2164 ? Ss 7月04 0:07 /usr/local/httpd/bin/httpd
    daemon 1326 0.0 0.4 490992 4760 ? Sl 7月04 0:00 /usr/local/httpd/bin/httpd
    daemon 1327 0.0 0.4 359920 4256 ? Sl 7月04 0:00 /usr/local/httpd/bin/httpd
    daemon 1328 0.0 0.4 359920 4256 ? Sl 7月04 0:00 /usr/local/httpd/bin/httpd
    root 3623 0.0 0.0 112724 972 pts/0 R+ 11:09 0:00 grep --color=auto httpd

    netstat網絡查看工具

    netstat -i查看網絡傳輸報文狀態

[root@localhost ~]# netstat -i
Kernel Interface table
Iface         MTU      RX-OK    RX-ERR   RX-DRP RX-OVR    TX-OK  TX-ERR TX-DRP TX-OVR     Flg
enp0s3    1500      349797      0              0                0             72139      0            0              0         BMRU
lo             65536    26560       0               0                0             26560      0            0              0         LRU

netstat -lnp 查看監聽端口

[root@localhost ~]# netstat -lnp
Active Internet connections (only servers)
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      1096/sshd 
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1405/master
tcp6       0      0 :::80                   :::*                    LISTEN      1325/httpd 
tcp6       0      0 :::22                   :::*                    LISTEN      1096/sshd 
tcp6       0      0 ::1:25                  :::*                    LISTEN      1405/master 

netstat -an 查看系統的網絡連接狀態並過濾出系統訪問的鏈接數

[root@localhost ~]# netstat -an |awk ‘/^tcp/{++sta[$NF]} END {for(key in sta) print key,"\t",sta[key]}‘
LISTEN   13
SYN_RECV     1
CLOSE_WAIT   7
ESTABLISHED      113
FIN_WAIT1    2
FIN_WAIT2    14
SYN_SENT     1
TIME_WAIT    119

netstat -lntp 只查看tcp網絡狀態,不包含socket進程文件的通信

[root@localhost ~]# netstat -lntp
(No info could be read for "-p": geteuid()=1001 but you should be root.)
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address     State       PID/Program name
tcp        0      0 0.0.0.0:8009            0.0.0.0:*            LISTEN      -  
tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN      - 
tcp        0      0 0.0.0.0:8080            0.0.0.0:*               LISTEN      -  
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      -  
tcp        0      0 0.0.0.0:43188           0.0.0.0:*               LISTEN      -
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      -
tcp        0      0 0.0.0.0:443             0.0.0.0:*               LISTEN      - 
tcp        0      0 127.0.0.1:32000         0.0.0.0:*               LISTEN      -
tcp        0      0 127.0.0.1:8005          0.0.0.0:*               LISTEN      -   
tcp6       0      0 :::111                  :::*                    LISTEN      -  
tcp6       0      0 :::80                   :::*                    LISTEN      -  
tcp6       0      0 :::34033                :::*                    LISTEN      - 
tcp6       0      0 :::443                  :::*                    LISTEN      -  

-a: 顯示所有的socket,包括監聽的以及未監聽的。
-n: 不使用域名和服務名,而使用IP和端口號。
-l: 僅列出在listen狀態的網絡服務。
-p: 顯示建立連接的程序名和PID。
-e: 顯示以太網統計。
-s: 顯示每個協議的統計。
-t:顯示TCP協議連接情況。
-u: 顯示UDP協議連接情況。
-c: 每隔一個固定時間,執行netstat命令。
-r:顯示核心路由表。
-i: 顯示所有的網絡接口信息

tcpdump抓包工具

默認沒有tcpdump工具,安裝yum install -y tcpdump

tcpdump  -nn -i  eth1   抓包過濾使用-nn直接顯示端口號,-i指定網卡
[root@localhost ~]# tcpdump -nn -i enp0s3
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on enp0s3, link-type EN10MB (Ethernet), capture size 262144 bytes
12:21:58.531390 IP 192.168.1.223.22 > 192.168.1.112.3152: Flags [P.], seq 541600822:541601034, ack 2246602278, win 251, length 212
12:21:58.532248 IP 192.168.1.223.22 > 192.168.1.112.3152: Flags [P.], seq 212:408, ack 1, win 251, length 196
12:21:58.532612 IP 192.168.1.112.3152 > 192.168.1.223.22: Flags [.], ack 212, win 16359, length 0
12:21:58.532888 IP 192.168.1.223.22 > 192.168.1.112.3152: Flags [P.], seq 408:668, ack 1, win 251, length 260

上面抓取的內容會抓取整個網卡通過的數據流,所有輸出顯示的較多,輸出的每一行格式為:當前系統時間 ?發送數據的起始IP ?> ?接收數據的IP ? 數據響應信息(如發送字節數,窗口值等)

tcpdump -nn port ?80 ?只抓取80端口的數據流信息,其中可以看出訪問頁面及響應狀態

[root@localhost ~]# tcpdump -nn port 80
12:29:16.489105 IP 192.168.1.112.7919 > 192.168.1.223.80: Flags [P.], seq 1:470, ack 1, win 16425, length 469: HTTP: GET /502.html HTTP/1.1
12:29:16.489210 IP 192.168.1.223.80 > 192.168.1.112.7919: Flags [.], ack 470, win 237, length 0
12:29:16.489997 IP 192.168.1.223.80 > 192.168.1.112.7919: Flags [P.], seq 1:180, ack 470, win 237, length 179: HTTP: HTTP/1.1 304 Not Modified

tcpdump -nn port 80 and host 192.168.1.112 只抓取特定ip過來的數據流信息
如192.168.1.112通過一個隨機的7770端口向192.168.1.223請求訪問報頭,192.168.1.223通過80端口向192.168.1.112的7770端口發送響應數據

[root@localhost ~]# tcpdump -nn port 80 and host 192.168.1.112
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on enp0s3, link-type EN10MB (Ethernet), capture size 262144 bytes
12:18:56.185132 IP 192.168.1.112.7770 > 192.168.1.223.80: Flags [S], seq 1158024991, win 8192, options [mss 1460,nop,wscale 2,nop,nop,sackOK], length 0
12:18:56.185209 IP 192.168.1.223.80 > 192.168.1.112.7770: Flags [S.], seq 1550338681, ack 1158024992, win 29200, options [mss 1460,nop,nop,sackOK,nop,wscale 7], length 0

tcpdump將抓包結果保存到文件
如抓取80的訪問流信息,文件保存到指定的目錄,使用tcpdump -r 記錄文件 來查看

[root@localhost ~]# tcpdump -nn port 80 -c 100 -w /tmp/1.cap
tcpdump: listening on enp0s3, link-type EN10MB (Ethernet), capture size 262144 bytes
100 packets captured
100 packets received by filter
0 packets dropped by kernel

查看tcpdump抓包保存的記錄文件內容,抓包產生的文件為數據流內容,直接使用cat命令是不可查看的,需要使用-r命令來讀取文件內容

[root@localhost ~]# tcpdump -r /tmp/1.cap 
reading from file /tmp/1.cap, link-type EN10MB (Ethernet)
12:35:22.487066 IP 192.168.1.112.pushns > localhost.localdomain.http: Flags [S], seq 2437427588, win 8192, options [mss 1460,nop,wscale 2,nop,nop,sackOK], length 0
12:35:22.487181 IP localhost.localdomain.http > 192.168.1.112.pushns: Flags [S.], seq 599616243, ack 2437427589, win 29200, options [mss 1460,nop,nop,sackOK,nop,wscale 7], length 0
12:35:22.489080 IP 192.168.1.112.pushns > localhost.localdomain.http: Flags [.], ack 1, win 16425, length 0
12:35:22.493077 IP 192.168.1.112.pushns > localhost.localdomain.http: Flags [P.], seq 1:496, ack 1, win 16425, length 495: HTTP: GET /502.html HTTP/1.1

tshark抓包工具
linux默認沒有安裝tshark工具,需要使用yum安裝:yum install -y wireshark

tshark -n -t a -R http.request -T fields -e "frame.time" -e "ip.src" -e "http.host" -e "http.request.method" -e "http.request.uri"

可以查看出80端口的web訪問狀態

[root@localhost ~]# tshark -n -t a -R http.request -T fields -e "frame.time" -e "ip.src" -e "http.host" -e "http.request.method" -e "http.request.uri"
tshark: -R without -2 is deprecated. For single-pass filtering use -Y.
Running as user "root" and group "root". This could be dangerous.
Capturing on ‘enp0s3‘
"Jul 6, 2018 12:47:58.618927019 CST"    192.168.1.111   239.255.255.250:1900    M-SEARCH    *
"Jul 6, 2018 12:48:02.620355558 CST"    192.168.1.112   192.168.1.223   GET /502.html
"Jul 6, 2018 12:48:04.367065418 CST"    192.168.1.103   239.255.255.250:1900    M-SEARCH    *
"Jul 6, 2018 12:48:19.200921492 CST"    192.168.1.112   192.168.1.223   GET /50

tshark使用參數的詳解請看轉載的另一篇文章:http://blog.51cto.com/8844414/2140567

系統運行狀態查看和抓包工具的使用