最近在调 9950x 台式机的主板风扇策略时发现一个反直觉的现象,这款 cpu 用全核心跑 Cinebench R23 时的温度要比用更少的核心跑的时候还明显要低,比如我不开 pbo ,用默认 200W 的功耗墙,全核心跑 r23 时温度最高不超过 90 度,但用 8 到 16 个线程来跑时就会撞到 95 度的温度墙,观察发现是因为用更少的核心跑时频率更高才导致的温度更高。
我这台机是作为 linux 服务器使用的,会跑一些对单核心性能要求不高,但是需要一定的多核心性能的程序,我希望跑这部分程序时 CPU 的频率最高不要超过全核心跑 r23 时的 4.7ghz 的频率,但是除了这部分程序外,其他程序还是可以跑到最高的性能,有办法实现吗?
1
GeekGao 16 天前
# 安装 cpulimit
sudo apt-get install cpulimit # 对特定进程限制 CPU 使用率 cpulimit -p [PID] -l [percentage] |
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 的合并窗口。这一系列补丁主要是调度让单核心的任务跑在体质最好的核心上的。 |
4
debuggeeker 16 天前
90°是不是散热器不行
|
5
nevin47 16 天前
如果 CPU 有对应的接口,那理论上可以,但是 kernel 的 schedule 里面没有这么复杂的功能
cgroup 可以限制核心数量,但是没有给每个核限频 |
7
aloxaf 16 天前
可以把程序固定到某些核心上,然后限制这些核心的最高频率
|
8
lrh3321 16 天前
先配置 CPU 隔离,其他进程就不会使用隔离的 CPU 了,然后配置频率,之后把进程 pin 到隔离出的核心上。
|
10
rrfeng 16 天前
手动调频?
|
11
tool2dx 16 天前 via Android
bios 有设置的吧,某些机器我都是降频使用,要不然暴力风扇吵起来脑袋疼。
|
12
nevin47 16 天前
和 GPT 交流了一下,给了个方案看起来靠谱
1. 新建一个 cgroup ,只放你需要监控的程序 2. eBPF 截获 sched_switch 事件,当调度到你的 cgroup 的时候,调整 CPU_FREQ 配置 这样可以达成一个不需要重新编译内核,但是又可以调整 CPU 主频的目的。目测是可以的 |
13
luoyide2010 16 天前
感觉可以写个脚本,判断到特定程序运行并且 CPU 占用率高于多少/或者温度大于多少度,就使用 cpupower 之类工具降低 CPU 频率。
|
14
zhangxudong 16 天前
感觉可以直接在 bios 设置定压定频或者降压定频来实现你的需求
|
15
wniming OP @debuggeeker 温度偏高是因为我把风扇转速限制的比较低。
@aloxaf 这样的话需要单核心性能的程序如果被调度到限制了频率的核心上就会有影响。 @lrh3321 这样的话貌似需要吃满多核心性能的程序就无法使用隔离的 cpu 。 @GeekGao 好像是这样,我感觉我只能把那些性能不敏感的程序放到其他频率比较低的机器上跑了,然后 9950x 这台机就只跑哪些需要比较高性能的程序。 @zhangxudong 这样的话需要比较强单核心性能的程序就受影响了 |
16
wniming OP @aloxaf 如果 linux 能设置核心的优先级的话,让这些被限制了频率的核心只有在其他核心都有负载的情况下才被使用,除了绑定在这些核心上运行的程序,这样的话也能实现我的需求,但是 linux 好像只能设置进程的优先级,不能设置核心的优先级。
|
17
foool 16 天前
这个要软硬件共同作用,BIOS 使能 turbo boost ,软件调整对应 CPU governer 为 performance 一般就可以了。
CPU 单个 CPU 能跑到睿频最大值,但多个 CPU 就不一定了,具体要看手册。 |
18
LanhuaMa 16 天前
@wniming #2
> 我希望跑这部分程序时 CPU 的频率最高不要超过全核心跑 r23 时的 4.7ghz 的频率 一个思路是你可以写一个 PID 控制程序,监控 CPU 的频率然后调用 cpulimit 去限制程序的 CPU 使用率。 |
19
zhangxudong 15 天前
@wniming #15 降压定频可以用较小的电压设置到你 cpu 可以跑到最大的频率,还能降低温度
|
20
debuggeeker 15 天前
@wniming 人家是一个大力士,可以搞 1000 斤,你非要人家稳稳的搞 500 斤,还不给人家散热。就算是 100°人家也顶得住,如果买回来,发挥不出它的价值,你还不如买一个便宜点 u ,便宜风扇,主板。风扇这个东西用几年换一个就行,还担心他转的快会坏掉是吧。
|