• Linux系统压力测试工具stress


    linux系统下,可以使用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

    消耗 CPU 资源

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

    $ stress -c 4

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

    消耗内存资源

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

    $ 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 命令是个得力的助手。通过模拟各种高负载情况,可以帮助我们更好的理解系统瓶颈并掌握性能检测工具的用法。

    参考:
    stress man page
    stress 1.0.4 code

    作者:sparkdev
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    收藏:详解交换机基础知识
    Linux Used内存到底哪里去了?
    TCP三次握手和四次挥手以及11种状态
    操作系统深度研究(75页PPT)
    命令行版的斗地主你玩过没?
    10大黑客专用的 Linux 操作系统
    (四)Linux命令大全:帮助命令
    (三)Linux命令大全:文件搜索命令
    (二)Linux命令大全:权限管理命令
    (一)Linux命令大全:文件处理命令
  • 原文地址:https://www.cnblogs.com/jiftle/p/12904248.html
Copyright © 2020-2023  润新知