V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
52coder
V2EX  ›  程序员

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

  •  
  •   52coder · 2020-09-12 23:49:04 +08:00 · 2525 次点击
    这是一个创建于 1537 天前的主题,其中的信息可能已经有所发展或是发生改变。

    有没控制程序 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 条附言  ·  2020-09-13 10:12:20 +08:00
    cgroup 是个不错的选择,问题是不是所有系统都自带这个软件,发布的软件如果用户环境上没有安装的话(大部分客户环境部署在内网)……,现在产品没有提供 iso 或者 ova 部署,也没有 docker 运行环境,一时间又陷入僵局了呀。
    15 条回复    2020-09-13 20:17:50 +08:00
    liberty1900
        1
    liberty1900  
       2020-09-13 00:01:33 +08:00 via Android
    这个叫 throttle 吧
    billlee
        2
    billlee  
       2020-09-13 00:05:13 +08:00
    这个项目叫 Linux, 功能叫 cgroup.
    codehz
        3
    codehz  
       2020-09-13 00:06:39 +08:00 via Android
    Linux 的话,可以试试自带的 cgroup,通过控制 cpu 核心分配,时间片分配来限制最大 cpu 使用量
    52coder
        4
    52coder  
    OP
       2020-09-13 00:13:19 +08:00
    @billlee 多谢大佬,献丑了,我搜了下,cgroup 正是我要的。
    52coder
        5
    52coder  
    OP
       2020-09-13 00:14:38 +08:00
    @codehz 感谢推荐,我研究下。
    vk42
        6
    vk42  
       2020-09-13 00:48:12 +08:00
    楼上 cgroup 正解,不过 lz 找到的两个”bug“看起来并不是 bug:
    ifdef 和 if defined 大多数情况下是等价的,不知道你说的搞混是什么意思
    kill 的-1 应该是 signum,1 对应 SIGHUP,也就是挂起进程……
    wevsty
        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).
    52coder
        8
    52coder  
    OP
       2020-09-13 10:09:36 +08:00
    @vk42 #ifdef A|| B 就是错的,ifdef 只能一个条件,if defined 才可以多个条件
    kill() -1 的话是群发,man kill 里有 wevsty 里的评论有,可以看下我仓库里倒数第二次提交
    js8510
        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 限制资源。
    52coder
        10
    52coder  
    OP
       2020-09-13 11:42:25 +08:00
    @js8510 客户服务器中没有 cgroup 怎么破?
    52coder
        11
    52coder  
    OP
       2020-09-13 11:43:56 +08:00
    @liberty1900 后端实现,你说的这个应该是 js 的,搞不通
    js8510
        12
    js8510  
       2020-09-13 11:46:14 +08:00
    我突然想到。最简单应急的方法,应该可以用 nice 限制你 process 的 priority. 这样 unix like 都肯定有。 对于 window 应该有类似的东西。 然后启动的时候给你的应用一个 shell script wrapper 应该就可以限制 cpu
    js8510
        13
    js8510  
       2020-09-13 11:52:46 +08:00
    其实我不是很能理解,如果是 unixlike 的环境。。没有,你为什不能装一下。。写部署脚本的时候把, 没有 cgroup 你就装一下。。内网你就和应用本身一起打包。或许你工作要求比较特殊吧。
    iceheart
        14
    iceheart  
       2020-09-13 12:12:01 +08:00 via Android
    ControlGroup 是内核功能,2.6.24 以上内核开始提供,大概有 12 年历史了。
    52coder
        15
    52coder  
    OP
       2020-09-13 20:17:50 +08:00
    @js8510 我司产品非常另类,支持的系统从 centos5 到 centos8,架构支持 x86-64 aarch64 mips64,如果有源码,交叉编译啥的,基本上不用太费心,如果和应用打一起就非常难受呀
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2682 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 15:48 · PVG 23:48 · LAX 07:48 · JFK 10:48
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.