有没控制程序 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,说明问题有点多呀,😁
1
liberty1900 2020-09-13 00:01:33 +08:00 via Android
这个叫 throttle 吧
|
2
billlee 2020-09-13 00:05:13 +08:00
这个项目叫 Linux, 功能叫 cgroup.
|
3
codehz 2020-09-13 00:06:39 +08:00 via Android
Linux 的话,可以试试自带的 cgroup,通过控制 cpu 核心分配,时间片分配来限制最大 cpu 使用量
|
6
vk42 2020-09-13 00:48:12 +08:00
楼上 cgroup 正解,不过 lz 找到的两个”bug“看起来并不是 bug:
ifdef 和 if defined 大多数情况下是等价的,不知道你说的搞混是什么意思 kill 的-1 应该是 signum,1 对应 SIGHUP,也就是挂起进程…… |
7
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). |
8
52coder OP @vk42 #ifdef A|| B 就是错的,ifdef 只能一个条件,if defined 才可以多个条件
kill() -1 的话是群发,man kill 里有 wevsty 里的评论有,可以看下我仓库里倒数第二次提交 |
9
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 限制资源。
|
11
52coder OP @liberty1900 后端实现,你说的这个应该是 js 的,搞不通
|
12
js8510 2020-09-13 11:46:14 +08:00
我突然想到。最简单应急的方法,应该可以用 nice 限制你 process 的 priority. 这样 unix like 都肯定有。 对于 window 应该有类似的东西。 然后启动的时候给你的应用一个 shell script wrapper 应该就可以限制 cpu
|
13
js8510 2020-09-13 11:52:46 +08:00
其实我不是很能理解,如果是 unixlike 的环境。。没有,你为什不能装一下。。写部署脚本的时候把, 没有 cgroup 你就装一下。。内网你就和应用本身一起打包。或许你工作要求比较特殊吧。
|
14
iceheart 2020-09-13 12:12:01 +08:00 via Android
ControlGroup 是内核功能,2.6.24 以上内核开始提供,大概有 12 年历史了。
|