1. 程式人生 > >Linux中CPU與記憶體效能監測

Linux中CPU與記憶體效能監測

在系統維護的過程中,隨時可能有需要檢視 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秒重新整理一次。

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:將某個時間點的程式運作情況擷取下來

[[email protected] ~]# ps aux

[[email protected] ~]# ps -lA

[[email protected] ~]# 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 與相關資訊列示出來
[[email protected] ~]# 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:列出目前所有的正在記憶體當中的程式

[[email protected] ~]# 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:以範例一的顯示內容,顯示出所有的程式

[[email protected] ~]# 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:列出類似程式樹的程式顯示

[[email protected] ~]# 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: [email protected]/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 號碼

[[email protected] ~]# 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命令:

[[email protected] 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

[[email protected] 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檢視的結果:

[[email protected] 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檔案的大小(記憶體映象):

[[email protected] 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:

[email protected]:~$ 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安裝:

[email protected]:~$ 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]
[email protected]:~$ chmod +x ctop

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

[email protected]:~$ ./ctop

[ERROR] Failed to locate cgroup mountpoints.

[email protected]:~$ 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 – 顯示幫助資訊

[email protected]:~$ 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命令改善系統性能