我写了一个堪称愚蠢的小工具 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
shawnbluce
V2EX    程序员

我写了一个堪称愚蠢的小工具

  shawnbluce
shawn-bluce 2024 年 7 月 4 日 10223 次点击
这是一个创建于 597 天前的主题,其中的信息可能已经有所发展或是发生改变。

不知道各位有没有那种需要起一个程序占用特定 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 地址各位有兴趣可以试一下~

53 条回复    2024-07-05 15:41:49 +08:00
adrianzhang
    1
adrianzhang  
   2024 年 7 月 4 日
压力测试嘛,属于大类应用,不愚蠢。
luzemin
    2
luzemin  
   2024 年 7 月 4 日
"If it's stupid but it works, it's not stupid"
privil
    3
privil  
   2024 年 7 月 4 日
有个 lookbusy 的程序和你这个差不多。不过造轮子也不嫌弃多。哈哈
dumbass
    4
dumbass  
   2024 年 7 月 4 日
v1
    5
v1  
   2024 年 7 月 4 日   36
这就把你的代码合并到甲方的项目里,md
zhwguest
    6
zhwguest  
   2024 年 7 月 4 日
大名鼎鼎的 pi....
hlhshsh
    7
hlhshsh  
   2024 年 7 月 4 日
@kk2syc 这是高手
hhacker
    8
hhacker  
   2024 年 7 月 4 日
我觉得这个很好啊, 哪里愚蠢了, 就是标题有点愚蠢
v1
    9
v1  
   2024 年 7 月 4 日
@hlhshsh 糊口饭吃 /抱拳
shawnbluce
    10
shawnbluce  
OP
   2024 年 7 月 4 日
不是说真的愚蠢啦,就是开个小玩笑~
Mithril
    11
Mithril  
   2024 年 7 月 4 日   1
你这内存占用功能可以搞个线程随机读写,保证它不被交换出去。
shawnbluce
    12
shawnbluce  
OP
   2024 年 7 月 4 日   1
@kk2syc #5 然后每次优化就少用 0.5 CPU 和 500M 内存对吧,每年做两次性能优化,每次都有新感觉~
shawnbluce
    13
shawnbluce  
OP
   2024 年 7 月 4 日
@Mithril 有道理,后面我试着改一下
v1
    14
v1  
   2024 年 7 月 4 日
@shawnbluce 没办法,甲方开始拖欠尾款了,需求还一直增加。

老板:我想让马儿跑又不想喂草怎么办呢?
Foralrec
    15
Foralrec  
   2024 年 7 月 4 日   1
可以看下 stress-ng
Mithril
    16
Mithril  
   2024 年 7 月 4 日
@shawnbluce 改完以后你再把进程优先级改为实时,然后一条 eat -c 100% -m 100%直接把系统搞死:)
sayitagain
    17
sayitagain  
   2024 年 7 月 4 日
能解决实际应用问题的,管你怎么实现,都不愚蠢。
cominghome
    18
cominghome  
   2024 年 7 月 4 日   2
笑死,回想刚工作的时候公司做资源盘点,要回收使用率低的物理服务器,领导安排写了个随机读写程序开多线程,成功把 10%不到的平均使用率跑到了 70%+
choury
    19
choury  
   2024 年 7 月 4 日
为啥不用各发型版都自带的 stress-ng 呢,功能还更多
hercat
    20
hercat  
   2024 年 7 月 4 日
前段时间也有类似的需求,不过我用的是 polinux/stress ,已点 star 。
shawnbluce
    21
shawnbluce  
OP
   2024 年 7 月 4 日   1
@Foralrec
@choury
之前确实不了解 stress-ng 这个工具,我刚刚看了一下,还是有一点区别。

- 我这个工具用起来更简单 `eat -c 2.5` 就可以直接吃掉 2.5 核,但是 stress-ng 还需要自己算一下
- 我这个工具更轻,单个二进制程序随丢随用,随用随删

毕竟我这个就是专门针对我自己需求搞的,跟这种专业的工具肯定是没法比的~
MirageTurtle
    22
MirageTurtle  
   2024 年 7 月 4 日   1
@shawnbluce

真的很喜欢 op 这种针对于自己需求搞的小工具,感觉我也很想这样干,但大多数时候都会因为所谓的没有时间(也不知道是真没时间还是给自己找的借口)不去搞,偶尔搞的小工具也不会去认真维护(可能不是刚需,随着时间就不在用了)。

不管怎么样,希望 op 能坚持下去,也能维护下去,也希望自己执行力能变得更强。
vczyh
    23
vczyh  
   2024 年 7 月 4 日
用不用再说,先 star 再学习。
renmu
    24
renmu  
   2024 年 7 月 4 日 via Android
虽然我的服务器在吃灰,但我也要跑满
Foralrec
    25
Foralrec  
   2024 年 7 月 4 日   1
以前做过不少施压 payload ,OP 的这类工具 最后会发展几个方向
- 绑核,一对超线程内分离,numa 亲和
- 施压策略,脉冲 正弦等
- pagecache mmap 清理与透明度
Garphy
    26
Garphy  
   2024 年 7 月 4 日
不错
NakeSnail
    27
NakeSnail  
   2024 年 7 月 4 日   1
别的不说,楼主这个命令的名字取得不错
lancelock
    28
lancelock  
   2024 年 7 月 4 日
eat -c 100% 如果我输入的不是 100%会咋样 比如 87.3% 不如设计成-a 代表 all
derdct
    29
derdct  
   2024 年 7 月 4 日
甲骨文保活倒是有用这些玩意的
isnullstring
    30
isnullstring  
   2024 年 7 月 4 日
@kk2syc #5 看来没少受 甲方折腾,哈哈哈
isnullstring
    31
isnullstring  
   2024 年 7 月 4 日
我也写过类似,有个奇葩 BUG 只有在低端 CPU (双核) 且使用率接近 90%时候才特别容易触发
surrenal
    32
surrenal  
   2024 年 7 月 4 日
刚好有需要,等遇到下个需求场景的时候用用
passive
    33
passive  
   2024 年 7 月 4 日 via Android   1
可以在任务管理器里画画(上个世纪就有这样的画画 app )
mark2025
    34
mark2025  
   2024 年 7 月 4 日
记得有个网友写了个回滚程序的程序,一测试,程序不见了~
NoDataNoBB
    35
NoDataNoBB  
   2024 年 7 月 4 日
好像有个命令可以实现类似的,cpulimit 。顺便问问有没有可以指定网卡的,interface -d wlan0 xxxx ,这样 xxx 命令就可以使用 wlan0 来联网。
shawnbluce
    36
shawnbluce  
OP
   2024 年 7 月 4 日
@MirageTurtle 谢谢~
shawnbluce
    37
shawnbluce  
OP
   2024 年 7 月 4 日
@lancelock -a 这种实现我觉得不太好,倒是可以加上对 87.3% 这种的支持
shawnbluce
    38
shawnbluce  
OP
   2024 年 7 月 4 日
@Foralrec #25 我回头参考一下,可以做的稍微完善一点,谢谢~
Ackvincent
    39
Ackvincent  
   2024 年 7 月 4 日
好评
xycost233
    40
xycost233  
   2024 年 7 月 4 日
hhhh 我之前也用 go 写过一个类似的小程序,通过计算圆周率和反复内存赋值来消耗 cpu 和内存
lipd
    41
lipd  
   2024 年 7 月 4 日
@cominghome 我怀疑咱俩是同事
bzw875
    42
bzw875  
   2024 年 7 月 4 日
加需求
吃掉磁盘空间
吃掉 GPU
吃掉带宽
WeweHave
    43
WeweHave  
   2024 年 7 月 4 日
同意,加一个百分比控制最好了
shiyuu
    44
shiyuu  
   2024 年 7 月 4 日   1
百度有一个 100Gbps 的网络性能与压力测试软件

https://github.com/baidu/dperf/blob/main/README-CN.md
lucasj
    45
lucasj  
   2024 年 7 月 4 日
请问这行代码是什么意思

_ = 1 + 1
IMengXin
    46
IMengXin  
   2024 年 7 月 4 日
政府申请服务器,因为高峰期配置不够申请的高配置,然后他们要求全天占用都需要在 50%以上,包括晚上....
rick13
    47
rick13  
   2024 年 7 月 4 日
之前做性能测试,但测试实在太离谱,顶多占用不到 10%的 cpu ,但测试要求需要占用到 50%以上,当时就写了个 while 。。。
aeof
    48
aeof  
   2024 年 7 月 4 日   1
这是正经的需求,叫做混沌测试,阿里有开源一个 https://github.com/chaosblade-io/chaosblade 。类似的需求还有弱网、丢包等,感兴趣可以试试
ktyang
    49
ktyang  
   2024 年 7 月 4 日
啊 为啥我第一反应是画正弦曲线
jqtmviyu
    50
jqtmviyu  
   2024 年 7 月 5 日
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
lolo1
    51
lolo1  
   2024 年 7 月 5 日 via Android
貌似有个 lookbusy
shawnbluce
    52
shawnbluce  
OP
   2024 年 7 月 5 日
@jqtmviyu get 回头找一台 arm 的机器来试试
gerorim
    53
gerorim  
   2024 年 7 月 5 日   1
@shawnbluce
-c 指定 CPU 百分比时,radio 从 float 直接转 int 会损失精度,导致 idle / busy 时段计算错误,进而影响 CPU 占用量。
另外,比较常见的需求时,比如我要压测 30 分钟,有个时限参数就能派上用场。

综上,提需求不如上手改,给楼主提了个改进 PR https://github.com/shawn-bluce/eat/pull/2
关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1817 人在线   最高记录 6679       Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 98ms UTC 05:18 PVG 13:18 LAX 21:18 JFK 00:18
Do have faith in what you're doing.
ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86