yw-busy 轻量级系统资源负载模拟工具

yw-busy 轻量级系统资源负载模拟工具

轻量级系统资源负载模拟工具。精确控制 CPU 利用率和内存占用,适用于验证监控告警、测试系统抗压能力,以及模拟生产环境资源压力。

基于 lookbusy 1.4 用 Go 忠实复刻,跨平台支持 Linux 与 Windows。

仓库地址:https://gitee.com/guoliangjun17/yw-busy

lookbusy 说明:https://199604.com/3248

支持平台

平台 架构 支持状态
Linux amd64 / arm64 ✅ 正式支持
Windows amd64 ✅ 正式支持(见下方版本说明)
macOS ⚠️ 仅用于本地开发编译,非交付平台,CPU 亲和性不生效

说明:源码中保留了 darwin 的桩实现,仅为了让开发者在 macOS 上编译和运行单元测试。生产环境不支持 macOS。

目标

  • 跨平台支持 Linux 与 Windows
  • 模块化架构,便于扩展 CPU、内存、磁盘 IO、网络等模拟器
  • 命令行参数与原 lookbusy 对齐,现有脚本尽量少改即可迁移
  • 充分利用 Go 并发模型,实现高性能、低资源占用的负载模拟

当前阶段

第一阶段已实现:

  • CPU 负载模拟:fixed(固定利用率)与 curve(周期波动利用率)两种模式
  • 内存占用模拟:分配指定大小并主动 stir(memmove 搬运),维持真实物理内存占用

编译

当前平台:

make build

交叉编译(仅 Linux / Windows):

make cross

开发环境:Go 1.25.7(见 go.mod)。

使用示例

固定 50% CPU 利用率(闭环反馈为 lookbusy 原生行为并默认启用,系统总 CPU 趋近 50%,其他进程占用高时自动降低):

./build/yw-busy -c 50

关闭闭环反馈、改用开环模式(固定占用单核 50%,不随系统负载变化;此模式 lookbusy 没有,为 yw-busy 额外提供):

./build/yw-busy -c 50 --no-feedback

CPU 利用率在 14%-40% 间按曲线波动(周期 120 秒,峰值在第 60 秒),等价于 lookbusy 用法:

./build/yw-busy -c 14-40 -r curve -P 120 -p 60

CPU 曲线 + 内存占用 512MB:

./build/yw-busy -c 20-50 -r curve -P 120 -p 60 -m 512M

仅分配 1GB 内存:

./build/yw-busy -m 1G

命令行参数

与 lookbusy 对齐:

短选项 长选项 说明
-c --cpu-util CPU 利用率:fixed 模式用单值 50curve 模式用范围 14-40
-n --ncpus 使用的 CPU 核心数,0 表示自动检测(默认)
-r --cpu-mode CPU 模式:fixedcurve(默认 fixed
-p --cpu-curve-peak 曲线峰值在周期内的偏移,如 601m(默认 13h,即本地时间下午 1 点)
-P --cpu-curve-period 曲线周期,如 1202m(默认 86400,即 1 天)
-m --mem-util 内存占用大小,如 512M1G
-M --mem-sleep 内存 stir 每次搬运之间的睡眠间隔,纯数字按微秒(默认 1000
-u --utc 曲线相位按 UTC 计算(默认按本地时区)
-q --quiet 安静模式
-v --verbose 详细输出
-h --help 显示帮助
-V --version 显示版本
--feedback 显式启用闭环反馈(默认已启用,兼容旧脚本显式传递)
--no-feedback 禁用闭环反馈,改用开环模式(lookbusy 无此模式,yw-busy 额外提供)

磁盘负载选项 -d/-b/-D/-f(lookbusy 原有)不受支持,命中会返回明确错误并退出。

时间参数:-p/-P 纯数字按秒(可附 d/h/m/s);-M 纯数字按微秒。为便于使用额外接受 ms/s/m/h/d 后缀(lookbusy 合法输入均兼容)。

CPU 负载:闭环反馈(默认)与开环模式

默认采用闭环反馈控制——这是 lookbusy 的原生、强制行为(man 手册 CPU UTILIZATION 一节),yw-busy 默认启用即为忠实复刻:

  • 每个窗口读取系统整体 CPU 利用率(Linux /proc/stat 的 user+nice+system,与 lookbusy 口径一致;Windows GetSystemTimes),动态修正自身忙循环量。
  • 当其他进程占用 CPU 时,yw-busy 会自动降低自身负载,使系统利用率维持在目标值。
  • 例如 -c 50 会让系统总 CPU 趋近 50%,而不是本进程固定占用单核 50%。

核心行为规则

系统状态 yw-busy 行为
系统空闲,CPU 低于目标值 主动产生负载,填补到目标值
系统繁忙,CPU 已达或超过目标值 自动降低自身占用,让路给其他进程
系统刚好在目标区间内 维持当前水平

注意:如果系统 CPU 已经高于目标值(例如虚拟机总 CPU 已达 40%,而目标是 -c 10-20),yw-busy 几乎不产生任何额外 CPU 占用。这不 bug,是闭环反馈的正确行为。

--no-feedback 切换到开环控制(固定占用目标百分比的单核负载,不受其他进程影响)。注意:lookbusy 本身没有开环模式,这是 yw-busy 额外提供的逃生开关:

./build/yw-busy -c 50 --no-feedback

-c 默认不启用 CPU;需显式指定 -c-m 至少一项。

  • Linux 通过 /proc/stat、Windows 通过 GetSystemTimes 读取系统整体 CPU。
  • macOS 无系统级 CPU 采样,会回退到开环(macOS 仅供本地开发)。
  • 开环/闭环收敛都需要几个 100ms 窗口;瞬时利用率可能存在 ±5-10% 的系统级误差。

内存负载:主动 stir

与 lookbusy 的 mem_stir 一致:分配缓冲区并逐字节写入使其真正驻留物理内存后,
持续以 memmove 在缓冲区内搬运(读位置每次前进 1 页、写位置前进 5 页并环绕),
每次搬运之间睡眠 -M 指定的间隔。持续搬运维持真实占用不被回收/压缩,并产生内存带宽活动。

curve 模式说明

curve 模式按 lookbusy 原始算法实现(lb.c:516-555),采用完整余弦曲线并基于绝对 wall-clock 时间

time_offset = -本地时区偏移 + peak     # -u 时时区偏移取 0
fraction    = ((now + time_offset) mod period) / period
利用率       = MIN + (MAX - MIN) * (cos(fraction * 2π) + 1) / 2

峰值出现在 -p 指定的相位(默认下午 1 点),基于绝对时间使多实例天然同步。
示例 -c 14-40 -r curve -P 120 -p 60:120 秒周期内在 14%-40% 间波动,相位峰值在每个周期的第 60 秒。

自动化启动脚本

yw-busy_start.sh 是一个智能启动包装脚本,适用于 cron 定时任务或 rc.local 开机自启场景:

  • 智能内存计算:读取 /proc/meminfo 获取系统总内存和已用内存,仅当实际内存利用率低于阈值时才按差额追加内存占用,避免过度分配。
  • 防重复启动:启动前自动清理已有 yw-busy 进程。
  • 可配置参数:脚本顶部集中管理 CPU 范围、模式、曲线参数、内存利用率阈值等。

配置方式

编辑脚本顶部的配置参数:

men_utilization=15      # 内存利用率阈值(百分比)
cpu_range="14-40"        # CPU 利用率范围(curve 模式)
cpu_mode="curve"         # CPU 模式:fixed / curve
curve_period="120"       # 曲线周期(秒)
curve_peak="60"          # 曲线峰值偏移(秒)

部署示例

放置二进制和脚本到目标路径:

cp build/yw-busy /usr/local/bin/
cp yw-busy_start.sh /usr/local/bin/
chmod +x /usr/local/bin/yw-busy_start.sh

cron 定时执行(每小时一次):

0 */1 * * * /bin/bash /usr/local/bin/yw-busy_start.sh

或加入 rc.local 实现开机自启:

echo "bash /usr/local/bin/yw-busy_start.sh" >> /etc/rc.d/rc.local

测试

make test
make race

Windows 版本兼容性(重要)

本项目当前使用 Go 1.25.7 编译,而 Go 官方运行时对 Windows 的最低要求为:

  • Go 1.21 及以上:仅支持 Windows 10 / Windows Server 2016 及更高版本
  • Windows Server 2008 / 2008 R2 / 2012 / 2012 R2 不在 Go 1.21+ 运行时支持范围

若你的目标包含 Windows 2008 / 2012,需要降级 Go 工具链版本编译:

  • 支持 Windows 7 / Server 2008 R2:Go 1.20 及以下
  • 支持 Windows Server 2008(非 R2):需 Go 1.18 及以下,且部分系统调用可能不可用

建议确认目标 Windows 版本清单后再选择 Go 版本;如需按特定 Go 版本调整构建,请告知。

注意事项

  • -c 默认不启用 CPU;需显式指定 -c-m 至少一项。
  • macOS 上 CPU 亲和性为空操作,且无系统级 CPU 采样,CPU 负载回退为开环模式(仅供本地开发)。
  • fixed 模式只接受单一百分比;若传入范围(如 -c 20-50 -r fixed),会打印警告并取范围下界(低值)继续运行,与 lookbusy 行为一致。curve 模式才使用完整 MIN-MAX 范围。
  • curve 模式下反馈修正在目标值变化时不会被重置,能自然地跟随曲线波动;开环模式下目标值变化时完整重算忙/睡比例。
  • 反馈模式下,系统 CPU 已高于目标值时 yw-busy 几乎不产生额外占用,这是正确行为而非 bug。
  • 负载收敛需要几个 100ms 窗口;瞬时利用率可能存在 ±5-10% 的系统级误差。
  • 磁盘 IO 负载(-d/-b/-D/-f明确不支持:命中会返回明确错误并退出,需要磁盘压测请使用其他工具。

许可证

MIT License

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇