10分鐘教會你看懂top

後端們最怕的事情之一就是服務器的負載忽然飆升,這可能又意味着一個個奪目Call立刻要打過來了。碰到這種狀況怎麼辦,你們第一反應必定是登錄到服務器上,先敲一個top命令看看Load Average吧。今天這篇文章和你們說說怎麼看這個「Load Average」。java

Load Average

先敲一個top瞅瞅

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

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

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

top命令一行一行看

top命令輸出了不少參數,真正的服務器負載狀況咱們要綜合其餘參數一塊兒看。bash

第一行:

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中。因此當這個數值變高的時候,說明內存是真的不夠用了。spa

第五行往下

  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這些都是經常使用的命令。

綜上

看懂這些具體參數之後,就知道本身的代碼到底哪方面須要改進了,是優化內存消耗,仍是優化你的代碼邏輯,固然無腦堆機器也能夠,只要你說服的了老闆!

相關文章
相關標籤/搜索