有没控制程序 cpu 使用的开源项目?

2020-09-12 23:49:04 +08:00
 52coder

有没控制程序 cpu 使用的开源项目?我目前在 github 上就找到一个 7 8 年没维护的项目 cpulimit,大致使用方法: ./cpulimit --limit 30 process_name ./process_name 大概看了下代码,当 cpu 超过后会发送 stop,sleep 一段时间后发送 cont 信号,代码大致搂了一眼,发现两个大 bug.( fork 了个仓库,地址 https://github.com/52coder/cpulimit

一个是 ifdef 和 if defined 搞混了,另一个是 kill 本来是要传递进程号,结果用了-1 ? 想问下大家,有没有更好的选择,最好是 c/c++实现。这个 cpulimit 不敢用呀,我这么菜都能发现 bug,说明问题有点多呀,😁

2439 次点击
所在节点    程序员
15 条回复
liberty1900
2020-09-13 00:01:33 +08:00
这个叫 throttle 吧
billlee
2020-09-13 00:05:13 +08:00
这个项目叫 Linux, 功能叫 cgroup.
codehz
2020-09-13 00:06:39 +08:00
Linux 的话,可以试试自带的 cgroup,通过控制 cpu 核心分配,时间片分配来限制最大 cpu 使用量
52coder
2020-09-13 00:13:19 +08:00
@billlee 多谢大佬,献丑了,我搜了下,cgroup 正是我要的。
52coder
2020-09-13 00:14:38 +08:00
@codehz 感谢推荐,我研究下。
vk42
2020-09-13 00:48:12 +08:00
楼上 cgroup 正解,不过 lz 找到的两个”bug“看起来并不是 bug:
ifdef 和 if defined 大多数情况下是等价的,不知道你说的搞混是什么意思
kill 的-1 应该是 signum,1 对应 SIGHUP,也就是挂起进程……
wevsty
2020-09-13 05:12:47 +08:00
Windows 的话可以通过 job 来限制 CPU 使用,也可以通过限制运行再某一个核心的方式来限制 CPU 。
Linux 的话 cgroup 是正解。

另外,恐怕楼主找到的都不是 bug,反倒是乱改可能改出 bug 了。

@vk42
这里的 kill 不是命令行的 kill 而是指 kill().

pid 为-1 时会给除了 init 以外的所有有权限访问的进程都发送一遍指定的信号。
文档写的很清楚:

If pid equals -1, then sig is sent to every process for which the calling process has permission to send signals, except for process 1 (init).
52coder
2020-09-13 10:09:36 +08:00
@vk42 #ifdef A|| B 就是错的,ifdef 只能一个条件,if defined 才可以多个条件
kill() -1 的话是群发,man kill 里有 wevsty 里的评论有,可以看下我仓库里倒数第二次提交
js8510
2020-09-13 11:40:29 +08:00
假设你部署的程序是一个 service,常见的做法是 cgroup 然后 service 本身实现一些 monitor demon. Cgroup 用来设定上限,比如 cpu, mem, network I/O etc. Monitor demon 用来 monitor queue size, processing etc 然后动态的 export 给 load balancer, elastic capacity managing service etc. 如果是面向用户的前端软件,确实不太清楚常见的做法。docker 或类似的 container 其实多数本质也是通过 cgroup 限制资源。
52coder
2020-09-13 11:42:25 +08:00
@js8510 客户服务器中没有 cgroup 怎么破?
52coder
2020-09-13 11:43:56 +08:00
@liberty1900 后端实现,你说的这个应该是 js 的,搞不通
js8510
2020-09-13 11:46:14 +08:00
我突然想到。最简单应急的方法,应该可以用 nice 限制你 process 的 priority. 这样 unix like 都肯定有。 对于 window 应该有类似的东西。 然后启动的时候给你的应用一个 shell script wrapper 应该就可以限制 cpu
js8510
2020-09-13 11:52:46 +08:00
其实我不是很能理解,如果是 unixlike 的环境。。没有,你为什不能装一下。。写部署脚本的时候把, 没有 cgroup 你就装一下。。内网你就和应用本身一起打包。或许你工作要求比较特殊吧。
iceheart
2020-09-13 12:12:01 +08:00
ControlGroup 是内核功能,2.6.24 以上内核开始提供,大概有 12 年历史了。
52coder
2020-09-13 20:17:50 +08:00
@js8510 我司产品非常另类,支持的系统从 centos5 到 centos8,架构支持 x86-64 aarch64 mips64,如果有源码,交叉编译啥的,基本上不用太费心,如果和应用打一起就非常难受呀

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/706496

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX