目录
一、vmstat命令描述
二、vmstat的语法格式
三、压力测试工具stress
实验:
模拟I/O负载
查看是哪个进程I/O读写高:pidstat -d (-d参数查看各进程io情况)
总结
一、vmstat命令描述
vmstat命令: 用来获得有关进程、虚存、页面交换空间及 CPU活动的信息。这些信息反映了系统的负载情况
1、vmstat命令
在系统中运行的每个进程都需要使用到内存,但不是每个进程都需要每时每刻使用系统分配的内存空间。当系统运行所需内存超过实际的物理内存,内核会释放某些进程所占用但未使用的部分或所有物理内存,将这部分资料存储在磁盘上直到进程下一次调用,并将释放出的内存提供给有需要的进程使用。
在Linux内存管理中,主要是通过“调页Paging”和“交换Swapping”来完成上述的内存调度。调页算法是将内存中最近不常使用的页面换到磁盘上,把活动页面保留在内存中供进程使用。交换技术是将整个进程,而不是部分页面,全部交换到磁盘上。
分页(Page)写入磁盘的过程被称作Page-Out,分页(Page)从磁盘重新回到内存的过程被称作Page-In。当内核需要一个分页时,但发现此分页不在物理内存中(因为已经被Page-Out了),此时就发生了分页错误(Page Fault)。
当系统内核发现可运行内存变少时,就会通过Page-Out来释放一部分物理内存。经管Page-Out不是经常发生,但是如果Page-out频繁不断的发生,直到当内核管理分页的时间超过运行程式的时间时,系统效能会急剧下降。这时的系统已经运行非常慢或进入暂停状态,这种状态亦被称作thrashing(颠簸)。
二、vmstat的语法格式
Vmstat的语法:
Vmstat [秒数] [次数] 指定多少秒显示一次,共显示几次
2.1、vmstat命令参数
参数解释
-a:显示活跃和非活跃内存
-f:显示从系统启动至今的fork数量 。
-m:显示slab信息
-n:只在开始时显示一次各字段名称。
-s:显示内存相关统计信息及多种系统活动数量。
delay:刷新时间间隔。如果不指定,只显示一条结果。
count:刷新次数。如果不指定刷新次数,但指定了刷新时间间隔,这时刷新次数为无穷。
-d:显示磁盘相关统计信息。
-p:显示指定磁盘分区统计信息
-S:使用指定单位显示。参数有 k 、K 、m 、M ,分别代表1000、1024、1000000、1048576字节(byte)。默认单位为K(1024 bytes)
-V:显示vmstat版本信息。
示例:
参数解释
Vmstat -a #显示活跃和非活跃内存
字段说明:
前面的Procs(进程)
r 运行队列中进程数量,这个值也可以判断是否需要增加CPU(长期大于1)
b 等待IO的进程数量
在Memory(内存)的字段中
Swpd 使用虚拟内存大小,如果swpd的值不为0,但是SI,SO的值长期为0,这种情况不会影响系统的性能
Free 空闲物理内存大小
Buff 用作缓冲的内存大小
Cache 用作缓存的内存大小,如果cache的值大的时候,说明cache处的文件数多,如果频繁访问到的文件都能被cache,那么磁盘的读IO bi会非常小。
这里vmstat -a中用inact/active(活跃与否) 来取代 buff/cache 的内存输出信息。
Swap字段中
Si 每秒从交换区写到内存的大小,由磁盘调入内存
So 每秒写入交换区的内存大小,由内存调入磁盘
在IO的字段当中(现在的Linux版本块的大小为1KB)
Bi 每秒读取的块数
Bo 每秒写入的块数
注意:随机磁盘读写的时候,这两个值越大(如果超出1024k)能看到CPU在IO等待的值也会越大
在system字段中
In 每秒中断数,包括时钟中断
Cs 每秒上下文切换数
这两个值越大,会看到由内核消耗的CPU时间会越大
接下来的CPU字段当中(以百分比显示)
Us 用户进程执行时间百分比(user time)
Sy 内核系统进程执行时间百分比(system time)
Wa IO等待时间百分比
Id 空闲时间百分比
参数解释
Vmstat -f #显示从系统启动至今的fork数量
显示系统启动后创建的进程数,linux下创建进程的系统调用是fork
参数解释
Vmstat -s #显示内存相关统计信息以及多种系统活动数量
参数解释
Vmstat -d #显示磁盘相关统计信息
参数解释
Vmstat -p [硬盘设备] #查看指定硬盘分区的读写统计信息
参数解释
Vmstat -m #查看系统的slab信息
三、压力测试工具stress
1、工具简介:
stress是Linux下的一个压力测试工具,可以对cpu、memory(内存)、IO以及磁盘进行压力测试,可以指定负载的cpu个数
2、参数详解
-c : --cpu 产生n个进程,每个进程都反复不停的计算随机数的平方根
-i : --io 产生n个进程,每个进程反复调用 将内存上的内容写到硬盘上
-m :-vm 产生n个进程,每个进程不断分配和释放内存
-t : --timout 在n秒后结束进程
-d : --hdd 产生n个不断执行 write 和unlink函数的进程(创建文件、写入内容、删除文件)
下载压力工具软件包
[root@ly ~]# yum install -y epel-release
注:需要先下载所需要的依赖包否则直接下载stress软件包工具不成功
3.1、下载压力测试工具
[root@ly ~]# yum install -y stress
实验:
1、压力测试,查看CPU的使用率
采用stress压力测试工具,模拟CPU 负载的情况,高IO的情况,使用uptime查看平均负载,使用mvstat和pidstat工具,找出负载高的根源。
查看系统负载情况 uptime
模拟cpu 负载:
压力测试前,cpu的使用率及io的使用情况
压力测试前初始信息
使用stress工具进行压力测试
进行压力测试 对2快cpu 进行增压 持续600s
pidstat -u 5 查看运行中的进程和任务,每5秒刷新一次
找到原因:是因为stress进程产生的压力过大
用kill -9杀死指定占用率大的进程,再查看占用率
这时的cpu释放出来,占用率降低,所有数据恢复正常状态
模拟I/O负载
使用stress工具进行压力测试
-i : --io 产生n个进程,每个进程反复调用 将内存上的内容写到硬盘上
进行压力测试,产生10个进程,持续600秒
注:使用stress无法模拟iowait升高,但sys(表示内核进程使用的 CPU 百分比。)升高。stress -i参数表示通过系统调用sync来模拟IO问题,但sync是刷新内存缓冲区数据到磁盘中,以确保同步。如果内存缓冲区内没多少数据,读写到磁盘中的数据也就不多,没法产生IO压力。使用SSD(固态硬盘)磁盘的环境中尤为明显,iowait一直为0,但因为大量系统调用,导致系统CPU使用率sys升高。
命令:stress --io 15 --hdd 15 --timeout 600s
-d : --hdd 产生n个不断执行 write 和unlink函数的进程(创建文件、写入内容、删除文件)
-i : --io 产生n个进程,每个进程反复调用 将内存上的内容写到硬盘上
使用 --hdd 产生函数的进程,就可以使bi和bo 的数值升高,读写性能负载
查询进程占用情况
查看是哪个进程I/O读写高:pidstat -d (-d参数查看各进程io情况)
查看进程找到指定进程杀死
Kill -9 杀掉指定进程后查看
这时的 %iowait数值恢复正常
总结
如果一个程序运行在一个处理器的机器上,并且占用所有的处理器情况下,从而导致CPU过载,就可以通过mvstat进行诊断排错,但是如果不占用所有的处理器,而只占用在一个多处理器的机器上,从而导致一个cpu过载,其他cpu处于空闲,mvstat就不如mpstat显示的信息详细
当%idle数字较低时,就是CPU不足的原因
当%iowait数字较高时,当前负载下的I/O子系统出现了某些问题