V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
wniming
V2EX  ›  Linux

Linux 可以限制特定进程可以跑到的最大 cpu 频率吗?

  •  
  •   wniming · 16 天前 · 1688 次点击

    最近在调 9950x 台式机的主板风扇策略时发现一个反直觉的现象,这款 cpu 用全核心跑 Cinebench R23 时的温度要比用更少的核心跑的时候还明显要低,比如我不开 pbo ,用默认 200W 的功耗墙,全核心跑 r23 时温度最高不超过 90 度,但用 8 到 16 个线程来跑时就会撞到 95 度的温度墙,观察发现是因为用更少的核心跑时频率更高才导致的温度更高。

    我这台机是作为 linux 服务器使用的,会跑一些对单核心性能要求不高,但是需要一定的多核心性能的程序,我希望跑这部分程序时 CPU 的频率最高不要超过全核心跑 r23 时的 4.7ghz 的频率,但是除了这部分程序外,其他程序还是可以跑到最高的性能,有办法实现吗?

    20 条回复    2024-12-11 09:28:46 +08:00
    GeekGao
        1
    GeekGao  
       16 天前
    # 安装 cpulimit
    sudo apt-get install cpulimit

    # 对特定进程限制 CPU 使用率
    cpulimit -p [PID] -l [percentage]
    wniming
        2
    wniming  
    OP
       16 天前
    @GeekGao 这个限制不了 cpu 的频率,这个只是通过给进程发信号控制运行和暂停来限制使用率
    kuanat
        3
    kuanat  
       16 天前
    9950x 是基本频率 4.3 然后 Boost 最高到 5.7 ,如果你能接受降低到 4.3 ,有个简单的方法是用 amd-pstate 调度,在执行特定任务的时候限制在 4.3 ,执行完之后再切换回来。

    参考 https://docs.kernel.org/admin-guide/pm/amd-pstate.html

    ```
    To manipulate the boost attribute, users can write a value of 0 to disable the boost or 1 to enable it, for the respective CPU using the sysfs path /sys/devices/system/cpu/cpuX/cpufreq/boost, where X represents the CPU number.
    ```

    我不确定是否能限制到 4.7 ,这要看 amd-pstate 是否支持。一个曲线救国的思路是写个假负载的程序然后绑定到 8~16 个核心上,让 cpu 误认为是全核心任务从而降低频率。

    另外现在 amd 的 smp 调度还是有问题的,相关的内核补丁不确定能否赶上 6.12 的合并窗口。这一系列补丁主要是调度让单核心的任务跑在体质最好的核心上的。
    debuggeeker
        4
    debuggeeker  
       16 天前
    90°是不是散热器不行
    nevin47
        5
    nevin47  
       16 天前
    如果 CPU 有对应的接口,那理论上可以,但是 kernel 的 schedule 里面没有这么复杂的功能

    cgroup 可以限制核心数量,但是没有给每个核限频
    aloxaf
        7
    aloxaf  
       16 天前
    可以把程序固定到某些核心上,然后限制这些核心的最高频率
    lrh3321
        8
    lrh3321  
       16 天前
    先配置 CPU 隔离,其他进程就不会使用隔离的 CPU 了,然后配置频率,之后把进程 pin 到隔离出的核心上。
    GeekGao
        9
    GeekGao  
       16 天前
    @wniming 似乎没有精细化到频率的系统 API 和应用层软件。我认为 OS 设计上是不太可能给你这种接口的。
    rrfeng
        10
    rrfeng  
       16 天前
    手动调频?
    tool2dx
        11
    tool2dx  
       16 天前 via Android
    bios 有设置的吧,某些机器我都是降频使用,要不然暴力风扇吵起来脑袋疼。
    nevin47
        12
    nevin47  
       16 天前
    和 GPT 交流了一下,给了个方案看起来靠谱

    1. 新建一个 cgroup ,只放你需要监控的程序
    2. eBPF 截获 sched_switch 事件,当调度到你的 cgroup 的时候,调整 CPU_FREQ 配置

    这样可以达成一个不需要重新编译内核,但是又可以调整 CPU 主频的目的。目测是可以的
    luoyide2010
        13
    luoyide2010  
       16 天前
    感觉可以写个脚本,判断到特定程序运行并且 CPU 占用率高于多少/或者温度大于多少度,就使用 cpupower 之类工具降低 CPU 频率。
    zhangxudong
        14
    zhangxudong  
       16 天前
    感觉可以直接在 bios 设置定压定频或者降压定频来实现你的需求
    wniming
        15
    wniming  
    OP
       16 天前
    @debuggeeker 温度偏高是因为我把风扇转速限制的比较低。
    @aloxaf 这样的话需要单核心性能的程序如果被调度到限制了频率的核心上就会有影响。
    @lrh3321 这样的话貌似需要吃满多核心性能的程序就无法使用隔离的 cpu 。
    @GeekGao 好像是这样,我感觉我只能把那些性能不敏感的程序放到其他频率比较低的机器上跑了,然后 9950x 这台机就只跑哪些需要比较高性能的程序。
    @zhangxudong 这样的话需要比较强单核心性能的程序就受影响了
    wniming
        16
    wniming  
    OP
       16 天前
    @aloxaf 如果 linux 能设置核心的优先级的话,让这些被限制了频率的核心只有在其他核心都有负载的情况下才被使用,除了绑定在这些核心上运行的程序,这样的话也能实现我的需求,但是 linux 好像只能设置进程的优先级,不能设置核心的优先级。
    foool
        17
    foool  
       16 天前
    这个要软硬件共同作用,BIOS 使能 turbo boost ,软件调整对应 CPU governer 为 performance 一般就可以了。
    CPU 单个 CPU 能跑到睿频最大值,但多个 CPU 就不一定了,具体要看手册。
    LanhuaMa
        18
    LanhuaMa  
       16 天前
    @wniming #2
    > 我希望跑这部分程序时 CPU 的频率最高不要超过全核心跑 r23 时的 4.7ghz 的频率

    一个思路是你可以写一个 PID 控制程序,监控 CPU 的频率然后调用 cpulimit 去限制程序的 CPU 使用率。
    zhangxudong
        19
    zhangxudong  
       15 天前
    @wniming #15 降压定频可以用较小的电压设置到你 cpu 可以跑到最大的频率,还能降低温度
    debuggeeker
        20
    debuggeeker  
       15 天前
    @wniming 人家是一个大力士,可以搞 1000 斤,你非要人家稳稳的搞 500 斤,还不给人家散热。就算是 100°人家也顶得住,如果买回来,发挥不出它的价值,你还不如买一个便宜点 u ,便宜风扇,主板。风扇这个东西用几年换一个就行,还担心他转的快会坏掉是吧。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1002 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 21:13 · PVG 05:13 · LAX 13:13 · JFK 16:13
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.