10 分鐘教會你看懂 top

後端們最怕的事情之一就是服務器的負載突然飆升,這可能又意味着一個個奪目 Call 馬上要打過來了。碰到這種情況怎麼辦,大家第一反應一定是登陸到服務器上,先敲一個 top 命令看看 Load Average 吧。今天這篇文章和大家說說怎麼看這個 “Load Average”。

Load Average

很多人說 Load Average 這一個指標就能說明系統負載高了,這句話是對的。那麼具體是哪裏壓力大了呢?這三個數值是怎麼計算出來的呢?可能很多人一下子都說不上來。

先來說說定義吧:**在一段時間內,CPU 正在處理以及等待 CPU 處理的進程數之和。**三個數字分別代表了 1 分鐘,5 分鐘,15 分鐘的統計值。

所以,這個數值的確能反應服務器的負載情況。但是,這個數值高了也並不能直接代表這臺機器的性能有問題。可能是因爲正在進行 CPU 密集型的計算,也有可能是因爲 I/O 問題導致運行隊列堵了。所以,當我們看到這個數值飆升的時候,還得具體問題具體分析。直接升級機器是簡單粗暴,但是治標不治本。

top 命令一行一行看

top 命令輸出了很多參數,真正的服務器負載情況我們要綜合其他參數一起看。

第一行:

top - 20:41:08 up 18 days,  5:24,  2 users,  load average: 0.04, 0.03, 0.05

top:當前時間
up:機器運行了多少時間
users:當前有多少用戶
load average:分別是過去1分鐘,5分鐘,15分鐘的負載

複製代碼

具體需要關注的果然還是 load average 這三個數值。大家都知道,一個 CPU 在一個時間片裏面只能運行一個進程,CPU 核數的多少直接影響到這臺機器在同時間能運行的進程數。所以一般來說 Load Average 的數值別超過這臺機器的總核數,就基本沒啥問題。

第二行:

Tasks: 216 total,   1 running, 215 sleeping,   0 stopped,   0 zombie

Tasks:當前有多少進程
running:正在運行的進程
sleeping:正在休眠的進程
stopped:停止的進程
zombie:殭屍進程

複製代碼

running 越多,服務器自然壓力越大。

第三行:

%Cpu(s):  0.2 us,  0.1 sy,  0.0 ni, 99.8 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st

us: 用戶進程佔CPU的使用率
sy: 系統進程佔CPU的使用率
ni: 用戶進程空間改變過優先級
id: 空閒CPU佔用率
wa: 等待輸入輸出的CPU時間百分比
hi: 硬件的中斷請求
si: 軟件的中斷請求
st: steal time

複製代碼

這一行代表了 CPU 的使用情況,us 長期過高,表明用戶進程佔用了大量的 CPU 時間。us+sy 如果長期超過 80 或者 90,可能就代表了 CPU 性能不足,需要加 CPU 了。

第四行&第五行
KiB Mem : 65810456 total, 30324416 free,  9862224 used, 25623816 buff/cache
KiB Swap:  7999484 total,  7999484 free,        0 used. 54807988 avail Mem

total:內存總量
free:空閒內存
used:使用的
buffer/cache: 寫緩存/讀緩存
複製代碼

第四第五行分別是內存信息和 swap 信息。所有程序的運行都是在內存中進行的,所以內存的性能對與服務器來說非常重要。不過當內存的 free 變少的時候,其實我們並不需要太緊張。真正需要看的是 Swap 中的 used 信息。Swap 分區是由硬盤提供的交換區,當物理內存不夠用的時候,操作系統纔會把暫時不用的數據放到 Swap 中。所以當這個數值變高的時候,說明內存是真的不夠用了。

第五行往下

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                                                                                                                  
19868 root      20   0 19.733g 369980  15180 S   0.7  0.6 129:53.91 java                                                                                                                                                                     
19682 root      20   0 19.859g 5.766g  22252 S   0.3  9.2 139:42.81 java                                                                                                                                                                     
54625 100       20   0   50868  33512   4104 S   0.3  0.1   0:04.68 fluentd                                                                               

PID:進程id
USER:進程所有者
PR:優先級。數值越大優先級越高
NI:nice值,負值表示高優先級,正值表示低優先級
VIRT:進程使用的虛擬內存總量
SWAP:進程使用的虛擬內存中被換出的大小
RES:進程使用的、未被換出的物理內存大小
SHR:共享內存大小
SHR:共享內存大小
S:進程狀態。D表示不可中斷的睡眠狀態;R表示運行;S表示睡眠;T表示跟蹤/停止;Z表示殭屍進程。
%CPU:上次更新到現在的CPU佔用百分比 ;
%MEM:進程使用的物理內存百分比 ;
TIME+:進程使用的CPU時間總計,單位1/100秒;
COMMAND:命令名/命令行

複製代碼

這些就是進程信息了,從這裏可以看到哪些進程佔用系統資源的概況。

其他命令

top 當然是我們最常見的查看系統狀況的命令。其他命令還有很多。vmstat,w,uptime ,iostat 這些都是常用的命令。

綜上

看懂這些具體參數以後,就知道自己的代碼到底哪方面需要改進了,是優化內存消耗,還是優化你的代碼邏輯,當然無腦堆機器也可以,只要你說服的了老闆!

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://juejin.cn/post/6844903919588491278