linux系统上做性能压力测试 —— 筑梦之路

这里主要使用stressstress-ng。

简介

stress:

stress 是一款简单但功能强大的工具,可对 Linux 系统施加可配置的 CPU、内存、I/O 或磁盘压力。通过模拟繁重的工作负载,系统管理员可以观察系统在压力下的表现反应。

这一工具的价值在于找出系统潜在的薄弱环节,确保系统能够在不影响性能的情况下处理繁重的任务。

stress-ng:

stress-ngstress 的扩展版本,它超越了前者的基本功能,提供的压力测试范围更广,不仅包括 CPU、内存、I/O 和磁盘压力,还包括对进程间通信、套接字和各种文件操作的额外测试。

stressstress-ng 对 Linux 系统的前瞻性管理都有很大帮助,使管理员和程序员能够优化系统配置、识别潜在问题并提高系统的整体可靠性。

stress

  1. 在常用的发行版操作系统上安装
bash 复制代码
sudo apt install stress         [On Debian, Ubuntu and Mint]
sudo yum install stress         [On RHEL/CentOS/Fedora and Rocky/AlmaLinux]
sudo emerge -a sys-apps/stress  [On Gentoo Linux]
sudo apk add stress             [On Alpine Linux]
sudo pacman -S stress           [On Arch Linux]
sudo zypper install stress      [On OpenSUSE]    
sudo pkg install stress         [On FreeBSD]
  1. 帮助信息
bash 复制代码
stress --help
--------------------------------------------------------------------------------
`stress' imposes certain types of compute stress on your system

Usage: stress [OPTION [ARG]] ...
 -?, --help         show this help statement
     --version      show version statement
 -v, --verbose      be verbose
 -q, --quiet        be quiet
 -n, --dry-run      show what would have been done
 -t, --timeout N    timeout after N seconds
     --backoff N    wait factor of N microseconds before work starts
 -c, --cpu N        spawn N workers spinning on sqrt()
 -i, --io N         spawn N workers spinning on sync()
 -m, --vm N         spawn N workers spinning on malloc()/free()
     --vm-bytes B   malloc B bytes per vm worker (default is 256MB)
     --vm-stride B  touch a byte every B bytes (default is 4096)
     --vm-hang N    sleep N secs before free (default none, 0 is inf)
     --vm-keep      redirty memory instead of freeing and reallocating
 -d, --hdd N        spawn N workers spinning on write()/unlink()
     --hdd-bytes B  write B bytes per hdd worker (default is 1GB)

Example: stress --cpu 8 --io 4 --vm 2 --vm-bytes 128M --timeout 10s

Note: Numbers may be suffixed with s,m,h,d,y (time) or B,K,M,G (size).
对应介绍:

-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: 显示详细的信息
  1. 使用示例

    CPU压测

    stress --cpu 8 --timeout 20

    stress 消耗 CPU 资源是通过调用 sqrt() 函数(计算由 rand() 函数产生的随机数的平方根)实现。命令会产生 8 个这样的子进程不断计算,超时时间为20秒,结束后再次运行 uptime 比较平均负载

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

    stress --cpu 8 -v --timeout 30s

    启动 8 个 sqrt() 子进程,超时时间 30s,同时显示有关操作的详细信息

    内存压测

    stress --vm 8 --timeout 20s

    产生 8 个子进程,超时时间 20s,每个进程不断分配和释放内存

    stress --vm 2 --vm-bytes 2048M --vm-keep --timeout 20s

    产生 2 个子进程,每个进程分配 2048M 内存

    #################

    --vm-keep & --vm-hang N

    --vm-keep:一直占用内存,区别于不断的释放和重新分配(默认是不断释放并重新分配内存);

    --vm-hang N:指示每个消耗内存的进程在分配到内存后转入睡眠状态 N 秒,然后释放内存,一直重复执行这个过程;

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

    stress --vm 2 --vm-bytes 2048M --vm-keep --timeout 20s

    --vm-keep:CPU 负载高

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

    stress --vm 2 --vm-bytes 2048M --vm-hang 5 --timeout 20s

    -vm-hang N:CPU 负载不高

    #############

    --vm-stride B

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

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

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

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

    不指定 --vm-stride 选项就使用默认值是 4096

    stress --vm 2 --vm-bytes 500M --vm-stride 64M --timeout 20s

    stress --vm 2 --vm-bytes 500M --vm-stride 1024M --timeout 20s

    IO压测

    stress -i 8 --timeout 20s

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

    使用 top 命令查看 CPU 的状态,sy 升高,wa(iowait) 非常高

    磁盘压测和IO

    stress -d 1 --hdd-bytes 10M --timeout 20s

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

    使用 top 命令查看 CPU 的状态(此时的 CPU 主要消耗在内核态),iostat 2 输出,高 iowait,瓶颈是写磁盘

    执行多个类型的任务,比如产生 4 个 CPU 进程、3 个 IO 进程、2 个 256M 的 vm 进程,并且每个 vm 进程中循环分配释放内存:

    stress --cpu 4 --io 3 --vm 2 --vm-bytes 256M --vm-keep --timeout 20s

stress-ng

stress-ng 完全兼容 stress, 并且在此基础上通过几百个参数,可以产生各种复杂的压力

  1. 安装
bash 复制代码
sudo apt install stress-ng         [On Debian, Ubuntu and Mint]
sudo yum install stress-ng         [On RHEL/CentOS/Fedora and Rocky/AlmaLinux]
sudo emerge -a sys-apps/stress-ng  [On Gentoo Linux]
sudo apk add stress-ng             [On Alpine Linux]
sudo pacman -S stress-ng           [On Arch Linux]
sudo zypper install stress-ng      [On OpenSUSE]    
sudo pkg install stress-ng         [On FreeBSD]
  1. 常用参数选项
bash 复制代码
-h,--help:显示帮助信息;

--version:显示版本信息;

-t,--timeout:指定程序运行结束的时间,后面直接跟数字,单位为秒;

-c,---cpu:后面空格跟一个整数,表示测试CPU的进程数,--cpu 4 :表示生成4个worker循环调用sqrt()产生cpu压力;

-i,--io:后面空格跟一个整数,表示测试磁盘I/O的进程数, --io 4 :表示生成4个worker循环调用sync()产生io压力;

-m,--vm:后面空格跟一个整数,表示测试内存的进程数,--vm 4 :表示生成4个worker循环调用malloc()/free()产生内存压力;

-d,--hdd:后面空格直接跟数字,表示产生执行write和unlink函数的进程数,用于磁盘负载测试;

--cpu-method:指定CPU的测试方法,后面空格直接跟方法名;

--metrics:输出命令执行指标;

--vm-bytes:指定在内存测试时malloc的字节数,默认256M;

--class:指定测试类别,后面空格跟类别名;

--matrix:启用矩阵测试模式,后面空格跟矩阵模式名;

--random-seed:指定测试随机种子,后面空格跟种子名;

--sequential:启用顺序测试模式;

--hdd-bytes:指定写的字节数;

--cpu-load:CPU负载占比,后面空格直接跟数字,单位为百分比;
  1. 使用示例
bash 复制代码
# CPU压测

stress-ng --cpu 4 --cpu-method matrixprod --timeout 20s

使用 4 个 CPU 进程数,进行矩阵乘法计算以进行压力测试,持续时间为20秒

stress-ng -c 2 --cpu-method pi --timeout 20s

产生 2 个 worker 做圆周率算法压力

stress-ng -c 2 --cpu-method all --timeout 20s

产生 2 个 worker 迭代使用 30 多种不同的压力算法,包括pi, crc16, fft等等

stress-ng --sock 2 --timeout 20s

产生 2 个 worker 调用 socket 相关函数产生压力

stress-ng --tsc 2 --timeout 20s

产生 2 个 worker 读取 tsc 产生压力


stress-ng --tsc 2 --taskset 0 --timeout 20s

将压力指定到特定的cpu 0上


# 内存压测

stress-ng --vm 4 --vm-bytes 512M --timeout 20s

用 4 个内存分配进程, 每次分配大小512M,分配后不释放,保持测试20秒

# IO负载压测

stress-ng --io 4 --timeout 20s

使用 4 个 IO 进程 ,保持测试20秒


# 磁盘IO压测

stress-ng --io 4 --hdd 1 --hdd-bytes 1G --timeout 20s

使用 4 个I/O进程, 1 个写进程,每次写1G 文件块,测试20秒
相关推荐
小白跃升坊15 小时前
基于1Panel的AI运维
linux·运维·人工智能·ai大模型·教学·ai agent
跃渊Yuey16 小时前
【Linux】线程同步与互斥
linux·笔记
杨江16 小时前
seafile docker安装说明
运维
舰长11516 小时前
linux 实现文件共享的实现方式比较
linux·服务器·网络
好好沉淀16 小时前
Docker开发笔记(详解)
运维·docker·容器
zmjjdank1ng16 小时前
Linux 输出重定向
linux·运维
路由侠内网穿透.16 小时前
本地部署智能家居集成解决方案 ESPHome 并实现外部访问( Linux 版本)
linux·运维·服务器·网络协议·智能家居
树℡独16 小时前
ns-3仿真之应用层(三)
运维·服务器·ns3
VekiSon16 小时前
Linux内核驱动——基础概念与开发环境搭建
linux·运维·服务器·c语言·arm开发
zl_dfq17 小时前
Linux 之 【进程信号】(signal、kill、raise、abort、alarm、Core Dump核心转储机制)
linux