1. 程式人生 > 程式設計 >10分鐘教會你看懂top

10分鐘教會你看懂top

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

Load Average

先敲一個top瞅瞅

很多人說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這些都是常用的命令。

綜上

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