202008 阿里P7面試之生產環境變慢問題,排查思路

前提:面試我的阿里的哥們兒聽到我這麼詳細的分析了一波,我從他的語氣裏面看出,他大概知道,我做過這方面的分析,但是光是這些分析,也只能說明一些基礎的問題,還是得在工作中實戰的去總結問題。

1.問題描述:生產環境變慢問題,變慢這個問題主要是感官上的變慢,究其原因有兩方面 服務器全局慢,服務器局部慢。

  1.2.服務器全局慢包括cpu 慢,內存慢,io/磁盤慢,io/網絡慢。

  1.3.服務器局部慢指得是發現某一個或者多個服務很慢。

2.全局查詢思路:

   2.1 top 命令(進程,cpu,內存)

  第 1 行:系統時間、運行時間、登錄終端數、系統負載(三個數值分別爲1分鐘、5分鐘、15分鐘內的平均值,數值越小意味着負載越低)。
  第 2 行:進程總數、運行中的進程數、睡眠中的進程數、停止的進程數、僵死的進程數。一般情況下,只要沒有僵死的進程,就沒啥大問題。
  第 3 行:用戶佔用資源百分比、系統內核佔用資源百分比、改變過優先級的進程資源百分比、空閒的資源百分比等。
  第 4 行:物理內存總量、內存空閒量、內存使用量、作爲內核緩存的內存量。
  第 5 行:虛擬內存總量、虛擬內存空閒量、虛擬內存使用量、已被提前加載的內存量。
  第 6 行裏面主要看 PID 和 COMMAND 這兩個參數,其中 PID 就是進程 ID , COMMAND 就是執行的命令,能夠看到比較靠前的兩個進程都是 java 進程。


  在當前這個界面,按下數字鍵盤1刷新信息,能夠看到各個 CPU(多核情況) 的詳細利用率變化,按下數字鍵盤m ,能夠查看內存使用情況.

  2.2 vmstat 命令(cpu 內存 io 系統)

vmstat -n 3 2 

-n 3 2 間隔3秒採集2次

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

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

  2.3 free(內存)

free -m 

  2.4 df (磁盤使用情況)

df -h 

  2.5 iostat(cpu 核心數,網絡io)

iostat -xdk 3 2

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

3.局部查詢思路。

top 發現有問題的進程,對於進程進行查看,這裏我只說java 進程的服務,cpu 標高,懷疑內存泄漏導致的full gc 還有就是線程死鎖,

  3.1  jps -ln (查看java 進程)

  3.2 jmap -histo {pid}

grep 一下GC 的信息,也可以查詢GC 的 信息。(這裏就能查詢到是否都是FULL GC)

grep Wating on  (這裏就可以查看到是否是有線程死鎖的問題)