转载自: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.48 3 Tasks: 29 total, 1 running, 28 sleeping, 0 stopped, 0 zombie 4 Cpu(s): 0.3% us, 1.0% sy, 0.0% ni, 98.7% id, 0.0% wa, 0.0% hi, 0.0% si 5 Mem: 191272k total, 173656k used, 17616k free, 22052k buffers 6 Swap: 192772k total, 0k used, 192772k free, 123988k cached 7 进程信息区 8 PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 9 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
1 Linux 2.6.16.60-0.21-smp (linux) 06/13/12 2 Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn 3 sda 0.55 8.93 36.27 6737086 27367728 4 sdb 0.00 0.00 0.00 928 0 5 6 Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn 7 sda 2.00 0.00 72.00 0 72 8 sdb 0.00 0.00 0.00 0 0
以上命令输出Device的信息,采样时间为1秒,采样2次,若不指定采样次数,则iostat会一直输出采样信息,直到按”ctrl+c”退出命令。
注意,第1次采样信息与单独执行iostat的效果一样,为从系统开机到当前执行时刻的统计信息。
3.以kB为单位显示读写信息(-k选项)
我们可以使用-k或-M选项,指定iostat的部分输出结果以kB或MB为单位,而不是以扇区数为单位
1 linux # iostat -d -k 2 Linux 2.6.16.60-0.21-smp (linux) 06/13/12 3 4 Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn 5 sda 0.55 4.46 18.12 3368543 13686096 6 sdb 0.00 0.00 0.00 464 0
以上输出中,kB_read/s、kB_wrtn/s、kB_read和kB_wrtn的值均以kB为单位,相比以扇区数为单位,这里的值为原值的一半(1kB=512bytes*2)
4.更详细的io统计信息(-x选项)
为显示更详细的io设备统计信息,可以使用-x选项,在分析io瓶颈时,一般都会开启-x选项:
1 linux # iostat -x -k -d 1 2 Linux 2.6.16.60-0.21-smp (linux) 06/13/12 3 4 …… 5 Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util 6 sda 0.00 9915.00 1.00 90.00 4.00 34360.00 755.25 11.79 120.57 6.33 57.60
以上各列的含义如下:
• 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 State 3 tcp 0 2 210.34.6.89:telnet 210.34.6.96:2873 ESTABLISHED 4 tcp 296 0 210.34.6.89:1165 210.34.6.84:netbios-ssn ESTABLISHED 5 tcp 0 0 localhost.localdom:9001 localhost.localdom:1162 ESTABLISHED 6 tcp 0 0 localhost.localdom:1162 localhost.localdom:9001 ESTABLISHED 7 tcp 0 80 210.34.6.89:1161 210.34.6.10:netbios-ssn CLOSE 8 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工具的使用是通过两个数字参数来完成的,第一个参数是采样的时间间隔数,单位是秒,第二个参数是采样的次数,如:
1 root@ubuntu:~# vmstat 2 1 2 procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu---- 3 r b swpd free buff cache si so bi bo in cs us sy id wa 4 1 0 0 3498472 315836 3819540 0 0 0 1 2 0 0 0 100 0
2表示每个两秒采集一次服务器状态,1表示只采集一次。
实际上,在应用过程中,我们会在一段时间内一直监控,不想监控直接结束vmstat就行了,例如:
1 root@ubuntu:~# vmstat 2 2 procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu---- 3 r b swpd free buff cache si so bi bo in cs us sy id wa 4 1 0 0 3499840 315836 3819660 0 0 0 1 2 0 0 0 100 0 5 0 0 0 3499584 315836 3819660 0 0 0 0 88 158 0 0 100 0 6 0 0 0 3499708 315836 3819660 0 0 0 2 86 162 0 0 100 0 7 0 0 0 3499708 315836 3819660 0 0 0 10 81 151 0 0 100 0 8 1 0 0 3499732 315836 3819660 0 0 0 2 83 154 0 0 100 0
这表示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、展示界面