Top命令基礎

top命令顯示多個PID的詳細信息,同時可以通過uptime來獲得同樣的第一行數據

top返回:

top - 19:58:17 up 63 days,  9:46,  1 user,  load average: 0.00, 0.02, 0.05
Tasks: 148 total,   1 running, 147 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.1%us,  0.1%sy,  0.0%ni, 99.8%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   4106756k total,  4081900k used,    24856k free,   284192k buffers
Swap:  1048568k total,     9252k used,  1039316k free,  1664760k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
13689 admin     20   0 4642m 1.6g  10m S  1.3 41.7 228:40.61 java
 2714 admin     20   0 15088 1276  964 R  0.3  0.0   0:00.03 top
 9003 root      20   0  224m  13m 3520 S  0.3  0.3  27:58.79 ilogtail
24285 root      20   0  784m 8928 2848 S  0.3  0.2 211:30.07 logagent
    1 root      20   0 19396 1064  880 S  0.0  0.0   0:09.04 init

uptime返回:

$ uptime
 19:58:52 up 63 days,  9:47,  1 user,  load average: 0.00, 0.01, 0.05

上面的結果分成幾列:

系統時間 極其運行時間 系統登錄用戶數 平均Load值,從左到右分別爲Load1 Load5 Load15
19:58:52 up 63 days, 9:47(已經啓動了63天多了) 1 user load average: 0.00, 0.01, 0.05

Load1 Load5 Load15 ,解釋爲 一分鐘,五分鐘,十五分鐘 Load 的平均值

可以通過who命令查看登錄的用戶

$ who
admin    pts/0        2017-06-15 18:01 (xx.xx.xx.xx)

#(xx.xx.xx.xx)爲ip地址

其中,pts表示通過ssh遠程登錄的,後面一列表示登錄時間

類似的還有w命令,可以看到更多的信息

$ w
20:07  up 3 days, 10:59, 3 users, load averages: 2.05 2.17 2.14
USER     TTY      FROM              LOGIN@  IDLE WHAT
yunpeng.byp console  -                一09   3days -
yunpeng.byp s001     -                15:44       1 ssh xxx@xxx.xxx
yunpeng.byp s002     -                20:00       - w

名字後面的WHAT對應的w表示是該用戶在執行命令.

如果需要查看用戶的命令執行歷史,除了使用

history

還可以直接觀察.bash_history來獲取每個用戶的操作記錄

Load

Load表示CPU處理隊列的長度

以單核CPU舉例,單核CPU的Load滿載爲1,表示一個處理時刻cpu處理一個任務

Load是可以大於1的,說明一個處理時刻,cpu需要處理的任務數大於1個,這個時候極其已經在超負荷運行了

這些場景類似於同步,只有一個線程可以訪問,如果後面還有線程需要繼續調度,只能排隊.

4核cpu則Load滿載爲4,Load爲8則表示同一時刻,有4個任務在處理,有4個任務在等待.

Load參數表明了目前系統的運行情況,通常情況下,幾核的cpu的Load最大負載就是幾,8核cpu最大Load負載就是8,超過8說明此時極其已經在超負荷運行.

下面可以看top的第二行

Tasks: 148 total,   1 running, 147 sleeping,   0 stopped,   0 zombie

Tasks

第二行是系統此時的進程情況

目前系統所有進程數 運行進程數 sleep進程數 中斷進程數 殭屍進程數
148 total 1 running 147 sleeping 0 stopped 0 zombie

在觀察cpu情況時,如果出現過多的殭屍進程或者中斷進程,需要考慮系統是否存在調整過優先級的進程或進程設計是否存在問題.可以考慮重啓機器

任務的狀態分成如下一些狀態:

  • TASK_RUNNING: 進程當前正在運行,或者正在運行隊列中等待調度
  • TASK_INTERRUPTIBLE: 進程處於睡眠狀態,正在等待某些事件的發生.進程可以被信號中斷.接收到信號或被顯式的喚醒呼叫喚醒之後,進程轉變成爲TASK_RUNNING狀態.
  • TASK_UNINTERRUPTIBLE: 此進程狀態類似於TASK_INTERRUPTIBLE,只是它不會處理信號,中斷處於這種狀態的進程是不合適的,因爲它可能正在完成一些重要的任務.當它所等待的時間發生時,進程江北顯式的喚醒所喚醒
  • TASK_STOPPED: 進程已經終止執行,它沒有運行,並且不能運行,接收到SIGSTOP和SIGTSTP等信號時,進程將進入這種狀態.接收到SIGCONT信號之後,進程將再次變得可運行.
  • TASK_TRACED: 正被調試程序等待其他進程監控時,進程將進入這種狀態.
  • EXIT_ZOMBIE: 進程已終止,它正等待其父進程收集關於他們的一些統計信息.
  • EXIT_DEAD: 最終狀態.將進程從系統中刪除時,它將進入此狀態,因爲其父進程已經通過wait4()或者waitpid()調用收集了所有的統計信息.

CPU

第三行

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

用man可以看到其中的具體含義:

  • us: user mode
  • sy: system mode
  • ni: low priority user mode (nice)
  • id: idle task
  • wa: I/O waiting
  • hi: servicing IRQs
  • si: servicing soft IRQs
  • st: steal (time give to other DomU instances)

top展示下,按數字鍵1可以看到cpu的核數核每個cpu的具體情況

Cpu0  :  0.0%us,  0.0%sy,  0.0%ni, 99.7%id,  0.0%wa,  0.0%hi,  0.0%si,  0.3%st
Cpu1  :  0.0%us,  0.3%sy,  0.0%ni, 99.7%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu2  :  0.0%us,  0.3%sy,  0.0%ni, 99.7%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu3  :  0.0%us,  0.0%sy,  0.0%ni, 99.7%id,  0.0%wa,  0.0%hi,  0.0%si,  0.3%st

us和sy

us指的是用戶控件佔cpu的時間百分比,sy指的是系統空間佔用cpu的百分比

將linux系統分爲三部分,最底下是硬件配置,中間是系統空間,最上面是用戶空間

這裏寫圖片描述

進程在執行用戶自己的代碼時,則稱其處於用戶狀態,此時耗時的cpu的百分比爲us,而一個任務(進程)執行系統調用而陷入內核代碼中執行時,稱進程處於內核運行態,此時耗費cpu的百分比爲sy

用戶代碼與系統代碼在內存中是分開存儲的,一般而言,系統代碼存放在內存的高位中.

舉個具體的事例而言,例如我們要調用java的httpclient發送http請求,那麼對httpclient代碼的處理,參數的填寫,這些動作的執行,都算是用戶控件的cpu耗費,而最後需要調用網卡驅動去發送網絡信號,這些,則算是系統控件的cpu耗費.

這裏寫圖片描述

我們在cp文件時,需要先將文件拷貝到內核空間的Buffer上,在拷貝到用戶空間的buffer上,再反過來,從用戶空間的buffer上,到系統空間的buffer上,再到磁盤上.

而在這個過程中,在系統空間耗費的cpu時間片就是sy,而在用戶空間的耗費就是us

ni

ni全稱是nice,用戶進程空間內改變過優先級的進程佔用CPU百分比.
我們知道,現在的cpu是按照時間片來完成多任務的執行的,若每個進程的優先級相同,則每個進程執行的時間片分配都是一致的,但實際情況是往往會有低優先級與高優先級進程區分.

ni對每個進程而言也是一個固定的值,負值表示高優先級,正值表示低優先級,數值從-20(最高)到19(最低優先級),我們可以通過改變進程的ni值,靈氣獲取更多的cpu時間片,這個ni值默認爲0.

所以ni指的就是,用戶進程空間內該表過優先級使優先級變高的進程佔用CPU百分比

wa

wa是等待磁盤讀寫消耗的cpu時間,在磁盤寫入時,cpu需等待磁盤寫入完成纔可以進行下一步操作

如果top命令下,wa的比例特別高,需要考慮下磁盤的寫入是否特別大,針對業務來講就是要看下日誌輸出是否過多,引起cpu消耗過多

hi si

hi si是硬中斷,軟中斷耗費的cpu時間.
硬中斷是由外部硬件發起的cpu中斷信號,由終端控制器提供,如網卡數據來了,鍵盤按鍵了之類的都算是硬中斷,硬中斷的cpu消耗是正常的,但是不會大量消耗,出現了硬中斷比例很高,一般是計算機硬件出問題了

可以通過

cat /proc/interrupts

來查看

在網絡非常heavy的情況下,對於文件服務器,高流量 Web 服務器這樣的應用來說,把不同的網卡IRQ均衡綁定到不同的CPU上將會減輕某個CPU的負擔,提高多個CPU整體處理終端的能力;對於數據庫服務器這樣的應用來說,把磁盤控制器綁到一個CPU,把網卡綁定到另一個CPU將會提高數據庫的響應時間,優化性能.合理的根據自己的生產環境和應用的特點來平衡IRQ中斷有助於提高系統的整體吞吐能力和性能.

至於軟中斷,知識比硬中斷少了一個硬件發送信號的動作,其他與硬中斷基本類似.

當前正在運行的代碼(或進程)纔會產生軟終端.這種中斷時一種需要內核爲正在運行的進程去做一些事情(通常爲I/O)的請求

也就是說,系統中的硬中斷,軟中斷的CPU消耗是正常的,但如果大量CPU消耗,則需要重點排查.

id,st

id爲空閒時間時間佔比

st這個項只有主機是虛擬機的時候,纔會存在,全稱爲steel,意味着虛擬機從宿主機獲取cpu時間片的消耗百分比,如果這個值過多,則需要查看宿主機是否過多的分配虛擬機,引起資源不足

內存

top的最後兩行是內存相關的信息:

Mem:   4106756k total,  4086516k used,    20240k free,   318040k buffers
Swap:  1048568k total,     9240k used,  1039328k free,  1173960k cached

第一行Mem顯示的是極其的真是內存數
第二行Swap顯示的是交換內存數

Mem中,total顯示的是內存的總量,這裏的單位是大K,也就是約4G左右內存總數,used表示已使用內存數,free是空閒內存數,buffer是buffer內存數,cache爲cache的內存數
Swap中,total,used,free三個參數的表示內存交換空間中的總量,已使用內存與空閒空間.

total,used,free都很好理解,無論是Mem中還是Swap中都是一個意思total = used + free.下面重點來看buffers和cache內存佔用的說明.

used的內存佔用接近了4個G,並不意味着極其內存全部被耗完,windows下用多少申請多少內存,但是linux下則不然,內存總是不嫌多的,linux會將讀取過的數據都緩存起來,以便下次讀取時減少讀取時間.即使你的程序運行結束後,內存也不會自動釋放.這就會導致你在linux系統中程序頻繁讀寫文件後,發現物理內存變少.

而cache與buffer就屬於linux系統的緩存內存,這部分的緩存內存和其他程序真實真實需要使用內存的時候,則會釋放.所以程序真實使用的內存數應該是used - buffer -cache,就上面的數據而言是:

4086516k - 20240k - 318040k  = 3748236k

大約是3.7g

在linux上使用

free -m
$ free -m
             total       used       free     shared    buffers     cached
Mem:          4010       3986         23          0        310       1143
-/+ buffers/cache:       2532       1477
Swap:         1023          9       1014

同樣可以看到這些信息

cache和buffer的用途不同,cache表示從硬盤中讀取文件中到內存的緩存,例如vim打開一個92M左右的文件,打開前,內存的緩存佔用增加93M

OS處理網絡數據的速度遠超過網卡接受數據,因此需要一個Buffer,等存滿了一次性交給OS又比如從數據庫獲取數據很慢,所以對於不經常修改的數據,就一次性取出,放入Cache,將來就不去數據取了
Buffer是待處理的數據,Cache是處理結果

進程狀態

top的最後一行是系統中所有系統的進程情況,開發者可以通過找到指定的進程,然後再去分析進程的詳細情況

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章