Linux性能分析top iostat vmstat free
-
最近看到一大牛的分析报告,才知道笔者认识这4个命令是多么肤浅,其实要读懂内存的信息,是要一些功力的。
1、top
VIRT 虚拟内存总量,VIRT=SWAP+RES
SWAP 使用的虚拟内存中被换出的大小
RES 进程使用的、未被换出的物理内存大小
SHR 共享内存大小,单位kb
S 进程状态
%MEM 进程使用的物理内存百分比
%CPU CPU时间占用百分比
Mem: 191272k total 物理内存总量173656k used 使用的物理内存总量
17616k free 空闲内存总量
22052k buffers 用作内核缓存的内存量
Swap: 192772k total 交换区总量
0k used 使用的交换区总量
192772k free 空闲交换区总量
123988k cached缓冲的交换区总量。内存中的内容被换出到交换区,而后又被换入到内存,但使用过的交换区尚未被覆盖,该数值即为这些内容已存在于内存中的交换区的大小。相应的内存再次被换出时可不必再对交换区写入。
2、free
主要关注值
Mem 物理内存统计
total 物理内存总量。
used 总计分配给缓存(包含buffers 与cache )使用的数量
free 未被分配的内存
shared 共享内存
buffers 系统分配但未被使用的buffers 数量,两种主要Cache方式之一,针对磁盘块的读写:
cached 系统分配但未被使用的cache 数量,两种主要Cache方式之一,针对文件inode的读写
-/+buffers/cached 物理内存的缓存统计
used (第一行Mem值)used - buffers -cached ,系统实际使用的内存总量
free (第一行Mem值)buffers + cached ,系统当前实际可用内存
Mem 从操作系统层面分析,buffers cached是已分配的(已使用)内存
-/+ buffers/cached 从应用程序层面分析,buffers cached是随时都可以拿来用的,而且是优先使用的
Swap交换分区的使用情况
3、vmstat
r 表示运行队列, 值超过了CPU数目,就会出现CPU瓶颈。
b 表示阻塞的进程
swpd 虚拟内存已使用的大小,如果大于0,表示物理内存不足,注意程序内存泄露
free 空闲的物理内存的大小
buff
cache直接记忆打开的文件,给文件做缓冲,Linux/Unix把空闲的物理内存的一部分拿来做文件和目录的缓存,是为了提高程序执行的性能,当程序使用内存时,buffer/cached会很快地被使用
si 每秒从磁盘读入虚拟内存的大小,值大于0,表示物理内存不够或者内存泄露
so 每秒虚拟内存写入磁盘的大小,值大于0,表示物理内存不够或者内存泄露 www.it165.net
bi 块设备每秒接收的块数量
bo 块设备每秒发送的块数量
in 每秒CPU的中断次数,包括时间中断
cs 每秒上下文切换次数,例如我们调用系统函数,就要进行上下文切换,线程的切换,也要进程上下文切换,这个值要越小越好,太大了,要考虑调低线程或者进程的数目,例如在apache和nginx这种web服务器中,我们一般做性能测试时会进行几千并发甚至几万并发的测试,选择web服务器的进程可以由进程或者线程的峰值一直下调,压测,直到cs到一个比较小的值,这个进程和线程数就是比较合适的值了。系统调用也是,每次调用系统函数,我们的代码就会进入内核空间,导致上下文切换,这个是很耗资源,也要尽量避免频繁调用系统函数。上下文切换次数过多表示你的CPU大部分浪费在上下文切换,导致CPU干正经事的时间少了,CPU没有充分利用,是不可取的
us 用户CPU时间
sy 系统CPU时间,如果太高,表示系统调用时间长,例如是IO操作频繁
id 空闲 CPU时间
wt 等待IOCPU时间
4、iostat基本使用:
iostat [ -c ] [ -d ] [ -N ] [ -n ] [ -h ] [ -k | -m ] [ -t ] [ -V ] [ -x ] [ -z ] [ device [...] | ALL ] [ -p [ device [,...] | ALL ] ] [ inter-val [ count ] ]
[-c]:输出cpu统计信息
[-d]:输出磁盘统计信息 注:默认是两个都输出
[-N]:根据device mapper也就是我们经常说的LVM来输出io信息
[-n]:根据网络文件系统(NFS)输出io信息(kernel version> 2.6.17)
[-h] :可读性更好的NFS统计信息
[-k | -m]:以kb/s|mb/s代替原来的块/s
[-t] :输出时打印收集信息时刻的时间 注:时间的打印格式和系统变量S_TIME_FORMAT相关
[-V]:版本信息
[-x]:输出拓展统计信息 注:在下面进行总结
[-z]:复位磁盘输入/输出信息
[device [...] | ALL]:设备列表
[-p [device[...]|ALL]]:设备列表,但是这个会输出子设备的io信息。比如sdb的话,就会连sdb1、sdb2等等的分区信息一同输出
[inter-val [count]]:inter-val是统计的时间间隔单位是s,count则是统计次数
输出信息解读:
基本cpu输出信息:
%user:用户进程消耗cpu的比例
%nice:用户进程优先级调整消耗的cpu比例
%sys:系统内核消耗的cpu比例
%iowait:等待磁盘io所消耗的cpu比例
%idle:闲置cpu的比例(不包括等待磁盘io的s)
基本device输出信息:
Device:设备的名称
Tps:设备上每秒的io传输(可能多个io被组成一个io)的次数
Blk_read/s:每秒从设备读取block(kernel 2.4以上,block=512byte)的数量
Blk_wrtn/s:每秒写到设备block(kernel 2.4以上,block=512byte)的数量
Blk_read:间隔时间内,从设备读取总的block数量
Blk_wrtn:间隔时间内,写到设备总的block数量
注:激活-k|-m 选项,将变成kb_*或者MB_*
-x选项拓展输出信息:
rrqm/s:每秒进行merge(多个io的合并)读操作的数量
wrqm/s:每秒进行merge(多个io的合并)写操作的数量
r/s:每秒完成读io设备的次数
w/s:每秒完成写io设备的次数
rsec/s:每秒读扇区的次数
wsec/s:每秒写扇区的次数 注:激活-k|-m 将变成rkb/s wkb/s | rmb/s wmb/s
avgrq-sz:平均每次io设备的大小(以扇区为单位),因为有merge读或写,所以每次io大小需要计算
avgqu-sz:平均I/O队列长度
await:每次io设备的等待时间,也包括io服务时间(毫秒)。
await的大小一般取决于服务时间(svctm) 以及 I/O 队列的长度和 I/O 请求的发出模式。