Linux系统资源监控--linux命令、nmon和spotlight
轉載自:http://www.cnblogs.com/hanxiaobei/p/5514544.html
?
前言:
系統資源監控一般監控系統的CPU,內存,磁盤和網絡。系統分為windows和Linux。本篇主要記錄Linux。
Linux系統資源監控常用命令及工具
一、常用命令:top、free、iostat、netstat、vmstat
top
top命令是Linux下常用的性能分析工具,能夠實時顯示系統中各個進程的資源占用狀況,下面詳細介紹它的使用方法
1 統計信息區2 top - 01:06:48 up 1:22, 1 user, load average: 0.06, 0.60, 0.483 Tasks: 29 total, 1 running, 28 sleeping, 0 stopped, 0 zombie4 Cpu(s): 0.3% us, 1.0% sy, 0.0% ni, 98.7% id, 0.0% wa, 0.0% hi, 0.0% si5 Mem: 191272k total, 173656k used, 17616k free, 22052k buffers6 Swap: 192772k total, 0k used, 192772k free, 123988k cached7 進程信息區8 PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND9 1379 root 16 0 7976 2456 1980 S 0.7 1.3 0:11.03 sshd 10 14704 root 16 0 2128 980 796 R 0.7 0.5 0:02.72 top 11 1 root 16 0 1992 632 544 S 0.0 0.3 0:00.90 init 12 2 root 34 19 0 0 0 S 0.0 0.0 0:00.00 ksoftirqd/0 13 3 root RT 0 0 0 0 S 0.0 0.0 0:00.00 watchdog/0統計信息區:
前五行是系統整體的統計信息。第一行是任務隊列信息,同 uptime 命令的執行結果。其內容如下:
01:06:48 當前時間
up 1:22 系統運行時間,格式為時:分
1 user 當前登錄用戶數
load average: 0.06, 0.60, 0.48 系統負載,即任務隊列的平均長度。
三個數值分別為 1分鐘、5分鐘、15分鐘前到現在的平均值。
第二、三行為進程和CPU的信息。當有多個CPU時,這些內容可能會超過兩行。內容如下:
Tasks: 29 total 進程總數
1 running 正在運行的進程數
28 sleeping 睡眠的進程數
0 stopped 停止的進程數
0 zombie 僵尸進程數
Cpu(s): 0.3% us 用戶空間占用CPU百分比
1.0% sy 內核空間占用CPU百分比
0.0% ni 用戶進程空間內改變過優先級的進程占用CPU百分比
98.7% id 空閑CPU百分比
0.0% wa 等待輸入輸出的CPU時間百分比
最后兩行為內存信息。內容如下:
Mem: 191272k total 物理內存總量
173656k used 使用的物理內存總量
17616k free 空閑內存總量
22052k buffers 用作內核緩存的內存量
Swap: 192772k total 交換區總量
0k used 使用的交換區總量
192772k free 空閑交換區總量
123988k cached 緩沖的交換區總量。
進程信息區:
統計信息區域的下方顯示了各個進程的詳細信息。首先來認識一下各列的含義。
列名 含義
PID 進程id
USER 進程所有者的用戶名
PR 優先級
NI nice值。負值表示高優先級,正值表示低優先級
VIRT 進程使用的虛擬內存總量,單位kb。VIRT=SWAP+RES
RES 進程使用的、未被換出的物理內存大小,單位kb。RES=CODE+DATA
SHR 共享內存大小,單位kb
S 進程狀態。
D=不可中斷的睡眠狀態
R=運行
S=睡眠
T=跟蹤/停止
Z=僵尸進程
%CPU 上次更新到現在的CPU時間占用百分比
%MEM 進程使用的物理內存百分比
TIME+ 進程使用的CPU時間總計,單位1/100秒
COMMAND 命令名/命令行
以下為默認不展示的列名:
PPID 父進程id
RUSER Real user name
UID 進程所有者的用戶id
GROUP 進程所有者的組名
TTY 啟動進程的終端名。不是從終端啟動的進程則顯示為 ?
P 最后使用的CPU,僅在多CPU環境下有意義
TIME 進程使用的CPU時間總計,單位秒
SWAP 進程使用的虛擬內存中,被換出的大小,單位kb。
CODE 可執行代碼占用的物理內存大小,單位kb
DATA 可執行代碼以外的部分(數據段+棧)占用的物理內存大小,單位kb
nFLT 頁面錯誤次數
nDRT 最后一次寫入到現在,被修改過的頁面數。
WCHAN 若該進程在睡眠,則顯示睡眠中的系統函數名
Flags 任務標志,參考 sched.h
free
free命令可以顯示Linux系統中空閑的、已用的物理內存及swap內存,及被內核使用的buffer。
1 [root@zhoucentos home]# free -m 2 total used free shared buffers cached 3 Mem: 1006 988 17 0 96 72 4 -/+ buffers/cache: 819 186 5 Swap: 2015 1 2014第3行內容代表是從系統的角度來統計的數據,其中的used包含了buffers和cached
第4行內容是代表從應用程序的角度來統計的數據,used是真正應用程序占用的內存
第3行的used = 第4行的used+第3行的buffers和cached
第5行為交換區的信息,分別是交換的總量(total),使用量(used)和有多少空閑的交換區(free)
如果是應用服務器的話,一般只看第4行:+buffers/cache,即對應用程序來說free的內存太少了,也是該考慮優化程序或加內存了。
iostat
可以用iostat工具查看進程IO請求下發的數量、系統處理IO請求的耗時,進而分析進程與操作系統的交互過程中IO方面是否存在瓶頸。
下面通過iostat命令使用實例,說明使用iostat查看IO請求下發情況、系統IO處理能力的方法,以及命令執行結果中各字段的含義。
1.不加選項執行iostat
?
1 linux # iostat 2 Linux 2.6.16.60-0.21-smp (linux) 06/12/12 3 4 avg-cpu: %user %nice %system %iowait %steal %idle 5 0.07 0.00 0.05 0.06 0.00 99.81 6 7 Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn 8 sda 0.58 9.95 37.47 6737006 25377400 9 sdb 0.00 0.00 0.00 824 0?
單獨執行iostat,顯示的結果為從系統開機到當前執行時刻的統計信息。以上輸出中,除最上面指示系統版本、主機名和日期的一行外,另有兩部分:
avg-cpu: 總體cpu使用情況統計信息,對于多核cpu,這里為所有cpu的平均值
Device: 各磁盤設備的IO統計信息
對于cpu統計信息一行,我們主要看iowait的值,它指示cpu用于等待io請求完成的時間。Device中各列含義如下:
? Device: 以sdX形式顯示的設備名稱
? tps: 每秒進程下發的IO讀、寫請求數量
? Blk_read/s: 每秒讀扇區數量(一扇區為512bytes)
? Blk_wrtn/s: 每秒寫扇區數量
? Blk_read: 取樣時間間隔內讀扇區總數量
? Blk_wrtn: 取樣時間間隔內寫扇區總數量
我們可以使用-c選項單獨顯示avg-cpu部分的結果,使用-d選項單獨顯示Device部分的信息。
2.指定采樣時間間隔與采樣次數
linux # iostat -d 1 2
以上命令輸出Device的信息,采樣時間為1秒,采樣2次,若不指定采樣次數,則iostat會一直輸出采樣信息,直到按”ctrl+c”退出命令。
注意,第1次采樣信息與單獨執行iostat的效果一樣,為從系統開機到當前執行時刻的統計信息。
3.以kB為單位顯示讀寫信息(-k選項)
我們可以使用-k或-M選項,指定iostat的部分輸出結果以kB或MB為單位,而不是以扇區數為單位
以上輸出中,kB_read/s、kB_wrtn/s、kB_read和kB_wrtn的值均以kB為單位,相比以扇區數為單位,這里的值為原值的一半(1kB=512bytes*2)
4.更詳細的io統計信息(-x選項)
為顯示更詳細的io設備統計信息,可以使用-x選項,在分析io瓶頸時,一般都會開啟-x選項:?
以上各列的含義如下:
? rrqm/s: 每秒對該設備的讀請求被合并次數,文件系統會對讀取同塊(block)的請求進行合并
? wrqm/s: 每秒對該設備的寫請求被合并次數
? r/s: 每秒完成的讀次數
? w/s: 每秒完成的寫次數
? rkB/s: 每秒讀數據量(kB為單位)
? wkB/s: 每秒寫數據量(kB為單位)
? avgrq-sz:平均每次IO操作的數據量(扇區數為單位)
? avgqu-sz: 平均等待處理的IO請求隊列長度
? await: 平均每次IO請求等待時間(包括等待時間和處理時間,毫秒為單位)
? svctm: 平均每次IO請求的處理時間(毫秒為單位)
? %util: 采用周期內用于IO操作的時間比率,即IO隊列非空的時間比率
對于以上示例輸出,我們可以獲取到以下信息:
1. 每秒向磁盤上寫30M左右數據(wkB/s值)
2. 每秒有91次IO操作(r/s+w/s),其中以寫操作為主體
3. 平均每次IO請求等待處理的時間為120.57毫秒,處理耗時為6.33毫秒
4. 等待處理的IO請求隊列中,平均有11.79個請求駐留
以上各值之間也存在聯系,我們可以由一些值計算出其他數值,例如:
util = (r/s+w/s) * (svctm/1000)
對于上面的例子有:util = (1+90)*(6.33/1000) = 0.57603
?netstat
Netstat 命令用于顯示各種網絡相關信息,如網絡連接,路由表,接口狀態 (Interface Statistics),masquerade 連接,多播成員 (Multicast Memberships) 等等。
執行netstat后,其輸出結果為:
1 Active Internet connections (w/o servers)2 Proto Recv-Q Send-Q Local Address Foreign Address State3 tcp 0 2 210.34.6.89:telnet 210.34.6.96:2873 ESTABLISHED4 tcp 296 0 210.34.6.89:1165 210.34.6.84:netbios-ssn ESTABLISHED5 tcp 0 0 localhost.localdom:9001 localhost.localdom:1162 ESTABLISHED6 tcp 0 0 localhost.localdom:1162 localhost.localdom:9001 ESTABLISHED7 tcp 0 80 210.34.6.89:1161 210.34.6.10:netbios-ssn CLOSE8 9 Active UNIX domain sockets (w/o servers) 10 Proto RefCnt Flags Type State I-Node Path 11 unix 1 [ ] STREAM CONNECTED 16178 @000000dd 12 unix 1 [ ] STREAM CONNECTED 16176 @000000dc 13 unix 9 [ ] DGRAM 5292 /dev/log 14 unix 1 [ ] STREAM CONNECTED 16182 @000000df從整體上看,netstat的輸出結果可以分為兩個部分:
1、Active Internet connections,稱為有源TCP連接,其中"Recv-Q"和"Send-Q"指%0A的是接收隊列和發送隊列。這些數字一般都應該是0。如果不是則表示軟件包正在隊列中堆積。這種情況只能在非常少的情況見到。
2、Active UNIX domain sockets,稱為有源Unix域套接口(和網絡套接字一樣,但是只能用于本機通信,性能可以提高一倍)。
Proto顯示連接使用的協議,RefCnt表示連接到本套接口上的進程號,Types顯示套接口的類型,State顯示套接口當前的狀態,Path表示連接到套接口的其它進程使用的路徑名。
常見參數:
-a (all)顯示所有選項,默認不顯示LISTEN相關
-t (tcp)僅顯示tcp相關選項
-u (udp)僅顯示udp相關選項
-n 拒絕顯示別名,能顯示數字的全部轉化成數字。
-l 僅列出有在 Listen (監聽) 的服務狀態
-p 顯示建立相關鏈接的程序名
-r 顯示路由信息,路由表
-e 顯示擴展信息,例如uid等
-s 按各個協議進行統計
-c 每隔一個固定時間,執行該netstat命令。
提示:LISTEN和LISTENING的狀態只有用-a或者-l才能看到
實用命令實例:
1、列出所有監聽和未監聽的端口 ?netstat -a
? ? ?列出所有 tcp 端口 netstat -at;
? ? ?列出所有 udp 端口 netstat -au
2、列出所有處于監聽狀態的 Sockets
? ? ?只顯示監聽端口 netstat -l;
?只列出所有監聽 tcp 端口 netstat -lt;
? ? 只列出所有監聽 udp 端口 netstat -lu;
? ? 只列出所有監聽 UNIX 端口 netstat -lx
3、顯示每個協議的統計信息
? ? 顯示所有端口的統計信息 netstat -s;
?顯示 TCP 或 UDP 端口的統計信息 netstat -st 或 -su;
4、在 netstat 輸出中顯示 PID 和進程名稱 netstat -p
5、當你不想讓主機,端口和用戶名顯示,使用 netstat -n
? ? 如果只是不想讓這三個名稱中的一個被顯示,使用以下命令
? ?# netsat -a --numeric-ports
? ?# netsat -a --numeric-hosts
? ?# netsat -a --numeric-users
6、持續輸出 netstat 信息,netstat 將每隔一秒輸出網絡信息 ?netstat -c
7、顯示核心路由信息 netstat -r(使用 netstat -rn 顯示數字格式,不查詢主機名稱)
8、找出程序運行的端口 ?netstat -ap | grep ssh
? ? ?找出運行在指定端口的進程 ?netstat -an | grep ':80'
9、顯示網絡接口列表??netstat -i
? ? ?顯示詳細信息 ?netstat -ie等同于ifconfig
10、IP和TCP分析
? ? 查看連接某服務端口最多的的IP地址?netstat -nat | grep "192.168.1.101:22" |awk '{print $5}'|awk -F: '{print $1}'|sort|uniq -c|sort -nr|head -20
? ??TCP各種狀態列表 ??netstat -nat |awk '{print $6}'
? ??先把狀態全都取出來,然后使用uniq -c統計,之后再進行排序 ?netstat -nat |awk '{print $6}'|sort|uniq -c?|sort -rn
? ? 分析access.log獲得訪問前10位的ip地址 netstat -ant |awk '{print $1}' access.log |sort|uniq -c|sort -nr|head -10
vmstat
vmstat命令是最常見的Linux/Unix監控工具,可以展現給定時間間隔的服務器的狀態值,包括服務器的CPU使用率,內存使用,虛擬內存 交換情況,IO讀寫情況。
可以看到整個機器的 CPU,內存,IO的使用情況,而不是單單看到各個進程的CPU使用率和內存使用率(使用場景不一樣)。
一般vmstat工具的使用是通過兩個數字參數來完成的,第一個參數是采樣的時間間隔數,單位是秒,第二個參數是采樣的次數,如:
2表示每個兩秒采集一次服務器狀態,1表示只采集一次。
實際上,在應用過程中,我們會在一段時間內一直監控,不想監控直接結束vmstat就行了,例如:
這表示vmstat每2秒采集數據,一直采集,直到我結束程序,這里采集了5次數據我就結束了程序。
每個參數的意思:
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時間。
vmstat –s 可以查看page in/page out的數量?
二、常用工具:nmon、spotlight
nmon
Nmon的使用
1、賦予nmon可執行權限并在命令行輸入: ./nmon 即可啟動交互界面可時時顯示系統資源
2、輸入命令如下,即可對Linux進行監控,并生成.nmon格式的文件
[root@localhost ]# nmon -s 300 -c 288 -f -m /tmp
備注:
-s 300:表示每300秒采集一次數據,
-c 288 :表示采集288次,300*288=86400秒,剛好是1天的數據,這樣運行一次這個程序就會生成一個一天的數據文件,
-m /tmp:表示生成的數據文件的路徑
-f:表示生成的數據文件名中有時間
進入tmp目錄,查看生成的xxx.nmon文件?
使用sz/sftp下載該文件:sz localhost_160521_1314.nmon
使用分析工具對.nmon文件進行分析
打開分析工具nmon analyser v46.xlsm
點擊【Analyze nmon data】按鈕,加載下載的.nmon監控文件,生成新的excel文件先保存即可查看到Linux的各性能指標情況
!重點關注四項
cpu:cpu_all,cpu_summ
disk:diskbusy
memory的使用百分比:(total-free-buffer-cache)/total
netIO:eth0-total
spotlight
spotlight的使用
1、安裝:像windows其他軟件安裝一樣
2、展示界面
轉載于:https://www.cnblogs.com/yetj/p/8757567.html
總結
以上是生活随笔為你收集整理的Linux系统资源监控--linux命令、nmon和spotlight的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python常见的数据转化函数
- 下一篇: pip