(轉載)在服務器上排除問題的頭5分鐘

儘量搞清楚問題的來龍去脈

不要一會兒就扎到服務器前面,你須要先搞明白這臺服務器有多少已知的狀況,還有故障的具體狀況,否則你頗有多是在無的放矢
 
必需要搞清楚的問題:
  • 故障的表現是什麼?無響應?報錯?
  • 故障是何時發現的?
  • 故障是否能夠重現?
  • 有沒有出現的規律(好比每小時一次)
  • 最後一次對整個平臺進行更新的內容是什麼(代碼、服務器)?
  • 故障影響的特定用戶羣是什麼樣的(已登陸的、退出的、某個地域的...)?
  • 基礎架構(物理的、邏輯的)的文檔是否能找到?
  • 是否有監控平臺可用?
  • 是否有日誌能夠查看?
 
最後兩個是最方便的信息來源,不過別抱太大但願,基本上它們都不會有,只能再繼續摸索
 

有誰在?

  1. $ w  
  2. $ last  

用這兩個命令查看都有誰在線,有哪些用戶訪問過。這不是什麼關鍵步驟,不過最好別在其餘用戶正在幹活的時候來調試系統。有道是一山不容二虎嘛
 

以前發生了什麼?

  1. $ history  

查看一下以前服務器上執行過的命令。看一下老是沒錯的,加上前面看的誰登陸過的信息,應該有點用。另外,做爲admin要注意,不用利用本身的權限去侵犯別人的隱私!
 
到這裏先提醒一下,查看history的時候須要更新一下HISTTIMEFORMAT環境變量來顯示這些命令執行的時間。(ps:我的補充)
 
配置HISTTIMEFORMAT可以使用以下命令:
 
  1. $ export HISTTIMEFORMAT="%F %T "  


如今運行的進程

  1. $ pstree -a  
  2. $ps aux  

這都是查看現有進程的。ps aux的結果比較雜亂(ps:我的不認同,ps aux能夠用過管道+grep進行過濾,pstree可沒有這功能),pstree -a的結果比較簡單明瞭,能夠看到正在運行的進程以及相關用戶
 
 

監聽的網絡服務

  1. $ netstat -ntlp  
  2. $ netstat -nulp  
  3. $ netstat -nxlp  

我通常都分開運行這三個命令,不想一會兒看到列出一大堆全部的服務。netstat -nalp倒也能夠。
 
找到全部正在運行的服務,檢查它們是否應該運行。查看各個監聽端口。
 
一般咱們建議每臺服務器上運行的服務少一點,必要時能夠增長服務器。若是你看到一臺服務器上有三四個監聽端口開着,那仍是作個記錄,回頭有空的時候清理一下,從新組織一下服務器
 
 

CPU和內存

  1. $ free -m  
  2. $ uptime  
  3. $ top  

注意如下問題:
  • 還有空閒的內存嗎?服務器是否正在內存和硬盤之間進行swap?
  • 還有剩餘的CPU嗎?服務器是幾核的?是否某些CPU核負載過多了?
  • 服務器最大的負載來自什麼地方?平均負載是多少?
 

硬件

  1. $ lspci  
  2. $ dmidecode  
  3. $ ethtool  

我以爲主要是使用ethtool查看網卡是否設置好?是否正運行在半雙工狀態?速度是10MBps?有沒有TX/RX報錯?
 
 

IO性能

  1. dstat --top-io --top-bio  

我這裏只寫了一個我會用並且感受最好用的dstat。用它能夠看道誰正在進行IO:是否是MYSQL吃掉了全部的系統資源?仍是你的PHP進程?
 
 

系統日誌和內核消息

  1. $ dmesg  
  2. $ less /var/log/auth.log  

  • 查看錯誤和警告信息,好比看看是否是鏈接數過多致使?
  • 看看是否有硬件錯誤或文件系統錯誤?
  • 分析是否能將這些錯誤時間和前面發現的疑點進行時間上的對比
 
 

定時任務

  1. $ ls /etc/cron* | cat  
  2. $ for user in $(cat /etc/passwd | awk -F ":" '{print $1}'); do crontab -l -u $user; done  
 
(ps:這裏我改寫了部分linux命令使用,哈哈,雖然是轉載,可是也要有我本身的風格在裏面)
 
  • 是否某個定時任務運行過於頻繁?
  • 是否有些用戶提交了隱藏的定時任務?
  • 在出現故障的時候,是否正好有某個備份額任務正在執行?
 
 

應用系統日誌

這裏分析的東西可就多了,不過恐怕你做爲運維人員是沒功夫仔細研究它的。關注那麼明顯的問題,好比在一個典型的LAMP應用環境裏:
 
  • Apache&Nginx;查詢訪問和錯誤日誌,直接找5××錯誤,再看是否有limit_zone錯誤
  • Mysql;在mysql.log找錯誤信息,看看有沒有結構損壞的表,是否有innodb修復進程正在運行,是否有disk/index/query問題
  • PHP-FPM:若是設定了php-slow日誌,直接找錯誤信息
 

結論

通過這5分鐘以後,你應該對以下狀況比較清楚了:
  • 在服務器上運行的都是些啥?
  • 這個故障看起來是和IO/硬件/網絡或者系統配置相關
  • 這個故障是否有你熟悉的一些特徵?好比數據庫索引使用不當,或者太多的apache後臺進程

http://blog.csdn.net/wzy_1988/article/details/12355103php

相關文章
相關標籤/搜索