不知道各位有没有那种需要起一个程序占用特定 CPU 和内存的需求,我最近是有。在公司的一个需求自测的时候,需要设置「 CPU 告警阈值」和「内存告警阈值」,然后通过占用 CPU 和内存的方式触发告警。
之前占用 CPU 我都是开一个 Python Console 然后计算 999999999999999 ** 99999999999999999
,虽然能用但非常不优雅:每个 Python 进程只能占用 1 个核心且不能占用 0.5 个核心。内存则是 dd if=/dev/zero of=output_file bs=4k count=xxx
来生成一个固定大小的文件,然后用 Python open('output_file').read()
,同样是又麻烦又不优雅。
所以开发了这个叫 eat
的小工具,可以通过下面的命令占用指定的 CPU 和内存数量
eat -c 4 # 占用 4 个 CPU 核 eat -c 100% # 占用所有 CPU 核 eat -m 4g # 占用 4GB 内存 eat -m 20m # 占用 20MB 内存 eat -m 100% # 占用所有内存 eat -c 2.5 -m 1.5g # 占用 2.5 个 CPU 核和 1.5GB 内存 eat -c 3 -m 200m # 占用 3 个 CPU 核和 200MB 内存 eat -c 100% -m 100% # 占用所有 CPU 核和内存
贴上 GitHub 地址各位有兴趣可以试一下~
![]() | 1 adrianzhang 2024-07-04 09:46:36 +08:00 压力测试嘛,属于大类应用,不愚蠢。 |
![]() | 2 luzemin 2024-07-04 09:47:27 +08:00 "If it's stupid but it works, it's not stupid" |
![]() | 3 privil 2024-07-04 09:50:13 +08:00 有个 lookbusy 的程序和你这个差不多。不过造轮子也不嫌弃多。哈哈 |
![]() | 4 dumbass 2024-07-04 09:50:47 +08:00 |
![]() | 5 v1 2024-07-04 09:51:30 +08:00 ![]() 这就把你的代码合并到甲方的项目里,md |
![]() | 6 zhwguest 2024-07-04 09:52:15 +08:00 大名鼎鼎的 pi.... |
8 hhacker 2024-07-04 09:52:50 +08:00 我觉得这个很好啊, 哪里愚蠢了, 就是标题有点愚蠢 |
![]() | 10 shawnbluce OP 不是说真的愚蠢啦,就是开个小玩笑~ |
11 Mithril 2024-07-04 09:55:45 +08:00 ![]() 你这内存占用功能可以搞个线程随机读写,保证它不被交换出去。 |
![]() | 12 shawnbluce OP ![]() @kk2syc #5 然后每次优化就少用 0.5 CPU 和 500M 内存对吧,每年做两次性能优化,每次都有新感觉~ |
![]() | 13 shawnbluce OP @Mithril 有道理,后面我试着改一下 |
![]() | 14 v1 2024-07-04 09:59:04 +08:00 |
![]() | 15 Foralrec 2024-07-04 10:01:04 +08:00 ![]() 可以看下 stress-ng |
16 Mithril 2024-07-04 10:04:07 +08:00 @shawnbluce 改完以后你再把进程优先级改为实时,然后一条 eat -c 100% -m 100%直接把系统搞死:) |
![]() | 17 sayitagain 2024-07-04 10:06:40 +08:00 |
![]() | 18 cominghome 2024-07-04 10:09:29 +08:00 ![]() 笑死,回想刚工作的时候公司做资源盘点,要回收使用率低的物理服务器,领导安排写了个随机读写程序开多线程,成功把 10%不到的平均使用率跑到了 70%+ |
![]() | 19 choury 2024-07-04 10:14:50 +08:00 为啥不用各发型版都自带的 stress-ng 呢,功能还更多 |
20 hercat 2024-07-04 10:24:02 +08:00 前段时间也有类似的需求,不过我用的是 polinux/stress ,已点 star 。 |
![]() | 21 shawnbluce OP ![]() |
22 MirageTurtle 2024-07-04 10:32:56 +08:00 ![]() @shawnbluce 真的很喜欢 op 这种针对于自己需求搞的小工具,感觉我也很想这样干,但大多数时候都会因为所谓的没有时间(也不知道是真没时间还是给自己找的借口)不去搞,偶尔搞的小工具也不会去认真维护(可能不是刚需,随着时间就不在用了)。 不管怎么样,希望 op 能坚持下去,也能维护下去,也希望自己执行力能变得更强。 |
![]() | 23 vczyh 2024-07-04 10:48:59 +08:00 用不用再说,先 star 再学习。 |
24 renmu 2024-07-04 10:54:29 +08:00 via Android 虽然我的服务器在吃灰,但我也要跑满 |
![]() | 25 Foralrec 2024-07-04 11:15:19 +08:00 ![]() 以前做过不少施压 payload ,OP 的这类工具 最后会发展几个方向 - 绑核,一对超线程内分离,numa 亲和 - 施压策略,脉冲 正弦等 - pagecache mmap 清理与透明度 |
![]() | 26 Garphy 2024-07-04 11:20:39 +08:00 不错 |
![]() | 27 NakeSnail 2024-07-04 11:21:54 +08:00 ![]() 别的不说,楼主这个命令的名字取得不错 |
![]() | 28 lancelock 2024-07-04 11:35:44 +08:00 eat -c 100% 如果我输入的不是 100%会咋样 比如 87.3% 不如设计成-a 代表 all |
![]() | 29 derdct 2024-07-04 11:38:03 +08:00 甲骨文保活倒是有用这些玩意的 |
30 isnullstring 2024-07-04 11:49:44 +08:00 @kk2syc #5 看来没少受 甲方折腾,哈哈哈 |
31 isnullstring 2024-07-04 11:52:01 +08:00 我也写过类似,有个奇葩 BUG 只有在低端 CPU (双核) 且使用率接近 90%时候才特别容易触发 |
32 surrenal 2024-07-04 12:20:37 +08:00 刚好有需要,等遇到下个需求场景的时候用用 |
![]() | 33 passive 2024-07-04 12:31:07 +08:00 via Android ![]() 可以在任务管理器里画画(上个世纪就有这样的画画 app ) |
34 mark2025 2024-07-04 13:33:07 +08:00 记得有个网友写了个回滚程序的程序,一测试,程序不见了~ |
35 NoDataNoBB 2024-07-04 13:36:16 +08:00 好像有个命令可以实现类似的,cpulimit 。顺便问问有没有可以指定网卡的,interface -d wlan0 xxxx ,这样 xxx 命令就可以使用 wlan0 来联网。 |
![]() | 36 shawnbluce OP @MirageTurtle 谢谢~ |
![]() | 37 shawnbluce OP @lancelock -a 这种实现我觉得不太好,倒是可以加上对 87.3% 这种的支持 |
![]() | 38 shawnbluce OP @Foralrec #25 我回头参考一下,可以做的稍微完善一点,谢谢~ |
39 Ackvincent 2024-07-04 14:26:38 +08:00 好评 |
40 xycost233 2024-07-04 14:44:58 +08:00 hhhh 我之前也用 go 写过一个类似的小程序,通过计算圆周率和反复内存赋值来消耗 cpu 和内存 |
![]() | 41 lipd 2024-07-04 15:09:31 +08:00 @cominghome 我怀疑咱俩是同事 |
![]() | 42 bzw875 2024-07-04 15:20:34 +08:00 加需求 吃掉磁盘空间 吃掉 GPU 吃掉带宽 |
43 WeweHave 2024-07-04 15:24:39 +08:00 同意,加一个百分比控制最好了 |
![]() | 44 shiyuu 2024-07-04 17:04:23 +08:00 ![]() |
![]() | 45 lucasj 2024-07-04 17:19:46 +08:00 请问这行代码是什么意思 _ = 1 + 1 |
![]() | 46 IMengXin 2024-07-04 17:22:30 +08:00 政府申请服务器,因为高峰期配置不够申请的高配置,然后他们要求全天占用都需要在 50%以上,包括晚上.... |
![]() | 47 rick13 2024-07-04 18:21:08 +08:00 之前做性能测试,但测试实在太离谱,顶多占用不到 10%的 cpu ,但测试要求需要占用到 50%以上,当时就写了个 while 。。。 |
48 aeof 2024-07-04 19:34:09 +08:00 ![]() 这是正经的需求,叫做混沌测试,阿里有开源一个 https://github.com/chaosblade-io/chaosblade 。类似的需求还有弱网、丢包等,感兴趣可以试试 |
![]() | 49 ktyang 2024-07-04 23:30:48 +08:00 啊 为啥我第一反应是画正弦曲线 |
![]() | 50 jqtmviyu 2024-07-05 00:19:17 +08:00 arm64 好像用不了(骁龙 625) ./eat_linux_arm64 -c 2 -m 200m zsh: segmentation fault ./eat_linux_arm64 -c 2 -m 200m 搜了下发现已经有轮子了 stress stress --cpu 4 --vm 1 --vm-bytes 1G --timeout 60 |
51 lolo1 2024-07-05 00:19:55 +08:00 via Android 貌似有个 lookbusy |
![]() | 52 shawnbluce OP @jqtmviyu get 回头找一台 arm 的机器来试试 |
53 gerorim 2024-07-05 15:41:49 +08:00 ![]() @shawnbluce -c 指定 CPU 百分比时,radio 从 float 直接转 int 会损失精度,导致 idle / busy 时段计算错误,进而影响 CPU 占用量。 另外,比较常见的需求时,比如我要压测 30 分钟,有个时限参数就能派上用场。 综上,提需求不如上手改,给楼主提了个改进 PR https://github.com/shawn-bluce/eat/pull/2 。 |