• 请不要在回答技术问题时复制粘贴 AI 生成的内容
52coder
V2EX  ›  程序员

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

  •  
  •   52coder · Sep 12, 2020 · 3000 views
    This topic created in 2112 days ago, the information mentioned may be changed or developed.

    有没控制程序 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,说明问题有点多呀,😁

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