Linux stress 命令 基本语法 安装 stress 消耗 CPU 资源 消耗内存资源 消耗 IO 资源 压测磁盘及 IO 其它选项介绍 总结

Linux stress 命令
基本语法
安装 stress
消耗 CPU 资源
消耗内存资源
消耗 IO 资源
压测磁盘及 IO
其它选项介绍
总结

stress 命令主要用来模拟系统负载较高时的场景,本文介绍其基本用法。文中 demo 的演示环境为 ubuntu 18.04。

语法格式:
stress <options>

常用选项:
-c, --cpu N              产生 N 个进程,每个进程都反复不停的计算随机数的平方根
-i, --io N                  产生 N 个进程,每个进程反复调用 sync() 将内存上的内容写到硬盘上
-m, --vm N             产生 N 个进程,每个进程不断分配和释放内存
    --vm-bytes B      指定分配内存的大小
    --vm-stride B     不断的给部分内存赋值,让 COW(Copy On Write)发生
    --vm-hang N      指示每个消耗内存的进程在分配到内存后转入睡眠状态 N 秒,然后释放内存,一直重复执行这个过程
    --vm-keep          一直占用内存,区别于不断的释放和重新分配(默认是不断释放并重新分配内存)
-d, --hadd N           产生 N 个不断执行 write 和 unlink 函数的进程(创建文件,写入内容,删除文件)
    --hadd-bytes B  指定文件大小
-t, --timeout N       在 N 秒后结束程序        
--backoff N            等待N微妙后开始运行
-q, --quiet              程序在运行的过程中不输出信息
-n, --dry-run          输出程序会做什么而并不实际执行相关的操作
--version                显示版本号
-v, --verbose          显示详细的信息

安装 stress

Ubuntu 系统默认没有安装 stress,需要通过下面的命令安装:

$ sudo apt install stress
$ stress --version

Linux stress 命令
基本语法
安装 stress
消耗 CPU 资源
消耗内存资源
消耗 IO 资源
压测磁盘及 IO
其它选项介绍
总结

消耗 CPU 资源

stress 消耗 CPU 资源的方式是通过调用 sqrt 函数计算由 rand 函数产生的随机数的平方根实现的。下面的命令会产生 4 个这样的进程不断的进行计算:

$ stress -c 4

Linux stress 命令
基本语法
安装 stress
消耗 CPU 资源
消耗内存资源
消耗 IO 资源
压测磁盘及 IO
其它选项介绍
总结

使用 top 命令查看 CPU 的状态如下(CPU 在用户态满负荷运转):

Linux stress 命令
基本语法
安装 stress
消耗 CPU 资源
消耗内存资源
消耗 IO 资源
压测磁盘及 IO
其它选项介绍
总结

消耗内存资源

下面的命令产生两个子进程,每个进程分配 300M 内存:

$ stress --vm 2 --vm-bytes 300M --vm-keep

Linux stress 命令
基本语法
安装 stress
消耗 CPU 资源
消耗内存资源
消耗 IO 资源
压测磁盘及 IO
其它选项介绍
总结

父进程处于睡眠状态,两个子进程负责资源消耗。

--vm-keep
一直占用内存,区别于不断的释放和重新分配(默认是不断释放并重新分配内存)。
--vm-hang N
指示每个消耗内存的进程在分配到内存后转入睡眠状态 N 秒,然后释放内存,一直重复执行这个过程。

--vm-keep 和 --vm-hang 都可以用来模拟只有少量内存的机器,但是指定它们时 CPU 的使用情况是不一样的。

$ stress --vm 2 --vm-bytes 500M --vm-keep

Linux stress 命令
基本语法
安装 stress
消耗 CPU 资源
消耗内存资源
消耗 IO 资源
压测磁盘及 IO
其它选项介绍
总结

一直在进行默认的 stride 操作,user 非常高(cpu 在用户态忙碌)。

$ stress --vm 2 --vm-bytes 500M --vm-hang 5

Linux stress 命令
基本语法
安装 stress
消耗 CPU 资源
消耗内存资源
消耗 IO 资源
压测磁盘及 IO
其它选项介绍
总结

上面这两种状态不断切换,但整体上看 CPU 的负载并不高。

--vm-stride B
不断的给部分内存赋值,让 COW(Copy On Write)发生。只要指定了内存相关的选项,这个操作就会执行,只是大小为默认的 4096。赋值内存的比例由参数决定:

for (i = 0; i < bytes; i += stride)
    ptr[i] = 'Z';           /* Ensure that COW happens.  */

bytes 为消耗的总内存大小,stride 为间隔。
该参数会影响 CPU 状态 us 和 sy:

$ stress --vm 2 --vm-bytes 500M --vm-stride 64

Linux stress 命令
基本语法
安装 stress
消耗 CPU 资源
消耗内存资源
消耗 IO 资源
压测磁盘及 IO
其它选项介绍
总结

$ stress --vm 2 --vm-bytes 500M --vm-stride 1M

Linux stress 命令
基本语法
安装 stress
消耗 CPU 资源
消耗内存资源
消耗 IO 资源
压测磁盘及 IO
其它选项介绍
总结

为什么会产生这样的结果?原因是单独的赋值和对比操作可以让 CPU 在用户态的负载占到 99% 以上。--vm-stride 值增大就意味着减少赋值和对比操作,这样就增加了内存的释放和分配次数(cpu在内核空间的负载)。
不指定 --vm-stride 选项就使用默认值是 4096,CPU 负载情况居于前两者之间:

$ stress --vm 2 --vm-bytes 500M

Linux stress 命令
基本语法
安装 stress
消耗 CPU 资源
消耗内存资源
消耗 IO 资源
压测磁盘及 IO
其它选项介绍
总结

消耗 IO 资源

下面的命令产生 4 个进程,每个进程都反复调用 sync 函数将内存上的内容写到硬盘上:

$ stress -i 4

Linux stress 命令
基本语法
安装 stress
消耗 CPU 资源
消耗内存资源
消耗 IO 资源
压测磁盘及 IO
其它选项介绍
总结

使用 top 命令查看 CPU 的状态如下:

Linux stress 命令
基本语法
安装 stress
消耗 CPU 资源
消耗内存资源
消耗 IO 资源
压测磁盘及 IO
其它选项介绍
总结

sy 升高,wa(iowait) 非常高。

压测磁盘及 IO

下面的命令创建一个进程不断的在磁盘上创建 10M 大小的文件并写入内容:

$ stress -d 1 --hdd-bytes 10M

Linux stress 命令
基本语法
安装 stress
消耗 CPU 资源
消耗内存资源
消耗 IO 资源
压测磁盘及 IO
其它选项介绍
总结

使用 top 命令查看 CPU 的状态如下(此时的 CPU 主要消耗在内核态):

Linux stress 命令
基本语法
安装 stress
消耗 CPU 资源
消耗内存资源
消耗 IO 资源
压测磁盘及 IO
其它选项介绍
总结

下面是 iostat 2 的输出(同样是高 iowait,瓶颈是写磁盘):

Linux stress 命令
基本语法
安装 stress
消耗 CPU 资源
消耗内存资源
消耗 IO 资源
压测磁盘及 IO
其它选项介绍
总结

其它选项介绍

--verbose
显示 stress 程序运行过程中的详细信息:

Linux stress 命令
基本语法
安装 stress
消耗 CPU 资源
消耗内存资源
消耗 IO 资源
压测磁盘及 IO
其它选项介绍
总结

--timeout N
在 N 秒后结束程序。

--quiet
stress 程序运行的过程中不输出信息。

-n, --dry-run
输出程序会做什么而并不实际执行相关的操作:

Linux stress 命令
基本语法
安装 stress
消耗 CPU 资源
消耗内存资源
消耗 IO 资源
压测磁盘及 IO
其它选项介绍
总结

--backoff N
让新 fork 出来的进程 sleep N 微秒再开始运行。

除了单独指定某一类的选项,还可以同时执行多个类型的任务,比如产生 3 个 CPU 进程、3 个 IO 进程、2 个10M 的 vm 进程,并且每个 vm 进程中不循环分配释放内存:

$ stress --cpu 3 --io 3 --vm 2 --vm-bytes 10M --vm-keep

总结

对于学习 Linux 性能检测相关的命令来说,stress 命令是个得力的助手。通过模拟各种高负载情况,可以帮助我们更好的理解系统瓶颈并掌握性能检测工具的用法。

参考:
stress man page
stress 1.0.4 code