Linux系統管理工具-iostat、free、ps、netstat、tcpdump

10.6 監控io性能

iostat命令

iostat命令被用於監視系統輸入輸出設備和CPU的使用狀況。它的特色是彙報磁盤活動統計狀況,同時也會彙報出CPU使用狀況。同vmstat同樣,iostat也有一個弱點,就是它不能對某個進程進行深刻分析,僅對系統的總體狀況進行分析。mysql

  • iostat -x
[root@1 ~]# iostat -x
Linux 3.10.0-514.el7.x86_64 (adai003) 	2017年07月11日 	_x86_64_	(1 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.12    0.00    0.24    0.25    0.00   99.39

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.06    0.45    0.30    16.50     4.06    54.39     0.02   31.35   32.52   29.60   6.25   0.47
scd0              0.00     0.00    0.00    0.00     0.00     0.00     8.00     0.00  170.45  170.45    0.00 170.45   0.01

說明: util%:表示io等待佔比,正常狀況下該值和磁盤讀寫(r/w)成正比,若是該值很大,讀寫數值很小則說明磁盤存在問題,系統性能會受影響!ios

iotop命令

iotop命令是一個用來監視磁盤I/O使用情況的top類工具(動態)。iotop具備與top類似的UI,其中包括PID、用戶、I/O、進程等相關信息。Linux下的IO統計工具如iostat,nmon等大多數是隻能統計到per設備的讀寫狀況,若是你想知道每一個進程是如何使用IO的就比較麻煩,使用iotop命令能夠很方便的查看。web

[root@1 ~]# iotop
Total DISK READ :	0.00 B/s | Total DISK WRITE :       0.00 B/s
Actual DISK READ:	0.00 B/s | Actual DISK WRITE:       0.00 B/s
  TID  PRIO  USER     DISK READ  DISK WRITE  SWAPIN     IO>    COMMAND                    
 3694 be/4 root          0.00 B      0.00 B  0.00 %  0.02 % [kworker/0:0]
    1 be/4 root          0.00 B      0.00 B  0.00 %  0.00 % systemd --swit~-deserialize 21
    2 be/4 root          0.00 B      0.00 B  0.00 %  0.00 % [kthreadd]
    3 be/4 root          0.00 B      0.00 B  0.00 %  0.00 % [ksoftirqd/0]
  516 be/4 root          0.00 B      0.00 B  0.00 %  0.00 % crond -n
  517 be/4 root          0.00 B      0.00 B  0.00 %  0.00 % login -- root
……

注: 在此關注‘IO>’這一列!sql

  • iotop經常使用快捷鍵緩存

    • 左右箭頭:改變排序方式,默認是按IO排序
    • r:改變排序順序。
    • o:只顯示有IO輸出的進程。
    • p:進程/線程的顯示方式的切換。
    • a:顯示累積使用量。
    • q:退出。

10.7 free命令

free命令能夠顯示當前系統未使用的和已使用的內存數目,還能夠顯示被內核使用的內存緩衝區。服務器

語法: free [options]
Options:
-b/k/m/g:分別以byte、KB、M、G爲單位顯示(默認以KB爲單位)
-h:已適當的單位顯示
-t:顯示內存總和網絡

[root@1 ~]# free
              total        used        free      shared  buff/cache   available
Mem:        1008392      116072      586356        6864      305964      724644
Swap:       2097148           0     2097148

[root@1 ~]# free -h
              total        used        free      shared  buff/cache   available
Mem:           984M        113M        572M        6.7M        298M        707M
Swap:          2.0G          0B        2.0G

說明:
「total=used+free+buff/cache」
「available=free+buff/cache(空閒部分)」
buff(緩衝):當CPU向磁盤寫入數據時,因爲磁盤存儲速率低於CPU,因此CPU工做時先將寫好的數據存放在內存中,該部份內存即爲緩衝內存。
cache(緩存):當CPU從磁盤讀取數據時,因爲磁盤輸出速率低於CPU的讀取速度,因此磁盤的數據會預先存放在內存中,該部份內存即爲緩存內存。多線程

10.8 ps命令

ps命令用於報告當前系統的進程狀態。能夠搭配kill指令隨時中斷、刪除沒必要要的程序。ps命令是最基本同時也是很是強大的進程查看命令,使用該命令能夠肯定有哪些進程正在運行和運行的狀態、進程是否結束、進程有沒有僵死、哪些進程佔用了過多的資源等等,總之大部分信息都是能夠經過執行該命令獲得的。併發

用法

語法: ps [options]
Options:
a:顯示現行終端機下的全部程序,包括其餘用戶的程序。
u:以用戶爲主的格式來顯示系統情況。
x:顯示全部程序,包括歷史進程。
-e:顯示全部進程(同a)
-f:顯示UID、PPIP、C與STIME欄
-l:顯示進程詳細信息dom

  • ps aux
[root@1 ~]# ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.3 125100  3628 ?        Ss   10:28   0:01 /usr/lib/systemd/systemd 
root         2  0.0  0.0      0     0 ?        S    10:28   0:00 [kthreadd]
……

說明: STAT表示進程狀態。

  • 進程狀態:

    • D:不能中斷的進程
    • R:run狀態的進程
    • S:sleep狀態的進程
    • s:主進程
    • T:暫停的進程
    • Z:殭屍進程
    • <:高優先級進程
    • N:低優先級進程
    • L:內存中被鎖定了內存分頁
    • l:多線程進程
    • +:前臺進程
  • ps -elf

[root@1 ~]# ps -elf
F S UID        PID  PPID  C PRI  NI ADDR SZ WCHAN  STIME TTY          TIME CMD
4 S root         1     0  0  80   0 - 31275 ep_pol 10:28 ?        00:00:01 /usr/lib/system
1 S root         2     0  0  80   0 -     0 kthrea 10:28 ?        00:00:00 [kthreadd]

進程/線程

進程

進程(Process)是計算機中的程序關於某數據集合上的一次運行活動,是系統進行資源分配和調度的基本單位,是操做系統結構的基礎。在早期面向進程設計的計算機結構中,進程是程序的基本執行實體;在當代面向線程設計的計算機結構中,進程是線程的容器。程序是指令、數據及其組織形式的描述,進程是程序的實體。

狀態分類

進程執行時的間斷性,決定了進程可能具備多種狀態。事實上,運行中的進程可能具備如下三種基本狀態:

  • 就緒狀態(Ready):進程已得到除處理器外的所需資源,等待分配處理器資源;只要分配了處理器進程就可執行。就緒進程能夠按多個優先級來劃分隊列。例如,當一個進程因爲時間片用完而進入就緒狀態時,排入低優先級隊列;當進程由I/O操做完成而進入就緒狀態時,排入高優先級隊列。
  • 運行狀態(Running):進程佔用處理器資源;處於此狀態的進程的數目小於等於處理器的數目。在沒有其餘進程能夠執行時(如全部進程都在阻塞狀態),一般會自動執行系統的空閒進程。
  • 阻塞狀態(Blocked):因爲進程等待某種條件(如I/O操做或進程同步),在條件知足以前沒法繼續執行。該事件發生前即便把處理機分配給該進程,也沒法運行。

線程

線程,有時被稱爲輕量級進程(Lightweight Process,LWP),是程序執行流的最小單元。一個標準的線程由線程ID,當前指令指針(PC),寄存器集合和堆棧組成。另外,線程是進程中的一個實體,是被系統獨立調度和分派的基本單位,線程本身不擁有系統資源,只擁有一點兒在運行中必不可少的資源,但它可與同屬一個進程的其它線程共享進程所擁有的所有資源。一個線程能夠建立和撤消另外一個線程,同一進程中的多個線程之間能夠併發執行。因爲線程之間的相互制約,導致線程在運行中呈現出間斷性。線程也有就緒、阻塞和運行三種基本狀態。每個程序都至少有一個線程,若程序只有一個線程,那就是程序自己。
在單個程序中同時運行多個線程完成不一樣的工做,稱爲多線程

分類

  • 用戶級線程:管理過程所有由用戶程序完成,操做系統內核心只對進程進行管理。
  • 系統級線程(核心級線程):由操做系統內核進行管理。操做系統內核給應用程序提供相應的系統調用和應用程序接口API,以使用戶程序能夠建立、執行、撤消線程。

 

10.9 查看網絡狀態

netstat命令

netstat命令用來打印Linux中網絡系統的狀態信息,可以讓你得知整個Linux系統的網絡狀況。

語法: netstat [options]
Options:
-a:=all 顯示全部連線中的socket
-l:=listening 顯示監控中的服務器的socket
-n:=numeric 直接使用IP地址
-p:=programs 顯示正在使用socket的程序識別碼和程序名稱
-t:=tcp 顯示tcp傳輸協議的鏈接情況

  • netstat -lnp 查看監聽端口
[root@1 ~]# 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      1839/sshd           
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1979/master         
tcp6       0      0 :::22                   :::*                    LISTEN      1839/sshd           
tcp6       0      0 ::1:25                  :::*                    LISTEN      1979/master         
udp        0      0 127.0.0.1:323           0.0.0.0:*                           488/chronyd         
udp6       0      0 ::1:323                 :::*                                488/chronyd         
raw6       0      0 :::58                   :::*                    7           543/NetworkManager  
Active UNIX domain sockets (only servers)
Proto RefCnt Flags       Type       State         I-Node   PID/Program name     Path
unix  2      [ ACC ]     SEQPACKET  LISTENING     11807    1/systemd            /run/udev/control
unix  2      [ ACC ]     STREAM     LISTENING     17879    1979/master          private/rewrite
:proto爲unix的是系統內的socket文件。
……
  • netstat -an 查看系統網絡鏈接情況
[root@1 ~]# 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      0 127.0.0.1:25            0.0.0.0:*               LISTEN     
tcp        0     52 192.168.8.125:22        192.168.8.1:61445       ESTABLISHED
tcp6       0      0 :::22                   :::*                    LISTEN     
tcp6       0      0 ::1:25                  :::*                    LISTEN     
udp        0      0 127.0.0.1:323           0.0.0.0:*                          
udp6       0      0 ::1:323                 :::*                               
raw6       0      0 :::58                   :::*                    7          
Active UNIX domain sockets (servers and established)
Proto RefCnt Flags       Type       State         I-Node   Path
unix  2      [ ACC ]     SEQPACKET  LISTENING     11807    /run/udev/control
unix  2      [ ACC ]     STREAM     LISTENING     17879    private/rewrite
……
  • netstat -lntp 只看tcp協議鏈接,不看socket
[root@1 ~]# netstat -lntp
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      1839/sshd           
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1979/master         
tcp6       0      0 :::22                   :::*                    LISTEN      1839/sshd           
tcp6       0      0 ::1:25                  :::*                    LISTEN      1979/master

補充: 查看tcp協議狀態的命令:

[root@1 ~]#  netstat -an | awk '/^tcp/ {++sta[$NF]} END {for(key in sta) print key,"\t",sta[key]}'
LISTEN 	 4
ESTABLISHED 	 1

ss命令

ss命令用來顯示處於活動狀態的套接字信息。ss命令能夠用來獲取socket統計信息,它能夠顯示和netstat相似的內容。但ss的優點在於它可以顯示更多更詳細的有關TCP和鏈接狀態的信息,並且比netstat更快速更高效,缺點是不會顯示進程的名稱。

語法: ss [options]
Options:
-a:顯示全部套接字(socket)
-n:不解析服務器名稱,以數字方式顯示

[root@1 ~]# ss -an
Netid State      Recv-Q Send-Q  Local Address:Port                 Peer Address:Port              
nl    UNCONN     0      0                   0:0                                *                   
nl    UNCONN     0      0                   0:-1442840033                      *

10.10 Linux下抓包

tcpdump命令

tcpdump命令是一款sniffer工具,它能夠打印全部通過網絡接口的數據包的頭信息,也可使用-w選項將數據包保存到文件中,方便之後分析。

語法: tcpdump [options]
Options:
-i:指定網卡名,使用指定的網絡送出數據包
-c:指定數量
-w:指定存放位置
-r:=read,從指定文件查看數據包數據

用法

  • tcpdump -nn -i ens33 (第一個n表示以數字形式顯示IP,若是不加該選項會顯示成主機名)
  • tcpdump -nn ens33 port 22 (not port 22)指定端口爲22的(非22的)
  • tcpdump -nn ens33 port 22 and host 192.168.8.1 指定多個條件(host:主機,後面跟主機名或IP)
  • tcpdump -nn -i ens33 -c 10 -w /tmp/1.cap 指定抓包數量和存放位置
[root@1 ~]# tcpdump -nn -i ens33 -c 10 -w /tmp/1.cap
tcpdump: listening on ens33, link-type EN10MB (Ethernet), capture size 65535 bytes
10 packets captured
12 packets received by filter
0 packets dropped by kernel

查看1.cap文件信息:
[root@1 ~]# file /tmp/1.cap
/tmp/1.cap: tcpdump capture file (little-endian) - version 2.4 (Ethernet, capture length 65535)

注: 1.cap內容沒法使用cat命令查看,可以使用tcpdump -r命令查看

  • tcpdump -r 1.cap 查看指定數據包內容
[root@1 ~]# tcpdump -r /tmp/1.cap
reading from file /tmp/1.cap, link-type EN10MB (Ethernet)
18:42:15.311230 IP adai003.ssh > 192.168.8.1.61445: Flags [P.], seq 1594109651:1594109799, ack 208567947, win 295, length 148
18:42:15.311978 IP 192.168.8.1.61445 > adai003.ssh: Flags [.], ack 148, win 16316, length 0
18:42:16.296782 IP adai003.ssh > 192.168.8.1.61445: Flags [.], seq 148:3068, ack 1, win 295, length 2920

說明: 包內內容爲使用tcpdump打包時的數據。

tshark命令

該命令也是用於抓包的。

使用前須要安裝該工具‘wireshark’:

[root@1 ~]# yum install -y wireshark

用法

  • 查看指定網卡80端口的1個web服務的訪問狀況(相似於web的訪問日誌):
    [ 命令: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" ]
[root@1 ~]#  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"
  • 抓取mysql的查詢
方法1:
[root@1 ~]# tshark -n -i ens33 -R 'mysql.query' -T fields -e "ip.src" -e "mysql.query"
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 'ens33'
0 packets captured

方法2:
[root@1 ~]# tshark -i ens33 port 3307  -d tcp.port==3307,mysql -z "proto,colinfo,mysql.query,mysql.query"

注: 因無相關進程運行因此一無所得!

  • 抓取指定類型的MySQL查詢
[root@1 ~]# tshark -n -i ens33 -R 'mysql matches "SELECT|INSERT|DELETE|UPDATE"' -T fields -e "ip.src" -e "mysql.query"
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 'ens33'
8 packets dropped
0 packets captured
  • 統計http的狀態
[root@1 ~]# tshark -n -q -z http,stat, -z http,tree
Running as user "root" and group "root". This could be dangerous.
Capturing on 'nflog'
……

注: 這個命令,直到你ctrl + c 纔會顯示出結果!

  • tshark 增長時間標籤
  • [root@1 ~]# tshark -t ad  
    
    [root@1 ~]# tshark -t a
相關文章
相關標籤/搜索