1. 程式人生 > >服務異常系統排查順序

服務異常系統排查順序

服務異常時首先檢查監控,觀察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
......

優化策略:使用快取降低請求次數,多次請求合併為一次請求,資料傳輸前進行壓縮