Linux Top 命令

linux查看進程使用最多的命令應該是top命令了吧,咱們今天主要說明一下,top命令結果中各參數的意義,top命令結果以下:html

 

直觀上結果分爲上下兩部分,上部分主要是系統的信息,下部分是系統進程信息,下面詳細說明一下:node

第一行表明了系統運行時間,分別表示:linux

系統時間,系統運行到如今的時間,當前登錄系統的用戶數、系統平均負載的三個值,分別是5分鐘、10分鐘、15分鐘。安全

tip:說明一下什麼是系統負載,通常負載值越小越好,值也高說明系統的多是出現了某種問題的信息,可是也並非絕對的異步

借用網友的文章說明一下:https://www.cnblogs.com/TaleG/p/6030992.htmlsocket

一隻單核的處理器能夠形象得比喻成一條單車道,數字在0-1之間算正常,這樣來一輛車,該車不會等待直接經過;性能

0表示路上沒有車優化

1.00 表示道路還算正常,但有可能會惡化並形成擁堵。此時系統已經沒有多餘的資源了,管理員須要進行優化;ui

1.00-*** 表示路況不太好了,若是到達2.00表示有橋上車輛一倍數目的車輛正在等待。這種狀況你必須進行檢查了spa

若是咱們有兩條行車道呢?

滿負荷狀態的數字爲 "1.00 * CPU核數",即雙核CPU爲2.00,四核CPU爲4.00

SO:

單核負載在0.7如下是安全的,超過0.7就須要進行優化了

那應該看那個參數??

看5分鐘和15分鐘的比較好,即後面2個數字。

CPU的核數如何獲取呢??

grep 'model name' /proc/cpuinfo | wc -l

CPU核心數目N,觀察後面2個數字,用數字/N,若是獲得的值小於0.7便可無憂

 

上一張字段說明圖:

說明了第一行,第二行啥意思?

其實一眼就應該看出來,應該是系統進程數,第一列表示系統總進程數其次是運行進程、休眠進程、中止進程和殭屍進程

以後是系統CPU運行時間,「用戶空間佔用CPU百分比」、「內核空間佔用CPU百分比」、「用戶空間內改變過優先級的進程佔用CPU百分比」、「空閒CPU百分比」、「等待輸入輸出CPU時間百分比」、「CPU服務於硬件中斷所耗費的時間總額」、「CPU服務軟中斷所耗費的時間總額」、「Steal Time」

那麼CPU各個參數都表明了什麼意思呢?

看看那官方解釋:

us: user cpu time (or) % CPU time spent in user space

sy: system cpu time (or) % CPU time spent in kernel space

ni: user nice cpu time (or) % CPU time spent on low priority processes

id: idle cpu time (or) % CPU time spent idle

wa: io wait cpu time (or) % CPU time spent in wait (on disk)

hi: hardware irq (or) % CPU time spent servicing/handling hardware interrupts

si: software irq (or) % CPU time spent servicing/handling software interrupts

st: steal time - - % CPU time in involuntary wait by virtual cpu while hypervisor is servicing another processor (or) % CPU time stolen from a virtual machine

簡單翻譯一下:

us:用戶態使用的cpu時間比

sy:系統態使用的cpu時間比

ni:用作nice加權的進程分配的用戶態cpu時間比

id:空閒的cpu時間比

wa:cpu等待磁盤寫入完成時間

hi:硬中斷消耗時間

si:軟中斷消耗時間

st:虛擬機偷取時間

然並卵,仍是不懂:

咱們仍是看看CPU的百分比是如何計算的吧:

好比一秒內有100個cpu時間片,這個cpu時間片就是cpu工做的最小單位。那麼這100個cpu時間片在不一樣的區域和目的進行操做使用,就表明這個區域所佔用的cpu時間比。也就是這裏得出的cpu時間百分比,好比

將文件從磁盤的src位置拷貝到磁盤的dst位置。文件會從src先讀取進入到內核空間,而後再讀取到用戶空間,而後拷貝數據到用戶空間的buf上,再經過用戶空間,內核空間,數據纔到磁盤的dst上

因此從上面這個程序來看,cpu消耗在kernel space的時候就是sy(系統態使用的cpu百分比),cpu消耗在user space的時候就是us(用戶態使用的cpu百分比)。そうか

弄明白了前兩個,在說說hi和si兩個參數

若是程序都沒什麼問題,那麼是沒有hi和si的,可是實際上有個硬中斷和軟中斷的概念。好比硬中斷,cpu在執行程序的時候,忽然外設硬件(好比硬盤出現問題了)機器須要馬上通知cpu進行現場保存工做。這個時候會cpu會出現上下文切換。就是cpu會有一部分時間會被硬中斷佔用了,這個時間就是hi。相相似,si是軟中斷的cpu佔用時間,軟中斷是由軟件的指令方式觸發的。

相關軟中斷和硬中斷的概念能夠參考:

http://blog.csdn.net/pxz_002/article/details/7327668

 

下面是nice參數

ni是nice的意思,nice是什麼呢,每一個linux進程都有個優先級,優先級高的進程有優先執行的權利,這個叫作pri。進程除了優先級外,還有個優先級的修正值。即好比你原先的優先級是20,而後修正值爲-2,那麼你最後的進程優先級爲18。這個修正值就叫作進程的nice值。

 那麼問題來了,修改值是一個數字,怎麼會佔用系統時間呢???

ni是指用作nice加權的進程使用的用戶態cpu時間比,個人理解就是一個進程的所謂修正值就意味着多分配一些cpu時間給這個進程的用戶態,這個中間所多分配的cpu時間就是咱們這裏的ni。(這個理解沒啥把握,若是有錯誤麻煩幫忙指出下)

 wa什麼東西??

wa指的是CPU等待磁盤寫入完成的時間,就是說前提是要進行IO操做,在進行IO操做的時候,CPU等待時間。好比上面那個程序,最後一步,從系統空間到dst硬盤空間的時候,若是程序是阻塞的,那麼這個時候cpu就要等待數據寫入磁盤才能完成寫操做了。因此這個時候cpu等待的時間就是wa。

st:

st的名字很生動,偷取。。。是專門對虛擬機來講的,一臺物理是能夠虛擬化出幾臺虛擬機的。在其中一臺虛擬機上用top查看發現st不爲0,就說明原本有這麼多個cpu時間是安排給我這個虛擬機的,可是因爲某種虛擬技術,把這個cpu時間分配給了其餘的虛擬機了。這就叫作偷取。

剩下的id就是除了上面那麼多cpu處理上下文之外的cpu時間片。固然在這些時間片上,cpu是空閒的。

 

以後是內存:

 

第五行是交換分區:

 

最後是進程信息:

進程信息,說明一下進程狀態:Linux是多用戶系統,會產生不少進程,進程有各自的各類狀態

TASK_RUNNING(R):容許狀態,只有在該狀態的進程纔可能在CPU上運行。而同一時刻可能有多個進程處於可執行狀態,這些進程的task_struct結構(進程控制塊)被放入對應CPU的可執行隊列中(一個進程最多隻能出如今一個CPU的可執行隊列中)。進程調度器的任務就是從各個CPU的可執行隊列中分別選擇一個進程在該CPU上運行,不少操做系統教科書將正在CPU上執行的進程定義爲RUNNING狀態、而將可執行可是還沒有被調度執行的進程定義爲READY狀態,這兩種狀態在linux下統一爲 TASK_RUNNING狀態

TASK_INTERRUPTIBLE(S):可中斷的睡眠狀態,

處於這個狀態的進程由於等待某某事件的發生(好比等待socket鏈接、等待信號量),而被掛起。這些進程的task_struct結構被放入對應事件的等待隊列中。當這些事件發生時(由外部中斷觸發、或由其餘進程觸發),對應的等待隊列中的一個或多個進程將被喚醒。

經過ps命令咱們會看到,通常狀況下,進程列表中的絕大多數進程都處於TASK_INTERRUPTIBLE狀態(除非機器的負載很高)。畢竟CPU就這麼一兩個,進程動輒幾十上百個,若是不是絕大多數進程都在睡眠,CPU又怎麼響應得過來。

TASK_UNINTERRUPTIBLE(D):不可中斷睡眠狀態:

與TASK_INTERRUPTIBLE狀態相似,進程處於睡眠狀態,可是此刻進程是不可中斷的。不可中斷,指的並非CPU不響應外部硬件的中斷,而是指進程不響應異步信號。
絕大多數狀況下,進程處在睡眠狀態時,老是應該可以響應異步信號的。不然你將驚奇的發現,kill -9居然殺不死一個正在睡眠的進程了!因而咱們也很好理解,爲何ps命令看到的進程幾乎不會出現TASK_UNINTERRUPTIBLE狀態,而老是TASK_INTERRUPTIBLE狀態。

而TASK_UNINTERRUPTIBLE狀態存在的意義就在於,內核的某些處理流程是不能被打斷的。若是響應異步信號,程序的執行流程中就會被插入一段用於處理異步信號的流程(這個插入的流程可能只存在於內核態,也可能延伸到用戶態),因而原有的流程就被中斷了。(參見《linux內核異步中斷淺析》)
在進程對某些硬件進行操做時(好比進程調用read系統調用對某個設備文件進行讀操做,而read系統調用最終執行到對應設備驅動的代碼,並與對應的物理設備進行交互),可能須要使用TASK_UNINTERRUPTIBLE狀態對進程進行保護,以免進程與設備交互的過程被打斷,形成設備陷入不可控的狀態。這種狀況下的TASK_UNINTERRUPTIBLE狀態老是很是短暫的,經過ps命令基本上不可能捕捉到

 

我們再討論下進程內存的三個參數。虛擬內存、物理內存、共享內存

【虛擬內存】

首先須要強調的是虛擬內存不一樣於物理內存,雖然二者都包含內存字眼可是它們屬於兩個不一樣層面的概念。進程佔用虛擬內存空間大並不是意味着程序的物理內存也必定佔用很大。虛擬內存是操做系統內核爲了對進程地址空間進行管理(process address space management)而精心設計的一個邏輯意義上的內存空間概念。咱們程序中的指針其實都是這個虛擬內存空間中的地址。好比咱們在寫完一段C++程序以後都須要採用g++進行編譯,這時候編譯器採用的地址其實就是虛擬內存空間的地址。由於這時候程序尚未運行,何談物理內存空間地址?凡是程序運行過程當中可能須要用到的指令或者數據都必須在虛擬內存空間中。既然說虛擬內存是一個邏輯意義上(假象的)的內存空間,爲了可以讓程序在物理機器上運行,那麼必須有一套機制可讓這些假象的虛擬內存空間映射到物理內存空間(實實在在的RAM內存條上的空間)。這其實就是操做系統中頁映射表(page table)所作的事情了。內核會爲系統中每個進程維護一份相互獨立的頁映射表。。頁映射表的基本原理是將程序運行過程當中須要訪問的一段虛擬內存空間經過頁映射表映射到一段物理內存空間上,這樣CPU訪問對應虛擬內存地址的時候就能夠經過這種查找頁映射表的機制訪問物理內存上的某個對應的地址。「頁(page)」是虛擬內存空間向物理內存空間映射的基本單元。

      下圖演示了虛擬內存空間和物理內存空間的相互關係,它們經過Page Table關聯起來。其中虛擬內存空間中着色的部分分別被映射到物理內存空間對應相同着色的部分。而虛擬內存空間中灰色的部分表示在物理內存空間中沒有與之對應的部分,也就是說灰色部分沒有被映射到物理內存空間中。這麼作也是本着「按需映射」的指導思想,由於虛擬內存空間很大,可能其中不少部分在一次程序運行過程當中根本不須要訪問,因此也就沒有必要將虛擬內存空間中的這些部分映射到物理內存空間上。
 
到這裏爲止已經基本闡述了什麼是虛擬內存了。總結一下就是,虛擬內存是一個假象的內存空間,在程序運行過程當中虛擬內存空間中須要被訪問的部分會被映射到物理內存空間中。虛擬內存空間大隻能表示程序運行過程當中可訪問的空間比較大,不表明物理內存空間佔用也大。
 
t1
 

【駐留內存】

駐留內存,顧名思義是指那些被映射到進程虛擬內存空間的物理內存。上圖1中,在系統物理內存空間中被着色的部分都是駐留內存。好比,A一、A二、A3和A4是進程A的駐留內存;B一、B2和B3是進程B的駐留內存。進程的駐留內存就是進程實實在在佔用的物理內存。通常咱們所講的進程佔用了多少內存,其實就是說的佔用了多少駐留內存而不是多少虛擬內存。由於虛擬內存大並不意味着佔用的物理內存大。

關於虛擬內存和駐留內存這兩個概念咱們說到這裏。下面一部分咱們來看看top命令中VIRT、RES和SHR分別表明什麼意思。

搞清楚了虛擬內存的概念以後解釋VIRT的含義就很簡單了。VIRT表示的是進程虛擬內存空間大小。對應到圖1中的進程A來講就是A一、A二、A三、A4以及灰色部分全部空間的總和。也就是說VIRT包含了在已經映射到物理內存空間的部分和還沒有映射到物理內存空間的部分總和。

RES的含義是指進程虛擬內存空間中已經映射到物理內存空間的那部分的大小。對應到圖1中的進程A來講就是A一、A二、A3以及A4幾個部分空間的總和。因此說,看進程在運行過程當中佔用了多少內存應該看RES的值而不是VIRT的值

最後來看看SHR所表示的含義。SHR是share(共享)的縮寫,它表示的是進程佔用的共享內存大小。在上圖1中咱們看到進程A虛擬內存空間中的A4和進程B虛擬內存空間中的B3都映射到了物理內存空間的A4/B3部分。咋一看很奇怪。爲何會出現這樣的狀況呢?其實咱們寫的程序會依賴於不少外部的動態庫(.so),好比libc.so、libld.so等等。這些動態庫在內存中僅僅會保存/映射一份,若是某個進程運行時須要這個動態庫,那麼動態加載器會將這塊內存映射到對應進程的虛擬內存空間中。多個進展之間經過共享內存的方式相互通訊也會出現這樣的狀況。這麼一來,就會出現不一樣進程的虛擬內存空間會映射到相同的物理內存空間。這部分物理內存空間實際上是被多個進程所共享的,因此咱們將他們稱爲共享內存,用SHR來表示。某個進程佔用的內存除了和別的進程共享的內存以外就是本身的獨佔內存了。因此要計算進程獨佔內存的大小隻要用RES的值減去SHR值便可。

top對內存查看只能到該層次,若是想知道程序中對內存是如何使用則須要訪問進程的smaps文件,該文件詳細記錄了當前進程內存的詳細使用狀況

查看命令是:cat /proc/進程的pid/smaps

經過top命令咱們已經能看出進程的虛擬空間大小(VIRT)、佔用的物理內存(RES)以及和其餘進程共享的內存(SHR)。可是僅此而已,若是我想知道以下問題:

  1. 進程的虛擬內存空間的分佈狀況,好比heap佔用了多少空間、文件映射(mmap)佔用了多少空間、stack佔用了多少空間?
  2.  進程是否有被交換到swap空間的內存,若是有,被交換出去的大小?
  3. mmap方式打開的數據文件有多少頁在內存中是髒頁(dirty page)沒有被寫回到磁盤的?
  4. mmap方式打開的數據文件當前有多少頁面已經在內存中,有多少頁面還在磁盤中沒有加載到page cahe中?
  5. 等等

以上這些問題都沒法經過top命令給出答案,可是有時候這些問題正是咱們在對程序進行性能瓶頸分析和優化時所須要回答的問題。所幸的是,世界上解決問題的方法總比問題自己要多得多。linux經過proc文件系統爲每一個進程都提供了一個smaps文件,經過分析該文件咱們就能夠一一回答以上提出的問題。

 

在smaps文件中,每一條記錄(以下圖2所示)表示進程虛擬內存空間中一塊連續的區域。其中第一行從左到右依次表示地址範圍、權限標識、映射文件偏移、設備號、inode、文件路徑。詳細解釋能夠參見understanding-linux-proc-id-maps

接下來8個字段的含義分別以下:

  1. Size:表示該映射區域在虛擬內存空間中的大小。
  2. Rss:表示該映射區域當前在物理內存中佔用了多少空間。
  3. Shared_Clean:和其餘進程共享的未被改寫的page的大小。
  4. Shared_Dirty: 和其餘進程共享的被改寫的page的大小。
  5. Private_Clean:未被改寫的私有頁面的大小。
  6. Swap:表示非mmap內存(也叫anonymous memory,好比malloc動態分配出來的內存)因爲物理內存不足被swap到交換空間的大小。
  7. Pss:該虛擬內存區域平攤計算後使用的物理內存大小(有些內存會和其餘進程共享,例如mmap進來的)。好比該區域所映射的物理內存部分同時也被另外一個進程映射了,且該部分物理內存的大小爲1000KB,那麼該進程分攤其中一半的內存,即Pss=500KB。

t_2

 

應用博文:http://blog.csdn.net/rebirthme/article/details/50402082

相關文章
相關標籤/搜索