Linux Command stress 进程压力测试工具

简介: Linux Command stress 进程压力测试工具

Linux Command stress 进程压力测试工具

文章目录

1. 简介

为了测试服务器的负载情况,可以使用stress这个压力测试工具

2. 安装

sudo yum install -y epel-release
sudo yum install -y stress

3. 参数

语法格式:

stress

常用选项:

-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          显示详细的信息

4. 实战

4.1 消耗 CPU 资源

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

$ stress -c 4
stress: info: [8279] dispatching hogs: 4 cpu, 0 io, 0 vm, 0 hdd
$ top
top - 12:09:06 up 12 min,  3 users,  load average: 3.11, 0.96, 0.38
Tasks: 141 total,   6 running, 135 sleeping,   0 stopped,   0 zombie
%Cpu(s): 99.8 us,  0.1 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,  0.1 si,  0.0 st
KiB Mem :  2044472 total,  1095064 free,   269304 used,   680104 buff/cache
KiB Swap:  2097148 total,  2097148 free,        0 used.  1660988 avail Mem 
   PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                                                                                                                               
  8283 root      20   0    7308     96      0 R 100.0  0.0   1:06.35 stress                                                                                                                                                                                
  8281 root      20   0    7308     96      0 R  99.7  0.0   1:06.46 stress                                                                                                                                                                                
  8280 root      20   0    7308     96      0 R  99.3  0.0   1:05.83 stress                                                                                                                                                                                

4.2 消耗内存资源

产生两个子进程,每个进程分配 300M 内存

$ stress --vm 2 --vm-bytes 300M --vm-keep
stress: info: [8344] dispatching hogs: 0 cpu, 0 io, 2 vm, 0 hdd
$ stress --vm 2 --vm-bytes 500M --vm-keep
$ ps aux |grep stress
root       8344  0.0  0.0   7308   432 pts/0    S+   12:11   0:00 stress --vm 2 --vm-bytes 300M --vm-keep
root       8345 99.3 15.0 314512 307268 pts/0   R+   12:11   1:02 stress --vm 2 --vm-bytes 300M --vm-keep
root       8346 99.3 15.0 314512 307268 pts/0   R+   12:11   1:02 stress --vm 2 --vm-bytes 300M --vm-keep
root       8358  0.0  0.0 112724   984 pts/1    S+   12:12   0:00 grep --color=auto stress
父进程处于睡眠状态,两个子进程负责资源消耗。
$ top
top - 12:15:45 up 19 min,  3 users,  load average: 1.98, 1.64, 0.91
Tasks: 138 total,   3 running, 135 sleeping,   0 stopped,   0 zombie
%Cpu0  :  0.0 us,  0.7 sy,  0.0 ni, 99.3 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu1  :100.0 us,  0.0 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu2  :100.0 us,  0.0 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu3  :  0.0 us,  0.3 sy,  0.0 ni, 99.7 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  2044472 total,   479152 free,   884880 used,   680440 buff/cache
KiB Swap:  2097148 total,  2097148 free,        0 used.  1045272 avail Mem 
   PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                                                                                                                               
  8345 root      20   0  314512 307268    128 R 100.0 15.0   4:11.07 stress                                                                                                                                                                                
  8346 root      20   0  314512 307268    128 R 100.0 15.0   4:11.09 stress                                                                                                                                                                                
  7926 root      20   0  663944  44860  14128 S   1.0  2.2   0:13.82 containerd                                                                                                                                                                            
     9 root      20   0       0      0      0 S   0.3  0.0   0:00.92 rcu_sched         

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

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

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

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

cpu不高

[root@localhost ~]# top
top - 12:24:44 up 28 min,  3 users,  load average: 0.12, 0.92, 0.98
Tasks: 138 total,   1 running, 137 sleeping,   0 stopped,   0 zombie
%Cpu0  :  0.0 us,  0.3 sy,  0.0 ni, 99.7 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu1  :  0.0 us,  0.3 sy,  0.0 ni, 99.3 id,  0.0 wa,  0.0 hi,  0.3 si,  0.0 st
%Cpu2  :  0.7 us,  7.7 sy,  0.0 ni, 91.6 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu3  :  0.3 us,  0.0 sy,  0.0 ni, 99.7 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  2044472 total,    70056 free,  1293968 used,   680448 buff/cache
KiB Swap:  2097148 total,  2097148 free,        0 used.   636192 avail Mem 
   PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                                                                                                                               
  8428 root      20   0  519312 512088    132 S   4.3 25.0   0:07.09 stress                                                                                                                                                                                
  8427 root      20   0  519312 512088    132 S   4.0 25.0   0:07.75 stress  

–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
$ top
%Cpu(s): 28.5 us, 21.8 sy
$ stress --vm 2 --vm-bytes 500M --vm-stride 1M
$ top
%Cpu(s):  0.5 us, 49.1 sy

为什么会产生这样的结果?原因是单独的赋值和对比操作可以让 CPU 在用户态的负载占到 99% 以上。–vm-stride 值增大就意味着减少赋值和对比操作,这样就增加了内存的释放和分配次数(cpu在内核空间的负载)。

不指定 --vm-stride 选项就使用默认值是 4096,CPU 负载情况居于前两者之间:

$ stress --vm 2 --vm-bytes 500M
$ top
%Cpu(s):  2.5 us, 48.0 sy

4.3 消耗 IO 资源

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

$ top 
%Cpu(s):  0.0 us,  0.2 sy,  0.0 ni, 99.8 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
$ stress -i 4
stress: info: [8598] dispatching hogs: 0 cpu, 4 io, 0 vm, 0 hdd
$ top
%Cpu(s):  0.9 us, 52.9 sy,  0.0 ni, 46.2 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                                                                                                                               
  8602 root      20   0    7308    100      0 R  58.5  0.0   0:54.75 stress                                                                                                                                                                                
  8599 root      20   0    7308    100      0 R  57.8  0.0   0:55.73 stress                                                                                                                                                                                
  8601 root      20   0    7308    100      0 R  57.8  0.0   0:55.80 stress                                                                                                                                                                                
  8600 root      20   0    7308    100      0 R  55.8  0.0   0:55.13 stress 

sy 升高

4.4 压测磁盘及 IO

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

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

4.5 其它选项介绍

--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

更多阅读:


https://www.cnblogs.com/sparkdev/p/10354947.html

How to Stress Test Your CPU in Linux

stress(1) - Linux man page

How to Impose High CPU Load and Stress Test on Linux Using ‘Stress-ng’ Tool

How to stress test your Linux system


相关文章
|
2月前
|
机器学习/深度学习 人工智能 测试技术
EdgeMark:嵌入式人工智能工具的自动化与基准测试系统——论文阅读
EdgeMark是一个面向嵌入式AI的自动化部署与基准测试系统,支持TensorFlow Lite Micro、Edge Impulse等主流工具,通过模块化架构实现模型生成、优化、转换与部署全流程自动化,并提供跨平台性能对比,助力开发者在资源受限设备上高效选择与部署AI模型。
280 9
EdgeMark:嵌入式人工智能工具的自动化与基准测试系统——论文阅读
|
2月前
|
Java 测试技术 API
自动化测试工具集成及实践
自动化测试用例的覆盖度及关键点最佳实践、自动化测试工具、集成方法、自动化脚本编写等(兼容多语言(Java、Python、Go、C++、C#等)、多框架(Spring、React、Vue等))
110 6
|
3月前
|
前端开发 Java jenkins
Jmeter压力测试工具全面教程和使用技巧。
JMeter是一个能够模拟高并发请求以检查应用程序各方面性能的工具,包括但不限于前端页面、后端服务及数据库系统。熟练使用JMeter不仅能够帮助发现性能瓶颈,还能在软件开发早期就预测系统在面对真实用户压力时的表现,确保软件质量和用户体验。在上述介绍的基础上,建议读者结合官方文档和社区最佳实践,持续深入学习和应用。
706 10
|
3月前
|
监控 Java 数据挖掘
利用Jmeter工具进行HTTP接口的性能测试操作
基础上述步骤反复迭代调整直至满足预期目标达成满意水平结束本轮压力评估周期进入常态监控阶段持续关注系统运转状态及时发现处理新出现问题保障服务稳定高效运作
446 0
|
4月前
|
敏捷开发 运维 数据可视化
DevOps看板工具中的协作功能:如何打破开发、测试与运维之间的沟通壁垒
在DevOps实践中,看板工具通过可视化任务管理和自动化流程,提升开发与运维团队的协作效率。它支持敏捷开发、持续交付,助力团队高效应对需求变化,实现跨职能协作与流程优化。
|
5月前
|
数据可视化 测试技术 Go
Go 语言测试与调试:`go test` 工具用法
`go test` 是 Go 语言内置的测试工具,支持单元测试、基准测试、示例测试等功能。本文详解其常用参数、调试技巧及性能测试命令,并提供实际项目中的应用示例与最佳实践。
|
4月前
|
人工智能 数据可视化 测试技术
UAT测试排程工具深度解析:让验收测试不再失控,项目稳稳上线
在系统交付节奏加快的背景下,“测试节奏混乱”已成为项目延期的主因之一。UAT测试排程工具应运而生,帮助团队结构化拆解任务、清晰分配责任、实时掌控进度,打通需求、测试、开发三方协作闭环,提升测试效率与质量。本文还盘点了2025年热门UAT工具,助力团队选型落地,告别靠表格和群聊推进测试的低效方式,实现有节奏、有章法的测试管理。
|
Web App开发 测试技术 API
自动化测试工具Selenium的深度解析
【5月更文挑战第27天】本文旨在深入剖析自动化测试工具Selenium,探讨其架构、原理及应用。通过对其核心组件、运行机制及在实际项目中的应用案例进行详细解读,以期为软件测试人员提供全面、深入的理解与实践指导。
|
JSON 数据管理 测试技术
自动化测试工具Selenium Grid的深度应用分析深入理解操作系统的内存管理
【5月更文挑战第28天】随着互联网技术的飞速发展,软件测试工作日益复杂化,传统的手工测试已无法满足快速迭代的需求。自动化测试工具Selenium Grid因其分布式执行特性而受到广泛关注。本文旨在深入剖析Selenium Grid的工作原理、配置方法及其在复杂测试场景中的应用优势,为测试工程师提供高效测试解决方案的参考。
|
敏捷开发 监控 IDE
深入理解自动化测试工具Selenium的工作原理与实践应用
【5月更文挑战第26天】 随着敏捷开发和持续集成理念的普及,自动化测试在软件开发生命周期中扮演了至关重要的角色。Selenium作为最流行的自动化测试工具之一,以其开源、跨平台和支持多种编程语言的特性被广泛使用。本文将详细解析Selenium的核心组件,探讨其工作原理,并通过案例分析展示如何高效地实施Selenium进行Web应用的自动化测试。我们将从测试准备到结果分析的全过程,提供一系列实用的策略和最佳实践,帮助读者构建和维护一个健壮的自动化测试环境。