簡單記錄一下解決伺服器故障的思路,以便今後迅速定位問題。
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...