一、linux下系统性能监控的命令top和vmstat
##. 关于Top命令详解
经常要维护公司的服务器,免不了经常会查看服务器的性能,这两个命令是我常用的,详细了解下。
top命令经常用来监控linux的系统状况,比如cpu、内存的使用,程序员基本都知道这个命令,但比较奇怪的是能用好它的人却很少,例如top监控视图中内存数值的含义就有不少的曲解。
1. top命令第一行解释:
top后依次为 【当前系统时间】【已经运行时长 】【 当前系统登录用户数】【负载数据】
其中:load average: 1.15, 1.42, 1.44 后面的三个数分别是1分钟、5分钟、15分钟的负载情况。
2. top命令第二行解释:
Tasks 后依次为:【任务(进程)总个数】【运行数,休眠(sleep)数,stoped停止数,zombie状态(僵尸)数】
3. top命令第三行解释:
cpu状态
us — 用户空间占用CPU的百分比。
sy — 内核空间占用CPU的百分比。
ni — 改变过优先级的进程占用CPU的百分比
id — 空闲CPU百分比
wa — IO等待占用CPU的百分比
hi — 硬中断(Hardware IRQ)占用CPU的百分比
si — 软中断(Software Interrupts)占用CPU的百分比
4. top命令第四行解释:
内存状态
....k total — 物理内存总量(4GB)
....k free — 空闲内存总量
....k used — 使用中的内存总量
....k buffers — 缓存的内存量
5. top命令第五行解释:
swap交换分区
...k total — 交换区总量
...k used — 使用的交换区总量
...k free — 空闲交换区总量
...k cached — 缓冲的交换区总量
6. top命令第6行进程各字段解释如下:
各进程(任务)的状态监控
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 — 进程名称(命令名/命令行)
##. 关于Vmstat命令详解
vmstat命令是常见的Linux/Unix监控工具,可以展现给定时间间隔的服务器的状态值,包括服务器的CPU使用率,内存使用,虚拟内存交换情况,IO读写情况。这个命令是我查看Linux/Unix最喜爱的命令,一个是Linux/Unix都支持,二是相比top,我可以看到整个机器的CPU,内存,IO的使用情况,而不是单单看到各个进程的CPU使用率和内存使用率(使用场景不一样)。
示例:vmstat 1 100 1表示每秒采集一次,100表示采集100次。100不写则表示一直采集。
1. r 表示运行队列,b 表示阻塞的进程
也就是说多少个进程真的分配到CPU,我测试的服务器目前CPU比较空闲,没什么程序在跑,当这个值超过了CPU数目,就会出现CPU瓶颈了。b 表示阻塞的进程, 这个不多说,进程阻塞,大家懂的。
2. swpd\free\buff\cache 虚拟内存
swpd 虚拟内存已使用的大小,如果大于0,表示你的机器物理内存不足了,如果不是程序内存泄露的原因,那么你该升级内存了或者把耗内存的任务迁移到其他机器。
free 空闲的物理内存的大小,我的机器内存总共8G,剩余3415M。
buff Linux/Unix系统是用来存储目录、权限等缓存,我本机大概占用300多M。
cache cache直接用来记忆我们打开的文件,给文件做缓冲,我本机大概占用300多M(这里
3. si 、so、bi、bo、in、cs、us、sy、id
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 每秒上下文切换次数,例如我们调用系统函数,就要进行上下文切换,线程的切换,也要进程上下文切换,这个值要越小越好,太大了,要考虑调低线程或者进程的数目。
us 用户CPU时间,我曾经在一个做加密解密很频繁的服务器上,可以看到us接近100,r运行队列达到80(机器在做压力测试,性能表现不佳)。
sy 系统CPU时间,如果太高,表示系统调用时间长,例如是IO操作频繁。
id 空闲 CPU时间,一般来说,id + us + sy = 100,一般我认为id是空闲CPU使用率,us是用户CPU使用率,sy是系统CPU使用率。
4. wt 和 st
wt 等待IO CPU时间。等待I/O操作完成的时间,即CPU等待输入输出操作完成的时间。这个值大了就说明系统有问题。
st 偷取时间。虚拟化环境中,其他虚拟机占用的CPU时间。
二、linux通过Page Cached内存机制明显提升磁盘IO性能
Linux 内存管理里使用Buffer Cache和Page Cache将要读写的文件放在内存,以提升磁盘IO性能。在我的目录下有个04007的access访问日志。约377M。执行以下shell脚本:
echo "执行:ls -lh | grep 04007access"ls -lh | grep 04007accesssyncecho 1 > /proc/sys/vm/drop_cachesecho "执行:free -m"free -mecho "执行:cat /proc/meminfo | grep Cached"cat /proc/meminfo | grep Cachedecho "执行:time cat 04007access.log >> /dev/null"time cat 04007access.log >> /dev/nullecho "再次执行:time cat 04007access.log >> /dev/null"time cat 04007access.log >> /dev/nullecho "执行:再查看free内存"free -m echo "执行:查看cached占用"cat /proc/meminfo | grep Cached
输出内容截图如下:
可看飘红箭头的数据:文件大小377M,在初始化清空Cached后,内存中空闲714M,cat /proc/meminfo查询,Cached只占用了20644KB,然后两次读入04007access.log这个文件,第一次用时4.6s,第二次用时0.08s,第二次比第一次快了8倍左右。此时再看内存占用为657M,而657-280正好等于377,即是04007access.log的文件内容占用了内存,查看cat /proc/meminfo可见Cached: 为 406856 kB,增长的Cached占用大小约377M,可见linux的Cached机制.从最右边的Cached值(由20变成了397M,此处漏标箭头)也可以看出来。
由此可见Cached的作用非常大!