參考:https://www.phpmianshi.com/?id=107
有很多工具可以看網絡流量,但我最喜歡sar。
sar(System Activity Reporter系統活動情況報告)是目前 Linux 上最爲全面的系統性能分析工具之一,可以從多方面對系統的活動進行報告,包括:文件的讀寫情況、 系統調用的使用情況、磁盤I/O、CPU效率、內存使用狀況、進程活動及IPC有關的活動等。
sar命令常用格式
sar [options] [-A] [-o file] t [n]
其中:
t爲採樣間隔,n爲採樣次數,默認值是1;
-o file表示將命令結果以二進制格式存放在文件中,file 是文件名。
options 爲命令行選項,sar命令常用選項如下:
-A:所有報告的總和 -u:輸出CPU使用情況的統計信息 -v:輸出inode、文件和其他內核表的統計信息 -d:輸出每一個塊設備的活動信息 -r:輸出內存和交換空間的統計信息 -b:顯示I/O和傳送速率的統計信息 -a:文件讀寫情況 -c:輸出進程統計信息,每秒創建的進程數 -R:輸出內存頁面的統計信息 -y:終端設備活動情況 -w:輸出系統交換活動信息
sar 既能報告當前數據,也能報告歷史數據
不帶選項執行會以10分鐘爲間隔報告自午夜起當天的CPU利用率。這個粒度太粗,需要修改爲1分鐘。修改方法:
vi /etc/cron.d/sysstat #將這一行: */10 * * * * root /usr/lib64/sa/sa1 1 1 #更換爲: */1 * * * * root /usr/lib64/sa/sa1 1 1
比如查看本月23號以來服務器的平均負載狀況
sar -q -f /var/log/sa/sa23
統計網絡信息 sar -n
-n { <關鍵詞> [,...] | ALL } 關鍵詞可以是: DEV 網卡 EDEV 網卡 (錯誤) NFS NFS 客戶端 NFSD NFS 服務器 SOCK Sockets (套接字) (v4) IP IP 流 (v4) EIP IP 流 (v4) (錯誤) ICMP ICMP 流 (v4) EICMP ICMP 流 (v4) (錯誤) TCP TCP 流 (v4) ETCP TCP 流 (v4) (錯誤) UDP UDP 流 (v4) SOCK6 Sockets (套接字) (v6) IP6 IP 流 (v6) EIP6 IP 流 (v6) (錯誤) ICMP6 ICMP 流 (v6) EICMP6 ICMP 流 (v6) (錯誤) UDP6 UDP 流 (v6)
1. sar -n DEV 1 即可每秒刷新一次網絡流量。
[root@dev logs]# sar -n DEV 1 Linux 2.6.32-504.30.3.el6.x86_64 (dev.aigupiao.com) 05/31/20 _x86_64(2 CPU) 20:09:14 IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s 20:09:15 lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00 20:09:15 eth0 2718.18 2111.11 1424.46 497.72 0.00 0.00 0.00 20:09:15 IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s
IFACE 本地網卡接口的名稱 rxpck/s 每秒鐘接受的數據包 txpck/s 每秒鐘發送的數據庫 rxKB/S 每秒鐘接受的數據包大小,單位爲KB txKB/S 每秒鐘發送的數據包大小,單位爲KB rxcmp/s 每秒鐘接受的壓縮數據包 txcmp/s 每秒鐘發送的壓縮包 rxmcst/s 每秒鐘接收的多播數據包
當然,你也可以使用ifstat、nload、iptraf等命令查看。然而數據來源,還是來自我們的/proc目錄
watch cat /proc/net/dev查看佔流量最大的IP
有時候我們發現網絡帶寬佔用非常高,但我們無法判斷到底流量來自哪裏。這時候,iftop就可以幫上忙了。
2. sar -n EDEV 1 1 網絡設備通信失敗信息
[root@super-task-cron logs]# sar -n EDEV 1 1 Linux 3.10.0-1062.9.1.el7.x86_64 (super-task-cron.aigupiao.com) 06/03/2020 _x86_64_ (2 CPU) 07:59:22 PM IFACE rxerr/s txerr/s coll/s rxdrop/s txdrop/s txcarr/s rxfram/s rxfifo/s txfifo/s 07:59:23 PM eth0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 07:59:23 PM lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
IFACE 網卡名稱 rxerr/s 每秒鐘接收到的損壞的數據包 txerr/s 每秒鐘發送的數據包錯誤數 coll/s 當發送數據包時候,每秒鐘發生的衝撞(collisions)數,這個是在半雙工模式下才有 rxdrop/s 當由於緩衝區滿的時候,網卡設備接收端每秒鐘丟掉的網絡包的數目 txdrop/s 當由於緩衝區滿的時候,網絡設備發送端每秒鐘丟掉的網絡包的數目 txcarr/s 當發送數據包的時候,每秒鐘載波錯誤發生的次數 rxfram/s 在接收數據包的時候,每秒鐘發生的幀對其錯誤的次數 rxfifo/s 在接收數據包的時候,每秒鐘緩衝區溢出的錯誤發生的次數 txfifo/s 在發生數據包 的時候,每秒鐘緩衝區溢出的錯誤發生的次數
3. sar -n SOCK 1 1 統計socket連接信息
[root@super-task-cron logs]# sar -n SOCK 1 1 Linux 3.10.0-1062.9.1.el7.x86_64 (super-task-cron.aigupiao.com) 06/03/2020 _x86_64_ (2 CPU) 08:03:33 PM totsck tcpsck udpsck rawsck ip-frag tcp-tw 08:03:34 PM 206 64 2 0 0 8 Average: 206 64 2 0 0 8
totsck 當前被使用的socket總數 tcpsck 當前正在被使用的TCP的socket總數 udpsck 當前正在被使用的UDP的socket總數 rawsck 當前正在被使用於RAW的skcket總數 if-frag 當前的IP分片的數目 tcp-tw TCP套接字中處於TIME-WAIT狀態的連接數量
4. sar -n TCP 1 1 TCP連接的統計
[root@super-task-cron logs]# sar -n TCP 1 1 Linux 3.10.0-1062.9.1.el7.x86_64 (super-task-cron.aigupiao.com) 06/03/2020 _x86_64_ (2 CPU) 08:06:27 PM active/s passive/s iseg/s oseg/s 08:06:28 PM 1.00 0.00 1114.00 1140.00 Average: 1.00 0.00 1114.00 1140.00
active/s 新的主動連接 passive/s 新的被動連接 iseg/s 接受的段 oseg/s 輸出的段
5. sar -u 或 sar(默認) 查看CPU和IOWAIT統計狀態
[root@super-task-cron logs]# sar -u 1 3 Linux 3.10.0-1062.9.1.el7.x86_64 (super-task-cron.aigupiao.com) 06/03/2020 _x86_64_ (2 CPU) 08:16:05 PM CPU %user %nice %system %iowait %steal %idle 08:16:06 PM all 7.07 0.00 3.03 0.00 0.00 89.90 08:16:07 PM all 7.54 0.00 2.01 0.00 0.00 90.45 08:16:08 PM all 7.11 0.00 2.03 0.00 0.00 90.86 Average: all 7.24 0.00 2.36 0.00 0.00 90.40
%user 用戶空間的CPU使用 %nice 改變過優先級的進程的CPU使用率 %system 內核空間的CPU使用率 %iowait CPU等待IO的百分比 %steal 虛擬機的虛擬機CPU使用的CPU %idle 空閒的CPU
主要看%iowait和%idle,%iowait過高表示存在I/O瓶頸,即磁盤IO無法滿足業務需求,如果%idle過低表示CPU使用率比較嚴重,需要結合內存使用等情況判斷CPU是否瓶頸。
6.sar -q 1 1 查看平均負載
[root@super-task-cron logs]# sar -q 1 3 Linux 3.10.0-1062.9.1.el7.x86_64 (super-task-cron.aigupiao.com) 06/03/2020 _x86_64_ (2 CPU) 08:20:36 PM runq-sz plist-sz ldavg-1 ldavg-5 ldavg-15 blocked 08:20:37 PM 0 156 0.12 0.17 0.21 0 08:20:38 PM 0 157 0.11 0.16 0.21 0 08:20:39 PM 0 157 0.11 0.16 0.21 0 Average: 0 157 0.11 0.16 0.21 0
runq-sz 運行隊列的長度(等待運行的進程數,每核的CP不能超過3個) plist-sz 進程列表中的進程(processes)和線程數(threads)的數量 ldavg-1 最後1分鐘的CPU平均負載,即將多核CPU過去一分鐘的負載相加再除以核心數得出的平均值,5分鐘和15分鐘以此類推 ldavg-5 最後5分鐘的CPU平均負載 ldavg-15 最後15分鐘的CPU平均負載
7.sar -r 1 1或者 sar -S 查看內存使用情況
[root@super-task-cron logs]# sar -r 1 1 Linux 3.10.0-1062.9.1.el7.x86_64 (super-task-cron.aigupiao.com) 06/03/2020 _x86_64_ (2 CPU) 08:22:27 PM kbmemfree kbmemused %memused kbbuffers kbcached kbcommit %commit kbactive kbinact kbdirty 08:22:28 PM 333488 3546736 91.41 478972 941360 2581244 66.52 1027676 775288 856 Average: 333488 3546736 91.41 478972 941360 2581244 66.52 1027676 775288 856
kbmemfree 空閒的物理內存大小 kbmemused 使用中的物理內存大小 %memused 物理內存使用率 kbbuffers 內核中作爲緩衝區使用的物理內存大小,kbbuffers和kbcached:這兩個值就是free命令中的buffer和cache. kbcached 緩存的文件大小 kbcommit 保證當前系統正常運行所需要的最小內存,即爲了確保內存不溢出而需要的最少內存(物理內存+Swap分區) commit 這個值是kbcommit與內存總量(物理內存+swap分區)的一個百分比的值
內存使用情況提示:服務器內存佔用量較高的情況其實非常正常。這是因爲內存的讀寫速度及效率遠高於服務器磁盤,因此操作系統傾向於將內存作爲緩衝機制預先載入數據,從而提高數據讀取速度。
同樣,內存使用百分比也並不是什麼大問題(除非大家沒有設置虛擬內存分區,但這也與內存本身無關)。大家真正需要關注的是虛擬內存使用百分比,因爲 只有在服務器的物理內存被全部佔用後、虛擬內存纔會接替而上發揮作用。這一數字越低,就說明服務器的運行狀態越好。如果虛擬內存使用率爲0%,則意味着我 們的服務器能夠完全利用物理內存執行任務。
那麼虛擬內存使用率達到多少纔算過高?這取決於大家自己的感覺。一般來說,如果虛擬內存使用率一直不高、那麼我們的服務器的運行狀態還是比較理想 的。如果大家發現虛擬內存使用率隨時間不斷提升(例如由1%到7%再到32%),這就代表服務器上的某些進程正在瘋狂吞噬內存,我們需要及時展開調查以了 解具體情況(而不該直接安裝更多內存)。一旦服務器用盡了所有物理內存與虛擬內存,那麼整套系統的運行將變得極爲緩慢,需要經過重啓才能暫時恢復正常。
8.sar -W 1 3 查看系統SWAP分區統計
[root@super-task-cron logs]# sar -W 1 3 Linux 3.10.0-1062.9.1.el7.x86_64 (super-task-cron.aigupiao.com) 06/03/2020 _x86_64_ (2 CPU) 08:24:09 PM pswpin/s pswpout/s 08:24:10 PM 0.00 0.00 08:24:11 PM 0.00 0.00 08:24:12 PM 0.00 0.00 Average: 0.00 0.00
pswpin/s 每秒從交換分區到系統的交換頁面(swap page)數量 pswpott/s 每秒從系統交換到swap的交換頁面(swap page)的數量
9.sar -b 1 1 查看IO傳遞速率
[root@super-task-cron logs]# sar -b 1 1 Linux 3.10.0-1062.9.1.el7.x86_64 (super-task-cron.aigupiao.com) 06/03/2020 _x86_64_ (2 CPU) 08:25:31 PM tps rtps wtps bread/s bwrtn/s 08:25:32 PM 0.00 0.00 0.00 0.00 0.00 Average: 0.00 0.00 0.00 0.00 0.00
tps 磁盤每秒鐘的IO總數,等於iostat中的tps rtps 每秒鐘從磁盤讀取的IO總數 wtps 每秒鐘從寫入到磁盤的IO總數 bread/s 每秒鐘從磁盤讀取的塊總數 bwrtn/s 每秒鐘此寫入到磁盤的塊總數
10.sar -d 1 1 查看磁盤使用情況
[root@super-task-cron logs]# sar -d 1 1 Linux 3.10.0-1062.9.1.el7.x86_64 (super-task-cron.aigupiao.com) 06/03/2020 _x86_64_ (2 CPU) 08:26:30 PM DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util 08:26:31 PM dev253-0 0.99 0.00 23.76 24.00 0.00 1.00 1.00 0.10 08:26:31 PM dev253-16 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 08:26:31 PM dev11-0 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: dev253-0 0.99 0.00 23.76 24.00 0.00 1.00 1.00 0.10 Average: dev253-16 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 Average: dev11-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
DEV 磁盤設備的名稱,如果不加-p,會顯示dev253-0類似的設備名稱,因此加上-p顯示的名稱更直接 tps 每秒I/O的傳輸總數 rd_sec/s 每秒讀取的扇區的總數 wr_sec/s 每秒寫入的扇區的總數 avgrq-sz 平均每次次磁盤I/O操作的數據大小(扇區) avgqu-sz 磁盤請求隊列的平均長度 await 從請求磁盤操作到系統完成處理,每次請求的平均消耗時間,包括請求隊列等待時間,單位是毫秒(1秒等於1000毫秒),等於尋道時間+隊列時間+服務時間 svctm I/O的服務處理時間,即不包括請求隊列中的時間 %util I/O請求佔用的CPU百分比,值越高,說明I/O越慢
1. avgqu-sz 的值較低時,設備的利用率較高。
2. 當%util的值接近 1% 時,表示設備帶寬已經佔滿。
常用總結:
(1) sar -b 1 1 // IO傳送速率 (2) sar -B 1 1 // 頁交換速率 (3) sar -c 1 1 // 進程創建的速率 (4) sar -d 1 1 // 塊設備的活躍信息 (5) sar -n DEV 1 1 // 網路設備的狀態信息 (6) sar -n SOCK 1 1 // SOCK的使用情況 (7) sar -n ALL 1 1 // 所有的網絡狀態信息 (8) sar -P ALL 1 1 // 每顆CPU的使用狀態信息和IOWAIT統計狀態 (9) sar -q 1 1 // CPU隊列的長度(等待運行的進程數)和負載的狀態 (10) sar -r 1 1 // 內存和swap空間使用情況 (11) sar -R 1 1 // 內存的統計信息(內存頁的分配和釋放、系統每秒作爲BUFFER使用內存頁、每秒被cache到的內存頁) (12) sar -u 1 1 // CPU的使用情況和IOWAIT信息(同默認監控) (13) sar -v 1 1 // inode, file and other kernel tablesd的狀態信息 (14) sar -w 1 1 // 每秒上下文交換的數目 (15) sar -W 1 1 // SWAP交換的統計信息(監控狀態同iostat 的si so) (16) sar -x 2906 1 1 // 顯示指定進程(2906)的統計信息,信息包括:進程造成的錯誤、用戶級和系統級用戶CPU的佔用情況、運行在哪顆CPU上 (17) sar -y 1 1 // TTY設備的活動狀態 (18) 將輸出到文件(-o)和讀取記錄信息(-f)
要判斷系統瓶頸問題,有時需幾個 sar 命令選項結合起來
懷疑CPU存在瓶頸,可用 sar -u 和 sar -q 等來查看 懷疑內存存在瓶頸,可用 sar -B、sar -r 和 sar -W 等來查看 懷疑I/O存在瓶頸,可用 sar -b、sar -u 和 sar -d 等來查看
數據從何而來
/proc目錄是一個虛擬目錄,存儲的是當前內核的一系列特殊文件
比如top的load (使用uptime命令得到同樣的結果)。讀取的就是
/proc/loadavg 文件
而每核cpu的信息,讀取
/proc/stat文件
這些命令,是對/proc目錄中一系列信息的解析和友好的展示
-
每個進程都有一個pid,比如18,在 /proc/18中有很多有用的信息
-
/proc/18/env 跟這個進程相關的環境變量
-
/proc/18/fd 所有的file description
-
/proc/18/cmdline 進程啓動時的命令行參數