1. 程式人生 > 實用技巧 >伺服器變慢幾點分析

伺服器變慢幾點分析

面試官都這麼問了,我能說不能嗎?

生產伺服器變慢了,一般都是從這幾點去分析:伺服器整體情況, CPU 使用情況,記憶體,磁碟,磁碟 IO ,網路 IO

一一來說

top

看伺服器整體使用情況,一般都是 top 命令搞定

我知道當你看到這張圖的時候,肯定有點兒懵,特別是一個個的數字,這都是個啥?

阿粉帶你一行一行的看

第 1 行:系統時間、執行時間、登入終端數、系統負載(三個數值分別為1分鐘、5分鐘、15分鐘內的平均值,數值越小意味著負載越低)

第 2 行:程序總數、執行中的程序數、睡眠中的程序數、停止的程序數、僵死的程序數。一般情況下,只要沒有僵死的程序,就沒啥大問題。

第 3 行:使用者佔用資源百分比、系統核心佔用資源百分比、改變過優先順序的程序資源百分比、空閒的資源百分比等。

第 4 行:實體記憶體總量、記憶體空閒量、記憶體使用量、作為核心快取的記憶體量

第 5 行:虛擬記憶體總量、虛擬記憶體空閒量、虛擬記憶體使用量、已被提前載入的記憶體量

第 6 行裡面主要看 PID 和 COMMAND 這兩個引數,其中 PID 就是程序 ID , COMMAND 就是執行的命令,能夠看到比較靠前的兩個程序都是 java 程序

在當前這個介面,按下數字鍵盤 1 能夠看到各個 CPU 的詳細利用率

vmstat

想要了解 CPU 使用情況的話,常用的命令就是 vmstat 。

一般 vmstat 工具的使用是通過兩個數字引數來完成的,第一個引數是取樣的時間間隔,單位是秒,第二個引數是取樣的次數,阿粉這次的命令是:vmstat -n 3 2

意思就是隔 3 秒取樣一次,一共取樣 2 次

其中主要關注 procs 和 cpu 這兩個引數

procs :

  • r :執行和等待 CPU 時間片的程序數,一般來說整個系統的執行佇列不要超過總核數的 2 倍,要不然系統壓力太大了
  • b : 等待資源的程序數,比如正在等待磁碟 IO ,網路 IO 這種

cpu :

  • us :使用者程序消耗 CPU 時間百分比, us 值高的話,說明使用者程序消耗 CPU 時間比較長,如果長期大於 50% 的話,那就說明程式還有需要優化的地方
  • sy :核心程序消耗的 CPU 時間百分比
  • us + sy 參考值為 80% ,如果大於 80% 的話,說明可能存在 CPU 不足

free

檢視記憶體情況用的就是 free , 它主要有三個命令:freefree -gfree -m,阿粉是推薦free -m為啥呢,咱們瞅瞅它們各自的執行結果就知道了

其中:free命令執行結果顯示的非常不友好,看到 3880324 可以快速告訴我它是多大嗎?free -g這個命令四捨五入了,明明給的記憶體是 4G ,結果使用free -g一檢視,竟然成了 3G ?excuse me ?如果線上環境出問題了,你說因為記憶體給的不夠,運維說,這鍋我可不背

相對來說,free -m是比較容易看,而且結果也是比較精確的

如果應用程式可用記憶體/系統實體記憶體大於 70% 的話,說明記憶體是充足的,沒啥問題,但是如果小於 20% 的話,就要考慮增加記憶體了

df

如果排查磁碟問題的話,首先要看的就是磁碟空間夠不夠,還記得阿粉在上家公司的時候,用的還是 svn 出現了一個很神奇的問題,就是哪裡都不報錯,就是提交不上程式碼,排查到最後是磁碟空間不夠...

所以別問阿粉為啥排查磁碟問題時,第一就是看磁碟空間夠不夠!!!

檢視磁碟空間就是df或者df -h這兩個命令了

iostat

說到磁碟 IO 相信你一定能夠想到,在對資料庫進行操作時,第一要考慮到的就是磁碟 IO 操作,因為相對來說,如果在某個時間段給磁碟進行大量的寫入操作會造成程式等待時間長,導致客戶端那邊好久都沒啥反應,使用者體驗就降低了嗎

檢查磁碟 IO 情況的命令就是 iostat ,如果你用的時候發現提示:-bash: iostat: command not found,那是因為沒有安裝 sysstat ,安裝一下就可以了:yum install -y sysstat

接下來執行命令:iostat -xdk 3 2,和vmstat命令很像有沒有~

這麼多指標咱們不需要都關注,只要看其中這幾個就可以了:

  • rkB/s :每秒讀取資料量 kB ;
  • wkB/s :每秒寫入資料量 kB ;
  • svctm :I/O 請求的平均服務時間,單位毫秒;
  • util :一秒中有百分之幾的時間用於 I/O 操作,如果接近 100% 說明磁碟頻寬跑滿了,這個時候就要優化程式或者增加磁碟了

sar

網路 IO 的話,可以通過sar -n DEV 3 2這條命令來看,和上面的差不多,意思就是每隔 3 秒取樣一次,一共取樣 2 次。

其中:

  • IFACE :LAN 介面
  • rxpck/s :每秒鐘接收的資料包
  • txpck/s :每秒鐘傳送的資料包
  • rxKB/s :每秒接收的資料量,單位 KByte
  • txKB/s :每秒發出的資料量,單位 KByte
  • rxcmp/s :每秒鐘接收的壓縮資料包
  • txcmp/s :每秒鐘傳送的壓縮資料包
  • rxmcst/s:每秒鐘接收的多播資料包

這種方式特別簡單直觀,對新手來說比較容易看到

OK ,下次面試官問你生產伺服器變慢了,你能談談診斷思路嗎?咋不能呢,從伺服器整體情況開始說,一直到網路 IO ,再也不怕和麵試官扯皮了