來自公衆號:Java極客技術
作者鴨血粉絲
面試官都這麼問了,我能說不能嗎?
生產服務器變慢了,一般都是從這幾點去分析:服務器整體情況, 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 , 它主要有三個命令:free
free -g
free -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 ,再也不怕和麪試官扯皮了