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 模式用单值 50,curve 模式用范围 14-40 |
-n |
--ncpus |
使用的 CPU 核心数,0 表示自动检测(默认) |
-r |
--cpu-mode |
CPU 模式:fixed 或 curve(默认 fixed) |
-p |
--cpu-curve-peak |
曲线峰值在周期内的偏移,如 60、1m(默认 13h,即本地时间下午 1 点) |
-P |
--cpu-curve-period |
曲线周期,如 120、2m(默认 86400,即 1 天) |
-m |
--mem-util |
内存占用大小,如 512M、1G |
-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 口径一致;WindowsGetSystemTimes),动态修正自身忙循环量。 - 当其他进程占用 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