服務異常系統排查順序
服務異常時首先檢查監控,觀察QPS,RT以及成功率是否有抖動,如果沒有明顯抖動,再檢查伺服器狀態
CPU負載
使用top命令或uptime命令檢視CPU負載
top - 18:06:34 up 35 days, 3:53, 1 user, load average: 1.41, 1.61, 1.70
[[email protected] ~]# uptime
18:07:35 up 35 days, 3:54, 1 user, load average: 1.46, 1.56, 1.68
CPU的每個核都維護了一個執行佇列,特定時間間隔內執行佇列中的平均執行緒數即為CPU負載,例如,一個CPU有8個核,應用程式啟動了16個執行緒,並且這些執行緒都處於執行狀態,平均分配的情況下,每個核的執行佇列中有2個執行緒在執行,持續1分鐘,則這1分鐘內,CPU的負載為2
load值越大,CPU越繁忙,通常CPU的load值不會超過3,如果load值大於5,表明CPU的負載已經非常高了
三個值分別表示過去1分鐘、5分鐘以及15分鐘內的CPU負載
CPU利用率
使用top命令檢視CPU利用率
Cpu(s): 5.3%us, 0.4%sy, 0.0%ni, 94.2%id, 0.0%wa, 0.0%hi, 0.1%si, 0.0%st
us:User Time,CPU執行使用者程序所佔用的時間,越大越好
sy:System Time,CPU在核心態所佔用的時間,如果該值過大,說明系統某些方面設計不合理,例如,頻繁的系統呼叫導致的使用者態與核心態頻繁切換
ni:Nice Time,系統調整程序優先順序所花費的時間
id:Idel Time,系統空閒時間,等待程序執行,越小越好
wa:Waiting Time,CPU等待IO操作所花費的時間,該值過大表示系統某些方面設計不合理
hi:Hard Irq Time,系統處理硬體中斷所佔用時間
si:Soft Irq Time,系統處理軟體中斷所佔用時間
st:Steal Time,硬體虛擬化流行後新增,表示等待虛擬CPU時間,st佔比較高,表示當前虛擬機器與該宿主機上的其它虛擬機器間的CPU爭用比較頻繁
按1可以檢視CPU每個核的利用率
Cpu0 : 4.3%us, 0.3%sy, 0.0%ni, 95.3%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Cpu1 : 4.7%us, 0.3%sy, 0.0%ni, 95.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Cpu2 : 4.7%us, 0.3%sy, 0.0%ni, 95.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Cpu3 : 9.4%us, 1.3%sy, 0.0%ni, 87.9%id, 0.0%wa, 0.3%hi, 1.0%si, 0.0%st Cpu4 : 4.7%us, 0.3%sy, 0.0%ni, 95.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Cpu5 : 26.7%us, 0.0%sy, 0.0%ni, 73.3%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Cpu6 : 5.3%us, 0.3%sy, 0.0%ni, 94.3%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Cpu7 : 44.4%us, 6.6%sy, 0.0%ni, 49.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
按Shift+H可以按照執行緒檢視CPU使用情況
記憶體使用率
[[email protected] ~]# free -m
total used free shared buffers cached
Mem: 32109 28878 3231 0 317 14928
-/+ buffers/cache: 13632 18477
Swap: 2015 0 2015
特別需要注意的是Swap記憶體,如果Swap記憶體使用過多,表示實體記憶體已經不夠使用,作業系統將實體記憶體儲存的部分資料排程到了磁碟上,以騰出足夠的記憶體供當前程序使用,當之前的程序需要執行時,再將磁碟上的資料排程至實體記憶體中,這個過程過於頻繁將嚴重影響系統性能,使用vmstat可以檢視swap IO
[[email protected] ~]# vmstat
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 0 3308192 324940 15289716 0 0 0 4 1 1 6 1 93 0 0
si:每秒從磁碟交換到記憶體的資料量(KB)
so:每秒從記憶體交換到磁碟的資料量(KB)
磁碟使用率
使用df -h命令檢視磁碟使用率
[[email protected] ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/ma 37G 3.7G 33G 11% /
tmpfs 16G 0 16G 0% /dev/shm
/dev/vda1 477M 35M 417M 8% /boot
/dev/vdb 99G 14G 81G 14% /data
如何需要檢視具體目錄所佔用的空間,分析大檔案所處位置,需要使用du命令
[[email protected] ~]# du -sh /data
13G /data
[[email protected] ~]# du -h --max-depth=1 /data
8.0K /data/keytab
13G /data/logs
8.0K /data/shell
198M /data/java
16K /data/lost+found
533M /data/apps
13G /data
磁碟IO
使用iostat命令,其中:-k指結果使用KB統計,-d表示檢視的是磁碟
[[email protected] ~]# iostat -kd
Linux 2.6.32-642.el6.x86_64 (sean) 10/11/2018 _x86_64_ (8 CPU)
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
vda 1.99 0.15 16.85 455025 51301563
vdb 0.56 0.00 15.04 2221 45808724
dm-0 4.20 0.15 16.75 450297 50997068
dm-1 0.00 0.00 0.00 1308 0
tps:每秒處理的IO請求數
kB_read/s:每秒向裝置寫入的資料量
kB_wrtn/s:每秒從裝置讀取的資料量
kB_read:讀取資料總量
kB_wrtn:寫入資料總量
磁碟每秒能夠寫入的資料量需要根據具體環境確定,一般的磁碟可以支援幾十MB/s的寫入速度
IO密集型的應用需要充分測試,以MQ系統為例,寫入持久化訊息以及事務日誌是其主要的效能瓶頸點,需要支援較高的寫入速度(例如100MB/s)
CPU密集型的應用磁碟IO一般不是瓶頸
優化策略:使用快取,使用合理的RAID策略
網路traffic
-n指定統計資訊,如DEV統計網路介面資訊,SOCK統計套接字資訊
5表示每5s抽樣一次
1表示總共抽樣一次
[[email protected] ~]# sar -n DEV 5 1
Linux 2.6.32-642.el6.x86_64 (sean) 10/11/2018 _x86_64_ (8 CPU)
07:49:04 PM IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s
07:49:05 PM lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00
07:49:05 PM eth0 637.00 415.00 133.03 84.45 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 637.00 415.00 133.03 84.45 0.00 0.00 0.00
IFACE:lo為本地迴環網路,eth0表示網絡卡
rxpck/s:每秒接收包個數
txpck/s:每秒傳送包個數
rxkB/s:每秒接收位元組數(KB)
txkB/s:每秒傳送位元組數(KB)
txcmp/s:每秒傳送壓縮包個數
rxmcst/s:每秒接收的廣播包個數
TCP連線
主機可以使用的埠範圍,可使用埠個數為60999-32768=28231個
[email protected]:~# cat /proc/sys/net/ipv4/ip_local_port_range
32768 60999
使用netstat命令統計處於各種狀態下的TCP連線數,重點關注處於TIME_WAIT和CLOSE_WAIT狀態下的TCP連線數
[email protected]:~# netstat -n | awk '/^tcp/ {++state[$NF]} END {for(key in state) print key, state[key]}'
TIME_WAIT 141
CLOSE_WAIT 20
ESTABLISHED 729
出現大量CLOSE_WAIT狀態連線:短連線客戶端業務完成後需要關閉連線或者使用長連線
出現大量TIME_WAIT狀態連線:使用長連線或者減小TIME_WAIT等待時間(預設大概2分鐘)
-s:每個協議統計資料,能看見TCP連線細節
[email protected]:~# netstat -s
......
Tcp:
59 active connections openings
4 passive connection openings
54 failed connection attempts
0 connection resets received
0 connections established
234 segments received
233 segments send out
0 segments retransmited
0 bad segments received.
54 resets sent
......
優化策略:使用快取降低請求次數,多次請求合併為一次請求,資料傳輸前進行壓縮