stress 命令主要用来模拟系统负载较高时的场景,本文介绍其基本用法。文中 demo 的演示环境为 ubuntu 18.04。linux
基本语法
语法格式:
stress <options>ios
经常使用选项:
-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 显示详细的信息git
安装 stress
Ubuntu 系统默认没有安装 stress,须要经过下面的命令安装:github
$ sudo apt install stress $ stress --version
消耗 CPU 资源
stress 消耗 CPU 资源的方式是经过调用 sqrt 函数计算由 rand 函数产生的随机数的平方根实现的。下面的命令会产生 4 个这样的进程不断的进行计算:ubuntu
$ stress -c 4
使用 top 命令查看 CPU 的状态以下(CPU 在用户态满负荷运转):app
消耗内存资源
下面的命令产生两个子进程,每一个进程分配 300M 内存:ide
$ stress --vm 2 --vm-bytes 300M --vm-keep
父进程处于睡眠状态,两个子进程负责资源消耗。函数
--vm-keep
一直占用内存,区别于不断的释放和从新分配(默认是不断释放并从新分配内存)。
--vm-hang N
指示每一个消耗内存的进程在分配到内存后转入睡眠状态 N 秒,而后释放内存,一直重复执行这个过程。工具
--vm-keep 和 --vm-hang 均可以用来模拟只有少许内存的机器,可是指定它们时 CPU 的使用状况是不同的。性能
$ stress --vm 2 --vm-bytes 500M --vm-keep
一直在进行默认的 stride 操做,user 很是高(cpu 在用户态忙碌)。
$ stress --vm 2 --vm-bytes 500M --vm-hang 5
上面这两种状态不断切换,但总体上看 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
$ stress --vm 2 --vm-bytes 500M --vm-stride 1M
为何会产生这样的结果?缘由是单独的赋值和对比操做可让 CPU 在用户态的负载占到 99% 以上。--vm-stride 值增大就意味着减小赋值和对比操做,这样就增长了内存的释放和分配次数(cpu在内核空间的负载)。
不指定 --vm-stride 选项就使用默认值是 4096,CPU 负载状况居于前二者之间:
$ stress --vm 2 --vm-bytes 500M
消耗 IO 资源
下面的命令产生 4 个进程,每一个进程都反复调用 sync 函数将内存上的内容写到硬盘上:
$ stress -i 4
使用 top 命令查看 CPU 的状态以下:
sy 升高,wa(iowait) 很是高。
压测磁盘及 IO
下面的命令建立一个进程不断的在磁盘上建立 10M 大小的文件并写入内容:
$ stress -d 1 --hdd-bytes 10M
使用 top 命令查看 CPU 的状态以下(此时的 CPU 主要消耗在内核态):
下面是 iostat 2 的输出(一样是高 iowait,瓶颈是写磁盘):
其它选项介绍
--verbose
显示 stress 程序运行过程当中的详细信息:
--timeout N
在 N 秒后结束程序。
--quiet
stress 程序运行的过程当中不输出信息。
-n, --dry-run
输出程序会作什么而并不实际执行相关的操做:
--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 命令是个得力的助手。经过模拟各类高负载状况,能够帮助咱们更好的理解系统瓶颈并掌握性能检测工具的用法。