服務端解決故障的處理思路

2021-10-01 19:46:20 字數 3118 閱讀 4557

簡單記錄一下解決伺服器故障的思路,以便今後迅速定位問題。

1、出錯一般來說是兩種情況:

(1)**邏輯出錯了

(2)傳入引數出錯了

2、在上述情況都正確的情況下,那麼業務邏輯可能是正常執行了。這時錯誤可能就是其他原因:

(1)出錯的**在別的地方

(2)rpc呼叫超時

(3)......

盡可能搞清楚問題的前因後果,不要一下子就扎到伺服器前面,你需要先搞明白對這台伺服器有多少已知的情況,還有故障的具體情況。不然你很可能就是在無的放矢

必須搞清楚的問題有:

故障的表現是什麼?無響應?報錯?

故障是什麼時候發現的?

故障是否可重現?

有沒有出現的規律(比如每小時出現一次)?

最後一次對整個平台進行更新的內容是什麼(**、伺服器等)? 注意:不同的服務之間呼叫,當進行某乙個模組的聯調時,這些相關的服務是否都發布了,我曾經因為少發了服務,導致服務不可用)

故障影響的特定使用者群是什麼樣的(已登入的, 退出的, 某個地域的…)?

基礎架構(物理的、邏輯的)的文件是否能找到?

是否有監控平台可用?

是否有日誌可以檢視?(注意:公司裡面往往執行著成千上萬的服務,對應日誌檔案繁多,找問題的時候,要避免找錯日誌檔案,我曾因為找錯日誌檔案,花了非常多的時間)

有誰在?

who /var/log/wtmp
1、

history
檢視一下之前伺服器上執行過的命令。看一下總是沒錯的,加上前面看的誰登入過的資訊,應該有點用。

現在在執行的程序是啥?

2、

pstree -a

ps aux

這都是檢視現有程序的。 ps aux 的結果比較雜亂, pstree -a 的結果比較簡單明瞭,可以看到正在執行的程序及相關使用者。

1、

netstat -auntlp
找到所有正在執行的服務,檢查它們是否應該執行。檢視各個監聽埠。

1、

free -m

uptime

top/htop

注意以下問題:

還有空餘的記憶體嗎? 伺服器是否正在記憶體和硬碟之間進行swap?

還有剩餘的cpu嗎? 伺服器是幾核的? 是否有某些cpu核負載過多了?

伺服器最大的負載來自什麼地方? 平均負載是多少?

1、

lspci

dmidecode

ethtool

有很多伺服器可能是硬體故障,具體看一下:

raid 卡 (是否帶bbu備用電池?)

cpu、空餘的記憶體插槽?

網絡卡是否設定好? 是否正執行在半雙工狀態? 速度是10mbps? 有沒有 tx/rx 報錯?

1、

iostat -kx 2

vmstat 2 10

mpstat 2 10

dstat --top-io --top-bio

具體關注以下問題:

是否開啟了swap交換模式 (si/so)?

cpu被誰占用:系統程序? 使用者程序? 虛擬機器?

伺服器硬碟是否已滿?

mount

cat /etc/fstab

vgs/pvs/lvs

df -h

lsof

具體關注以下問題:

一共掛載了多少檔案系統?

有沒有某個服務專用的檔案系統? \

檔案系統的掛載選項是什麼: noatime? default? 有沒有檔案系統被重新掛載為唯讀模式了?

是否有大檔案被刪除但沒有清空?

如果磁碟空間有問題,你是否還有空間來擴充套件乙個分割槽?

sysctl -a | grep ...

cat /proc/interrupts

cat /proc/net/ip_conntrack /* may take some time on busy servers */

ss -s

具體關注以下問題:

核心是否做什麼相關優化?

你的中斷請求是否是均衡地分配給cpu處理,還是會有某個cpu的核因為大量的網路中斷請求或者raid請求而過載了?

在不同狀態下(time_wait, …)tcp連線時間的設定是怎樣的?

dmesg

less /var/log/messages

less /var/log/secure

less /var/log/auth

具體關注以下問題:

檢視錯誤和警告訊息,比如看看是不是很多關於連線數過多導致?

看看是否有硬體錯誤或檔案系統錯誤?

ls /etc/cron* + cat

for user in $(cat /etc/passwd | cut -f1 -d:); do crontab -l -u $user; done

具體關注以下問題:

是否有某個定時任務執行過於頻繁?

是否有些使用者提交了隱藏的定時任務?

在出現故障的時候,是否正好有某個備份任務在執行?

這個要涉及的就比較多了,不過一般是應用故障我們檢視相關的應用日誌即可。

例如:apache & nginx; 查詢訪問和錯誤日誌, 直接找 5xx 錯誤, 再看看是否有 limit_zone 錯誤。

mysql; 在mysql.log找錯誤訊息,看看有沒有結構損壞的表, 是否有innodb修復程序在執行,是否有disk/index/query 問題.

php-fpm; 如果設定了 php-slow 日誌, 直接找錯誤資訊 (php, mysql, memcache, …),如果沒設定,趕緊設定。

ha-proxy; 後端的狀況如何?健康狀況檢查是否成功?是前端還是後端的佇列大小達到最大值了?

經過一系列的處理之後,應該對如下情況比較清楚了:

在伺服器上執行的都是些啥?

這個故障看起來是和 io/硬體/網路 或者 系統配置 (有問題的**、系統核心調優, …)相關?

這個故障是否有你熟悉的一些特徵?比如對資料庫索引使用不當,或者太多的apache後台程序?

參考:

Rsync服務端排錯思路

檢視rsync服務配置檔案路徑是否正確 etc rsyncd.conf 檢視配置檔案例的host allow,host deny,允許的ip網段是否是允許客戶端訪問的ip網段 檢視配置檔案中path引數裡的路徑是否存在,許可權是否正確 正常應為配置檔案中的uuid引數對應的屬主和組 檢視rsync服...

服務端驗證的問題處理

在使用服務端驗證的時候,因為各種需求的不同,可以用作一下的幾個處理。使用sql語句的驗證 就是在寫sql語句的時候,進行使用者名稱和密碼的匹配查詢。如 where name and password 在客戶端請求時,在servlet層獲取使用者名稱和密碼引數。並呼叫該方法,如果返回有值,則驗證通過。...

fastHttp服務端處理請求的過程

github 位址 fasthttp 服務端的處理請求的過程 工作過程 主要 設定監聽位址 server.go func s server listenandserve addr string error if tcpln,ok ln.net.tcplistener ok return s.serv...