Linux中CPU與內存性能監測
來自: 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將顯示各活動進程的內存使用統計:
以上各列輸出的含義如下:
IO情況統計(-d)
使用-d選項,我們可以查看進程IO的統計信息:
輸出信息含義
kB_rd/s: 每秒進程從磁盤讀取的數據量(以kB為單位) kB_wr/s: 每秒進程向磁盤寫的數據量(以kB為單位) Command: 拉起進程對應的命令
針對特定進程統計(-p)
使用-p選項,我們可以查看特定進程的系統資源使用情況:
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的輸出樣例:
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
‘ctop –fold’的輸出
在ctop窗口中,使用+/-鍵來展開或折疊子cgroup。
注意:在寫本文時,pip倉庫中還沒有最新版的ctop,還不支持命令行的‘–fold’選項
–follow= – 跟蹤/高亮 cgroup 路徑
例子: ctop –follow=/user.slice/user-1000.slice
正如你在下面屏幕中所見到的那樣,帶有“/user.slice/user-1000.slice”路徑的cgroup被高亮顯示,這讓用戶易于跟蹤,就算顯示位置變了也一樣。
‘ctop –follow’的輸出
你也可以使用‘f’按鈕來讓高亮的行跟蹤選定的容器。默認情況下,跟蹤是關閉的。
–refresh= – 按指定頻率刷新顯示,默認1秒
這對于按每用戶需求來顯示改變刷新率時很有用。使用‘p’按鈕可以暫停刷新并選擇文本。
–columns= – 限定只顯示選定的列。’name’ 需要是第一個字段,其后跟著其它字段。默認情況下,字段包括:owner, processes,memory, cpu-sys, cpu-user, blkio, cpu-time
例子: ctop –columns=name,owner,type,memory
‘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占用率