Linux中CPU與內存性能監測

DarbyBowden 8年前發布 | 52K 次閱讀 Linux

來自: http://blog.csdn.net//chenleixing/article/details/46678413


在系統維護的過程中,隨時可能有需要查看 CPU 使用率內存使用情況的需要,尤其是涉及到JVM,程序調優的情況,并根據相應信息分析系統狀況的需要。

top命令

top命令是Linux下常用的性能分析工具,能夠實時顯示系統中各個進程的資源占用狀況,類似于Windows的任務管理器。運行 top 命令后,CPU 使用狀態會以全屏的方式顯示,并且會處在對話的模式 -- 用基于 top 的命令,可以控制顯示方式等等。退出 top 的命令為 q (在 top 運行中敲 q 鍵一次)。

可以直接使用top命令后,查看%MEM的內容。可以選擇按進程查看或者按用戶查看,如想查看oracle用戶的進程內存使用情況的話可以使用top -u oracle,以下為在CentOS中top命令的截圖:


內容解釋:

第一行(top):

15:59:14 系統當前時刻

167 days 系統啟動后到現在的運作時間

1 user 當前登錄到系統的用戶,更確切的說是登錄到用戶的終端數 -- 同一個用戶同一時間對系統多個終端的連接將被視為多個用戶連接到系統,這里的用戶數也將表現為終端的數目

load average 當前系統負載的平均值,后面的三個值分別為1分鐘前、5分鐘前、15分鐘前進程的平均數,一般的可以認為這個數值超過 CPU 數目時,CPU 將比較吃力的負載當前系統所包含的進程

第二行(Tasks):

75 total 當前系統進程總數

1 running 當前運行中的進程數

74 sleeping 當前處于等待狀態中的進程數

0 stoped 被停止的系統進程數

0 zombie 僵尸進程數

第三行(Cpus):

0.0% us 用戶空間占用CPU百分比
0.3% sy 內核空間占用CPU百分比
0.0% ni 用戶進程空間內改變過優先級的進程占用CPU百分比
99.7% id 空閑CPU百分比
0.0% wa 等待輸入輸出的CPU時間百分比
0.0% hi
0.0% si

0.0% st

第四行(Mem):

1018600k total 物理內存總量
798356k used 使用的物理內存總量
220244k free 空閑內存總量
180628k buffers 用作內核緩存的內存量
Swap: 192772k total 交換區總量
0k used 使用的交換區總量
192772k free 空閑交換區總量
123988k cached 緩沖的交換區總量

    

第五行(Swap):

表示類別同第四行(Mem),但此處反映著交換分區(Swap)的使用情況。通常,交換分區(Swap)被頻繁使用的情況,將被視作物理內存不足而造成的。

0k total 交換區總量
0k used 使用的交換區總量
0k free 空閑交換區總量
420732k cached 緩沖的交換區總量

最下部分的進程列表欄:

以 PID 區分的進程列表將根據所設定的畫面更新時間定期的更新。通過 top 內部命令可以控制此處的顯示方式:

PID:進程的ID
USER:進程所有者
PR:進程的優先級別,越小越優先被執行
NInice:值
VIRT:進程占用的虛擬內存
RES:進程占用的物理內存
SHR:進程使用的共享內存
S:進程的狀態。S表示休眠,R表示正在運行,Z表示僵死狀態,N表示該進程優先值為負數
%CPU:進程占用CPU的使用率
%MEM:進程使用的物理內存和總內存的百分比
TIME+:該進程啟動后占用的總的CPU時間,即占用CPU使用時間的累加值。
COMMAND:進程啟動命令名稱

 

top 運行中可以通過 top 的內部命令對進程的顯示方式進行控制。內部命令如下表:

  s- 改變畫面更新頻率

  l - 關閉或開啟第一部分第一行 top 信息的表示

  t - 關閉或開啟第一部分第二行 Tasks 和第三行 Cpus 信息的表示

  m - 關閉或開啟第一部分第四行 Mem 和 第五行 Swap 信息的表示

  N - 以 PID 的大小的順序排列表示進程列表(第三部分后述)

  P - 以 CPU 占用率大小的順序排列進程列表 (第三部分后述)

  M - 以內存占用率大小的順序排列進程列表 (第三部分后述)

  h - 顯示幫助

  n - 設置在進程列表所顯示進程的數量

  q - 退出 top

  s -改變畫面更新周期

 

 sar命令

sar命令也是Linux系統中重要的性能監測工具之一,它可以周期性地對內存和CPU使用情況進行采樣。

基本語法如下:

sar [options]  [-A]  [-o file] t [n]

在命令行中,n 和t 兩個參數組合起來定義采樣間隔和次數,t為采樣間隔,是必須有
的參數,n為采樣次數,是可選的,默認值是1,-o file表示將命令結果以二進制格式
存放在文件中,file 在此處不是關鍵字,是文件名。options 為命令行選項,sar命令
的 選項很多,下面只列出常用選項:
-A:所有報告的總和
-u:CPU利用率
-v:進程、I節點、文件和鎖表狀態
-d:硬盤使用報告
-r:沒有使用的內存頁面和硬盤塊
-g:串口I/O的情況
-b:緩沖區使用情況
-a:文件讀寫情況
-c:系統調用情況
-R:進程的活動情況
-y:終端設備活動情況
-w:系統交換活動

例一:

獲取I/O信息,每秒鐘采樣一次,共計采樣3次:

例二:使用命行sar -v t n

例如,每30秒采樣一次,連續采樣5次,觀察核心 表的狀態,需鍵入如下命令:

# sar -v 30 5

屏幕顯示:
     

SCO_SV scosysv 3.2v5.0.5 i80386 10/01/2001 
       10:33:23 proc-sz ov inod-sz ov file-sz ov lock-sz   (-v) 
10:33:53 305/ 321  0 1337/2764  0 1561/1706 0 40/ 128 
10:34:23 308/ 321  0 1340/2764  0 1587/1706 0 37/ 128 
10:34:53 305/ 321  0 1332/2764  0 1565/1706 0 36/ 128 
10:35:23 308/ 321  0 1338/2764  0 1592/1706 0 37/ 128 
10:35:53 308/ 321  0 1335/2764  0 1591/1706 0 37/ 128

顯示內容包括:

proc-sz:目前核心中正在使用或分配的進程表的表 項數,由核心參數MAX-PROC控制。

inod-sz:目前核心中正在使用或分配的i節點表的表項數,由核心參數 MAX- INODE控制。

file-sz: 目前核心中正在使用或分配的文件表的表項數,由核心參數MAX-FILE控 制。

ov:溢出出現的次數。

Lock-sz:目前核心中正在使用或分配的記錄加鎖的表項數,由核心參數MAX-FLCKRE控 制。

顯示格式為

實際使用表項/可以使用的表項數顯示內容表示,核心使用完全正常,三個表沒有出現 溢出現象,核心參數不需調整,如果出現溢出時,要調整相應的核心參數,將對應的表項數加大。

例三:使用命行sar -d t n
例如,每30秒采樣一次,連續采樣5次,報告設備使用情況,需鍵入如下命令:
# sar -d 30 5
屏幕顯示:

 SCO_SV scosysv 3.2v5.0.5 i80386 10/01/2001 
11:06:43 device %busy   avque   r+w/s  blks/s  avwait avserv (-d) 
11:07:13 wd-0   1.47   2.75   4.67   14.73   5.50 3.14 
11:07:43 wd-0   0.43   18.77   3.07   8.66   25.11 1.41 
11:08:13 wd-0   0.77   2.78   2.77   7.26   4.94 2.77 
11:08:43 wd-0   1.10   11.18   4.10   11.26   27.32 2.68 
11:09:13 wd-0   1.97   21.78   5.86   34.06   69.66 3.35 
Average wd-0   1.15   12.11   4.09   15.19   31.12 2.80 
 

顯示內容包括:
device: sar命令正在監視的塊設備的名字。
%busy: 設備忙時,傳送請求所占時間的百分比。
avque: 隊列站滿時,未完成請求數量的平均值。 
r+w/s: 每秒傳送到設備或從設備傳出的數據量。
blks/s: 每秒傳送的塊數,每塊512字節。
avwait: 隊列占滿時傳送請求等待隊列空閑的平均時間。
avserv: 完成傳送請求所需平均時間(毫秒)。

在顯示的內容中,wd-0是硬盤的名字,%busy的值比較小,說明用于處理傳送請求的有 效 時間太少,文件系統效率不高,一般來講,%busy值高些,avque值低些,文件系統 的效率比較高,如果%busy和avque值相對比較 高,說明硬盤傳輸速度太慢,需調整。

例四:使用命行sar -b t n
例如,每30秒采樣一次,連續采樣5次,報告緩沖區的使用情 況,需鍵入如下命令:
# sar -b 30 5

屏幕顯示:

SCO_SV scosysv 3.2v5.0.5 i80386 10/01/2001 
14:54:59 bread/s lread/s %rcache bwrit/s lwrit/s %wcache pread/s pwrit/s (-b) 
14:55:29 0  147  100  5  21  78   0   0 
14:55:59 0  186  100  5  25  79   0   0 
14:56:29  4  232   98  8  58  86   0   0 
14:56:59 0  125  100  5  23  76   0   0 
14:57:29 0   89  100  4  12  66   0   0 
Average  1  156   99  5  28  80   0   0


  

顯示內容包括:
bread/s: 每秒從硬盤讀入系統緩沖區buffer的物理塊數。
lread/s: 平均每秒從系統buffer讀出的邏輯塊數。
%rcache: 在buffer cache中進行邏輯讀的百分比。
bwrit/s: 平均每秒從系統buffer向磁盤所寫的物理塊數。
lwrit/s: 平均每秒寫到系統buffer邏輯塊數。
%wcache: 在buffer cache中進行邏輯讀的百分比。
pread/s: 平均每秒請求物理讀的次數。
pwrit/s: 平均每秒請求物理寫的次數。

在顯示的內容中,最重要的是%cache 和%wcache兩列,它們的值體現著buffer的使用效 率,%rcache的值小于90或者%wcache的值低于65,應適當增加系統 buffer的數量,buffer 數量由核心參數NBUF控制,使%rcache達到90左右,%wcache達到80左右。但buffer參 數值的多少影響I/O效率,增加buffer,應在較大內存的情況下,否則系統效率反而得不到提高。
例五:使用命行sar -g t n
例 如,每30秒采樣一次,連續采樣5次,報告串口I/O的操作情況,需鍵入如下命令:
# sar -g 30 5

屏幕顯示: 
SCO_SV scosysv 3.2v5.0.5 i80386  11/22/2001 
17:07:03  ovsiohw/s  ovsiodma/s  ovclist/s (-g) 
17:07:33   0.00   0.00   0.00 
17:08:03    0.00   0.00   0.00 
17:08:33   0.00   0.00   0.00 
17:09:03    0.00   0.00   0.00 
17:09:33   0.00   0.00   0.00 
Average    0.00   0.00   0.00

顯示內容包括:
ovsiohw/s:每秒在串口I/O硬件出現的溢出。
ovsiodma/s: 每秒在串口I/O的直接輸入輸出通道高速緩存出現的溢出。
ovclist/s :每秒字符隊列出現的溢出。
在顯示的內容中,每一列的 值都是零,表明在采樣時間內,系統中沒有發生串口I/O溢 出現象。

sar命令的用法很多,有時判斷一個問題,需要幾個sar 命令結合起來使用,比如,懷疑 CPU存在瓶頸,可用sar -u 和sar -q來看,懷疑I/O存在瓶頸,可用sar -b、sar -u和 sar-d來看。

 

vmstat命令

vmstat命令是最常見的Linux/Unix監控工具,可以展現給定時間間隔的服務器的狀態值,包括服務器的CPU使用率,內存使用,虛擬內存交換情況,IO讀寫情況。這個命令是我查看Linux/Unix最喜愛的命令,一個是Linux/Unix都支持,二是相比top,我可以看到整個機器的CPU,內存,IO的使用情況,而不是單單看到各個進程的CPU使用率和內存使用率(使用場景不一樣)。
一般vmstat工具的使用是通過兩個數字參數來完成的,第一個參數是采樣的時間間隔數,單位是秒,第二個參數是采樣的次數,如:

3表示每個三秒采集一次服務器狀態,2表示只采集兩次。
實際上,在應用過程中,我們會在一段時間內一直監控,不想直接結束vmstat監控,那么就直接把后邊的表示采集次數的去掉即可,如:

其中,各個參數的意義如下:

r 表示運行隊列(就是說多少個進程真的分配到CPU),我測試的服務器目前CPU比較空閑,沒什么程序在跑,當這個值超過了CPU數目,就會出現CPU瓶頸了。這個也和top的負載有關系,一般負載超過了3就比較高,超過了5就高,超過了10就不正常了,服務器的狀態很危險。top的負載類似每秒的運行隊列。如果運行隊列過大,表示你的CPU很繁忙,一般會造成CPU使用率很高。

b 表示阻塞的進程,這個不多說,進程阻塞,大家懂的。

swpd 虛擬內存已使用的大小,如果大于0,表示你的機器物理內存不足了,如果不是程序內存泄露的原因,那么你該升級內存了或者把耗內存的任務遷移到其他機器。

free   空閑的物理內存的大小,我的機器內存總共8G,剩余3415M。

buff   Linux/Unix系統是用來存儲,目錄里面有什么內容,權限等的緩存,我本機大概占用300多M

cache cache直接用來記憶我們打開的文件,給文件做緩沖,我本機大概占用300多M(這里是Linux/Unix的聰明之處,把空閑的物理內存的一部分拿來做文件和目錄的緩存,是為了提高 程序執行的性能,當程序使用內存時,buffer/cached會很快地被使用。)

si  每秒從磁盤讀入虛擬內存的大小,如果這個值大于0,表示物理內存不夠用或者內存泄露了,要查找耗內存進程解決掉。我的機器內存充裕,一切正常。

so  每秒虛擬內存寫入磁盤的大小,如果這個值大于0,同上。

bi  塊設備每秒接收的塊數量,這里的塊設備是指系統上所有的磁盤和其他塊設備,默認塊大小是1024byte,我本機上沒什么IO操作,所以一直是0,但是我曾在處理拷貝大量數據(2-3T)的機器上看過可以達到140000/s,磁盤寫入速度差不多140M每秒

bo 塊設備每秒發送的塊數量,例如我們讀取文件,bo就要大于0。bi和bo一般都要接近0,不然就是IO過于頻繁,需要調整。

in 每秒CPU的中斷次數,包括時間中斷

cs 每秒上下文切換次數,例如我們調用系統函數,就要進行上下文切換,線程的切換,也要進程上下文切換,這個值要越小越好,太大了,要考慮調低線程或者進程的數目,例如在apache和nginx這種web服務器中,我們一般做性能測試時會進行幾千并發甚至幾萬并發的測試,選擇web服務器的進程可以由進程或者線程的峰值一直下調,壓測,直到cs到一個比較小的值,這個進程和線程數就是比較合適的值了。系統調用也是,每次調用系統函數,我們的代碼就會進入內核空間,導致上下文切換,這個是很耗資源,也要盡量避免頻繁調用系統函數。上下文切換次數過多表示你的CPU大部分浪費在上下文切換,導致CPU干正經事的時間少了,CPU沒有充分利用,是不可取的。

us 用戶CPU時間,我曾經在一個做加密解密很頻繁的服務器上,可以看到us接近100,r運行隊列達到80(機器在做壓力測試,性能表現不佳)。

sy 系統CPU時間,如果太高,表示系統調用時間長,例如是IO操作頻繁。

id  空閑 CPU時間,一般來說,id + us + sy = 100,一般我認為id是空閑CPU使用率,us是用戶CPU使用率,sy是系統CPU使用率。

wt 等待IO CPU時間。

 

iostat命令

iostat命令主要用于監控系統設備的IO負載情況,iostat首次運行時顯示自系統啟動開始的各項統計信息,之后運行iostat將顯示自上次運行該命令以后的統計信息。用戶可以通過指定統計的次數和時間來獲得所需的統計信息。

語法:

iostat [ -c ] [ -d ] [ -h ] [ -N ] [ -k | -m ] [ -t ] [ -V ] [ -x ] [ -z ] [ device [...] | ALL ] [ -p [ device [,...] | ALL ] ] [ interval [ count ] ]

如 iostat -d -k 1

參數 -d 表示,顯示設備(磁盤)使用狀態;-k某些使用block為單位的列強制使用Kilobytes為單位;1表示,數據顯示每隔1秒刷新一次。

詳細內容,請參考博文:Linux IO實時監控iostat命令詳解

pidstat命令

pidstat命令用來監控被Linux內核管理的獨立任務(進程)。它輸出每個受內核管理的任務的相關信息。pidstat命令也可以用來監控特定進程的子進程。間隔參數用于指定每次報告間的時間間隔。它的值為0(或者沒有參數)說明進程的統計數據的時間是從系統啟動開始計算的。
pidstat 是sysstat軟件套件的一部分,sysstat包含很多監控linux系統狀態的工具,它能夠從大多數linux發行版的軟件源中獲得。
在Debian/Ubuntu系統中可以使用下面的命令來安裝:
# apt-get install sysstat
CentOS/Fedora/RHEL版本的linux中則使用下面的命令:
# yum install sysstat

默認參數

執行pidstat,將輸出系統啟動后所有活動進程的cpu統計信息:

 

linux:~ # pidstat
Linux 2.6.32.12-0.7-default (linux)             06/18/12        _x86_64_

11:37:19          PID    %usr %system  %guest    %CPU   CPU  Command
……
11:37:19        11452    0.00    0.00    0.00    0.00     2  bash
11:37:19        11509    0.00    0.00    0.00    0.00     3  dd


 

指定采樣周期和采樣次數

pidstat命令指定采樣周期和采樣次數,命令形式為”pidstat [option] interval [count]”,以下pidstat輸出以2秒為采樣周期,輸出10次cpu使用統計信息:

pidstat 2 10

 

 

cpu使用情況統計(-u)

使用-u選項,pidstat將顯示各活動進程的cpu使用統計,執行”pidstat -u”與單獨執行”pidstat”的效果一樣。

 

內存使用情況統計(-r)

使用-r選項,pidstat將顯示各活動進程的內存使用統計:

linux:~ # pidstat -r -p 13084 1
Linux 2.6.32.12-0.7-default (linux)             06/18/12        _x86_64_

15:08:18          PID  minflt/s  majflt/s     VSZ    RSS   %MEM  Command
15:08:19        13084 133835.00      0.00 15720284 15716896  96.26  mmmm
15:08:20        13084  35807.00      0.00 15863504 15849756  97.07  mmmm
15:08:21        13084  19273.87      0.00 15949040 15792944  96.72  mmmm

以上各列輸出的含義如下:

minflt/s: 每秒次缺頁錯誤次數(minor page faults),次缺頁錯誤次數意即虛擬內存地址映射成物理內存地址產生的page fault次數
majflt/s: 每秒主缺頁錯誤次數(major page faults),當虛擬內存地址映射成物理內存地址時,相應的page在swap中,這樣的page fault為major page fault,一般在內存使用緊張時產生
VSZ:      該進程使用的虛擬內存(以kB為單位)
RSS:      該進程使用的物理內存(以kB為單位)
%MEM:     該進程使用內存的百分比
Command:  拉起進程對應的命令

 

IO情況統計(-d)


使用-d選項,我們可以查看進程IO的統計信息:

linux:~ # pidstat -d 1 2
Linux 2.6.32.12-0.7-default (linux)             06/18/12        _x86_64_

17:11:36          PID   kB_rd/s   kB_wr/s kB_ccwr/s  Command
17:11:37        14579 124988.24      0.00      0.00  dd

17:11:37          PID   kB_rd/s   kB_wr/s kB_ccwr/s  Command
17:11:38        14579 105441.58      0.00      0.00  dd

輸出信息含義

kB_rd/s: 每秒進程從磁盤讀取的數據量(以kB為單位)
kB_wr/s: 每秒進程向磁盤寫的數據量(以kB為單位)
Command: 拉起進程對應的命令

 

針對特定進程統計(-p)

使用-p選項,我們可以查看特定進程的系統資源使用情況:

linux:~ # pidstat -r -p 1 1
Linux 2.6.32.12-0.7-default (linux)             06/18/12        _x86_64_

18:26:17          PID  minflt/s  majflt/s     VSZ    RSS   %MEM  Command
18:26:18            1      0.00      0.00   10380    640   0.00  init
18:26:19            1      0.00      0.00   10380    640   0.00  init
……

 

pidstat常用命令

使用pidstat進行問題定位時,以下命令常被用到:

pidstat -u 1

pidstat -r 1

pidstat -d 1

 

以上命令以1秒為信息采集周期,分別獲取cpu、內存和磁盤IO的統計信息。

 

pmap命令

可以根據進程查看進程相關信息占用的內存情況。

用法
       pmap [ -x | -d ] [ -q ] pids...
       pmap -V
選項含義
       -x   extended       Show the extended format. 顯示擴展格式
       -d   device         Show the device format.   顯示設備格式
       -q   quiet          Do not display some header/footer lines. 不顯示頭尾行
       -V   show version   Displays version of program. 顯示版本

擴展格式和設備格式域:
        Address:  start address of map  映像起始地址
        Kbytes:  size of map in kilobytes  映像大小
        RSS:  resident set size in kilobytes  駐留集大小
        Dirty:  dirty pages (both shared and private) in kilobytes  臟頁大小
        Mode:  permissions on map 映像權限: r=read, w=write, x=execute, s=shared, p=private (copy on write) 
        Mapping:  file backing the map , or '[ anon ]' for allocated memory, or '[ stack ]' for the program stack.  映像支持文件,[anon]為已分配內存 [stack]為程序堆棧
        Offset:  offset into the file  文件偏移
        Device:  device name (major:minor)  設備名

如:
pmap -d 6292

 

最后一行的值
mapped 表示該進程映射的虛擬地址空間大小,也就是該進程預先分配的虛擬內存大小,即ps出的vsz
writeable/private  表示進程所占用的私有地址空間大小,也就是該進程實際使用的內存大小     
shared 表示進程和其他進程共享的內存大小

ps命令

以下來源《鳥哥的linux私房菜》

ps:將某個時間點的程序運作情況擷取下來

 

[root@linux ~]# ps aux

[root@linux ~]# ps -lA

[root@linux ~]# ps axjf

參數:

-A :所有的 process 均顯示出來,與 -e 具有同樣的效用;

-a :不與 terminal 有關的所有 process ;

-u :有效使用者 (effective user) 相關的 process ;

-x :通常與 a 這個參數一起使用,可列出較完整信息。

輸出格式規劃:

-l :較長、較詳細的將該 PID 的的信息列出;

-j :工作的格式 (jobs format)

-f :做一個更為完整的輸出。

特別說明:

由于 ps 能夠支持的 OS 類型相當的多,所以他的參數多的離譜!

而且有沒有加上 - 差很多!詳細的用法應該要參考 man ps 喔!

 

范例1:將目前屬于您自己這次登入的 PID 與相關信息列示出來
[root@linux ~]# ps -l

F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD

0 S 0 5881 5654 0 76 0 - 1303 wait pts/0 00:00:00 su

4 S 0 5882 5881 0 75 0 - 1349 wait pts/0 00:00:00 bash

4 R 0 6037 5882 0 76 0 - 1111 - pts/0 00:00:00 ps


# 上面這個信息其實很多喔!各相關信息的意義為:

# F 代表這個程序的旗標 (flag), 4 代表使用者為 super user;

# S 代表這個程序的狀態 (STAT),關于各 STAT 的意義將在內文介紹;

# PID 沒問題吧!?就是這個程序的 ID 啊!底下的 PPID 則上父程序的 ID;

# C CPU 使用的資源百分比

# PRI 這個是 Priority (優先執行序) 的縮寫,詳細后面介紹;

# NI 這個是 Nice 值,在下一小節我們會持續介紹。

# ADDR 這個是 kernel function,指出該程序在內存的那個部分。如果是個 running

# 的程序,一般就是『 - 』的啦!

# SZ 使用掉的內存大小;

# WCHAN 目前這個程序是否正在運作當中,若為 - 表示正在運作;

# TTY 登入者的終端機位置啰;

# TIME 使用掉的 CPU 時間。

# CMD 所下達的指令為何!?

# 仔細看到每一個程序的 PID 與 PPID 的相關性為何喔!上頭列出的三個程序中,

# 彼此間可是有相關性的吶!

 

范例2:列出目前所有的正在內存當中的程序

[root@linux ~]# ps aux

USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND

root 1 0.0 0.1 1740 540 ? S Jul25 0:01 init [3]

root 2 0.0 0.0 0 0 ? SN Jul25 0:00 [ksoftirqd/0]

root 3 0.0 0.0 0 0 ? S< Jul25 0:00 [events/0]

.....中間省略.....

root 5881 0.0 0.3 5212 1204 pts/0 S 10:22 0:00 su

root 5882 0.0 0.3 5396 1524 pts/0 S 10:22 0:00 bash

root 6142 0.0 0.2 4488 916 pts/0 R+ 11:45 0:00 ps aux


? USER:該 process 屬于那個使用者賬號的?

? PID :該 process 的號碼。

? %CPU:該 process 使用掉的 CPU 資源百分比;

? %MEM:該 process 所占用的物理內存百分比;

? VSZ :該 process 使用掉的虛擬內存量 (Kbytes)

? RSS :該 process 占用的固定的內存量 (Kbytes)

? TTY :該 process 是在那個終端機上面運作,若與終端機無關,則顯示 ?,另外, tty1-tty6 是本機上面的登入者程序,若為 pts/0 等等的,則表示為由網絡連接進主機的程序。

? STAT:該程序目前的狀態,主要的狀態有:

o R :該程序目前正在運作,或者是可被運作;

o S :該程序目前正在睡眠當中 (可說是 idle 狀態啦!),但可被某些訊號 (signal) 喚醒。

o T :該程序目前正在偵測或者是停止了;

o Z :該程序應該已經終止,但是其父程序卻無法正常的終止他,造成 zombie (疆尸) 程序的狀態

? START:該 process 被觸發啟動的時間;

? TIME :該 process 實際使用 CPU 運作的時間。

? COMMAND:該程序的實際指令為何?

 

范例3:以范例一的顯示內容,顯示出所有的程序

[root@linux ~]# ps -lA

F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD

4 S 0 1 0 0 76 0 - 435 - ? 00:00:01 init

1 S 0 2 1 0 94 19 - 0 ksofti ? 00:00:00 ksoftirqd/0

1 S 0 3 1 0 70 -5 - 0 worker ? 00:00:00 events/0

.....以下省略.....

 

范例4:列出類似程序樹的程序顯示

 

[root@linux ~]# ps -axjf

PPID PID PGID SID TTY TPGID STAT UID TIME COMMAND

0 1 0 0 ? -1 S 0 0:01 init [3]

1 2 0 0 ? -1 SN 0 0:00 [ksoftirqd/0]

.....中間省略.....

1 5281 5281 5281 ? -1 Ss 0 0:00 /usr/sbin/sshd

5281 5651 5651 5651 ? -1 Ss 0 0:00 \_ sshd: dmtsai [priv]

5651 5653 5651 5651 ? -1 S 500 0:00 \_ sshd: dmtsai@pts/0

5653 5654 5654 5654 pts/0 6151 Ss 500 0:00 \_ -bash

5654 5881 5881 5654 pts/0 6151 S 0 0:00 \_ su

5881 5882 5882 5654 pts/0 6151 S 0 0:00 \_ bash

5882 6151 6151 5654 pts/0 6151 R+ 0 0:00 \_ ps -axjf

 

范例5:找出與 cron 與 syslog 這兩個服務有關的 PID 號碼

 

[root@linux ~]# ps aux | egrep '(cron|syslog)'

root 1539 0.0 0.1 1616 616 ? Ss Jul25 0:03 syslogd -m 0

root 1676 0.0 0.2 4544 1128 ? Ss Jul25 0:00 crond

root 6157 0.0 0.1 3764 664 pts/0 R+ 12:10 0:00 egrep (cron|syslog)

 

在預設的情況下, ps 僅會列出與目前所在的 bash shell 有關的 PID 而已,所以, 當我使用 ps -l 的時候,只有三個 PID (范例一)。

free命令

 

在Linux下查看內存我們一般用free命令:

[root@scs-2 tmp]# free  
total used free shared buffers cached  
Mem: 3266180 3250004 16176 0 110652 2668236  
-/+ buffers/cache: 471116 2795064  
Swap: 2048276 80160 1968116

下面是對這些數值的解釋:
total:總計物理內存的大小
used:已使用多大
free:可用有多少
Shared:多個進程共享的內存總額
Buffers/cached:磁盤緩存的大小
第三行(-/+ buffers/cached):
used:已使用多大。
free:可用有多少。
第四行就不多解釋了。
區別:第二行(mem)的used/free與第三行(-/+ buffers/cache) used/free的區別。 這兩個的區別在于使用的角度來看,第一行是從OS的角度來看,因為對于OS,buffers/cached 都是屬于被使用,所以他的可用內存是16176KB,已用內存是3250004KB,其中包括,內核(OS)使用+Application(X, oracle,etc)使用的+buffers+cached.
第三行所指的是從應用程序角度來看,對于應用程序來說,buffers/cached 是等于可用的,因為buffer/cached是為了提高文件讀取的性能,當應用程序需在用到內存的時候,buffer/cached會很快地被回收。
所以從應用程序的角度來說,可用內存=系統free memory+buffers+cached。
如上例:
2795064=16176+110652+2668236

 

接下來解釋什么時候內存會被交換,以及按什么方交換。 當可用內存少于額定值的時候,就會開會進行交換。
如何看額定值:

cat /proc/meminfo

[root@scs-2 tmp]# cat /proc/meminfo
MemTotal:      3266180 kB
MemFree:         17456 kB
Buffers:        111328 kB
Cached:        2664024 kB
SwapCached:          0 kB
Active:         467236 kB
Inactive:      2644928 kB
HighTotal:           0 kB
HighFree:            0 kB
LowTotal:      3266180 kB
LowFree:         17456 kB
SwapTotal:     2048276 kB
SwapFree:      1968116 kB
Dirty:               8 kB
Writeback:           0 kB
Mapped:         345360 kB
Slab:           112344 kB
Committed_AS:   535292 kB
PageTables:       2340 kB
VmallocTotal: 536870911 kB
VmallocUsed:    272696 kB
VmallocChunk: 536598175 kB
HugePages_Total:     0
HugePages_Free:      0
Hugepagesize:     2048 kB


 

 

用free -m查看的結果:

[root@scs-2 tmp]# free -m 
             total       used       free     shared    buffers     cached
Mem:          3189       3173         16          0        107       2605
-/+ buffers/cache:        460       2729
Swap:         2000         78       1921


 

 

查看/proc/kcore文件的大小(內存鏡像):

[root@scs-2 tmp]# ll -h /proc/kcore 
-r-------- 1 root root 4.1G Jun 12 12:04 /proc/kcore


 

備注:

占用內存的測量

測量一個進程占用了多少內存,linux為我們提供了一個很方便的方法,/proc目錄為我們提供了所有的信息,實際上top等工具也通過這里來獲取相應的信息。

/proc/meminfo 機器的內存使用信息

/proc/pid/maps pid為進程號,顯示當前進程所占用的虛擬地址。

/proc/pid/statm 進程所占用的內存

[root@localhost ~]# cat /proc/self/statm

654 57 44 0 0 334 0

輸出解釋

CPU 以及CPU0。。。的每行的每個參數意思(以第一行為例)為:

參數 解釋 /proc//status

Size (pages) 任務虛擬地址空間的大小 VmSize/4

Resident(pages) 應用程序正在使用的物理內存的大小 VmRSS/4

Shared(pages) 共享頁數 0

Trs(pages) 程序所擁有的可執行虛擬內存的大小 VmExe/4

Lrs(pages) 被映像到任務的虛擬內存空間的庫的大小 VmLib/4

Drs(pages) 程序數據段和用戶態的棧的大小 (VmData+ VmStk )4

dt(pages) 04

查看機器可用內存

/proc/28248/>free

total used free shared buffers cached

Mem: 1023788 926400 97388 0 134668 503688

-/+ buffers/cache: 288044 735744

Swap: 1959920 89608 1870312


 

我們通過free命令查看機器空閑內存時,會發現free的值很小。這主要是因為,在linux中有這么一種思想,內存不用白不用,因此它盡可能的cache和buffer一些數據,以方便下次使用。但實際上這些內存也是可以立刻拿來使用的。所以 空閑內存=free+buffers+cached=total-used

ctop命令

以下是摘自碼農網。

ctop是一個新的基于命令行的工具,它可用于在容器層級監控進程。容器通過利用控制器組(cgroup)的資源管理功能,提供了操作系統層級的虛擬化環境。該工具從cgroup收集與內存、CPU、塊輸入輸出的相關數據,以及擁有者、開機時間等元數據,并以人性化的格式呈現給用戶,這樣就可以快速對系統健康狀況進行評估。基于所獲得的數據,它可以嘗試推測下層的容器技術。ctop也有助于在低內存環境中檢測出誰在消耗大量的內存。

功能

ctop的一些功能如下:

  • 收集CPU、內存和塊輸入輸出的度量值
  • 收集與擁有者、容器技術和任務統計相關的信息
  • 通過任意欄對信息排序
  • 以樹狀視圖顯示信息
  • 折疊/展開cgroup樹
  • 選擇并跟蹤cgroup/容器
  • 選擇顯示數據刷新的時間窗口
  • 暫停刷新數據
  • 檢測基于systemd、Docker和LXC的容器
  • 基于Docker和LXC的容器的高級特性
    • 打開/連接shell以進行深度診斷
    • 停止/殺死容器類型

安裝

ctop是由Python寫成的,因此,除了需要Python 2.6或其更高版本外(帶有內建的光標支持),別無其它外部依賴。推薦使用Python的pip進行安裝,如果還沒有安裝pip,請先安裝,然后使用pip安裝ctop。

注意:本文樣例來自Ubuntu(14.10)系統

$ sudo apt-get install python-pip

使用pip安裝ctop:

poornima@poornima-Lenovo:~$ sudo pip install ctop

[sudo] password for poornima:

Downloading/unpacking ctop

Downloading ctop-0.4.0.tar.gz

Running setup.py (path:/tmp/pip_build_root/ctop/setup.py) egg_info for package ctop

Installing collected packages: ctop

Running setup.py install for ctop

changing mode of build/scripts-2.7/ctop from 644 to 755

changing mode of /usr/local/bin/ctop to 755

Successfully installed ctop

Cleaning up...

如果不選擇使用pip安裝,你也可以使用wget直接從github安裝:

poornima@poornima-Lenovo:~$ wget https://raw.githubusercontent.com/yadutaf/ctop/master/cgroup_top.py -O ctop

--2015-04-29 19:32:53-- https://raw.githubusercontent.com/yadutaf/ctop/master/cgroup_top.py

Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 199.27.78.133

Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|199.27.78.133|:443... connected.

HTTP request sent, awaiting response... 200 OK Length: 27314 (27K) [text/plain]

Saving to: ctop

100%[======================================>] 27,314 --.-K/s in 0s

2015-04-29 19:32:59 (61.0 MB/s) - ctop saved [27314/27314]
poornima@poornima-Lenovo:~$ chmod +x ctop

如果cgroup-bin包沒有安裝,你可能會碰到一個錯誤消息,你可以通過安裝需要的包來解決。

poornima@poornima-Lenovo:~$ ./ctop

[ERROR] Failed to locate cgroup mountpoints.

poornima@poornima-Lenovo:~$ sudo apt-get install cgroup-bin

下面是ctop的輸出樣例:

監控 Linux 容器性能的命令行神器

ctop屏幕

用法選項

ctop [--tree] [--refresh=] [--columns=] [--sort-col=] [--follow=] [--fold=, ...] ctop (-h | --help)

當你進入ctop屏幕,可使用上(↑)和下(↓)箭頭鍵在容器間導航。點擊某個容器就選定了該容器,按q或Ctrl+C退出該容器。

現在,讓我們來看看上面列出的那一堆選項究竟是怎么用的吧。

-h / –help – 顯示幫助信息

poornima@poornima-Lenovo:~$ ctop -h
Usage: ctop [options]

Options:
-h, --help show this help message and exit
--tree show tree view by default
--refresh=REFRESH Refresh display every <seconds>
--follow=FOLLOW Follow cgroup path
--columns=COLUMNS List of optional columns to display. Always includes
'name'
--sort-col=SORT_COL Select column to sort by initially. Can be changed
dynamically.

–tree – 顯示容器的樹形視圖

默認情況下,會顯示列表視圖

當你進入ctop窗口,你可以使用F5按鈕在樹狀/列表視圖間切換。

–fold= – 在樹形視圖中折疊名為 <name> 的 cgroup 路徑

該選項需要與 –tree 選項組合使用。

例子: ctop –tree –fold=/user.slice

監控 Linux 容器性能的命令行神器

‘ctop –fold’的輸出

在ctop窗口中,使用+/-鍵來展開或折疊子cgroup。

注意:在寫本文時,pip倉庫中還沒有最新版的ctop,還不支持命令行的‘–fold’選項

–follow= – 跟蹤/高亮 cgroup 路徑

例子: ctop –follow=/user.slice/user-1000.slice

正如你在下面屏幕中所見到的那樣,帶有“/user.slice/user-1000.slice”路徑的cgroup被高亮顯示,這讓用戶易于跟蹤,就算顯示位置變了也一樣。

監控 Linux 容器性能的命令行神器

‘ctop –follow’的輸出

你也可以使用‘f’按鈕來讓高亮的行跟蹤選定的容器。默認情況下,跟蹤是關閉的。

–refresh= – 按指定頻率刷新顯示,默認1秒

這對于按每用戶需求來顯示改變刷新率時很有用。使用‘p’按鈕可以暫停刷新并選擇文本。

–columns= – 限定只顯示選定的列。’name’ 需要是第一個字段,其后跟著其它字段。默認情況下,字段包括:owner, processes,memory, cpu-sys, cpu-user, blkio, cpu-time

例子: ctop –columns=name,owner,type,memory

監控 Linux 容器性能的命令行神器

‘ctop –column’的輸出

-sort-col= – 按指定的列排序。默認使用 cpu-user 排序

例子: ctop –sort-col=blkio

如果有Docker和LXC支持的額外容器,跟蹤選項也是可用的:

press 'a' - 接駁到終端輸出

press 'e' - 打開容器中的一個 shell

press 's' - 停止容器 (SIGTERM)

press 'k' - 殺死容器 (SIGKILL)

目前 Jean-Tiare Le Bigot 還在積極開發 ctop 中,希望我們能在該工具中見到像本地 top 命令一樣的特性。

 

附:ulimit命令改善系統性能

Linux查看HotSopt虛擬機GC線程的CPU占用率

 

 本文由用戶 DarbyBowden 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!