有没有临时限制CPU最高运行频率的办法?

起因是最近跑一个老游戏《彩虹六号:雷霆战将》,其实游戏运行还正常,但他的资料片《黑色通缉令》有个已知的在现代硬件上的问题,我的7700X处理器频率对于游戏来说太高导致游戏内的行动非常快速完全无法游玩

像限制逻辑核心数之类的倒是知道WINE有 WINE_CPU_TOPOLOGY这种环境变量或者taskset这种简单的工具,但限制频率这个就不太了解了

看了看ArchWiki试了试cpupower但提示

sudo cpupower frequency-set -f 3.5Ghz                                               
设置CPU:0                                      
设置新值时出错。 常见错误:        
- 您有适当的管理权吗? (超级用户?)                                                            
- 您请求的调控器是否可用并已进行 modprobed?
- 尝试设置无效的策略?
- 尝试设置特定频率,但用户空间调控器不可用,
    例如由于硬件无法设置为特定频率
    或者因为用户空间调控器未加载?

遂放弃(x,然后因为我的电源管理是用的tuned,本来打算看看能不能新建限制CPU频率的配置,但居然找到不到类似的文档参考,而且省电模式配置最高4.5GHz最低3GHz也还是太高了

用了 amd_pstate_epp的话,频率如何调节就完全交给硬件自己了。你可以试试添加amd_pstate=passive内核参数试试,还不行的话就不用amd_pstate了。

另外你可以试试限制它的CPU使用率到100%以下,这样当时间片足够小的时候就跟CPU降频了差不多(PWM)。

我试试看设置cpu使用率,不知道是不是flatpak的问题用nice或者cpulimit启动lutris跑游戏的时候只影响到了lutris,我得再继续试试了

用cgroup吧,直接去/sys/fs/cgroup下找对应的cpu.weight往里面写数值就行。

更改了lutris的cgroup里的cpu.maxcpu.weight到最低,在只有单核5%使用率下居然还是不正常...感觉可能这个游戏的引擎某些逻辑和CPU频率判定绑在一起了,在另一台老电脑上运行在2.5GHz时正常,看来得弄弄看amd_pstate或者干脆拿86box跑了(x

真奇怪,cpupower frequency-set -f命令会失败,但用cpupower frequency-set -ucpupower frequency-set -d调整最高最低频率可以调整

虽然把最高最低频率调整到1GHz以下游戏菜单中会动的部分还是抽风,但加载进入游戏内速度正常了,只是鼠标移动视角会抽风,虽然调整到更高的CPU频率能解决但又会出现游戏速度过快的情况。很纳闷为什么另一台笔记本电脑的四代i7反而能正常运行,无论如何看起来游戏本身的问题还是太严重了

Update

另一款游戏:彼得杰克逊电影《金刚》官方游戏也有同样的问题。在频率较高的处理器运行会让游戏速度非常快。不过最近看 WidescreenFixesPack 涉及到《金刚》的问题报告已经解决了这个问题, [King Kong Gamer's Edition] Game speed Too Fast. Doesn't match Vsync or Rtss

估计《彩虹六号:黑色通缉令》也和《金刚》的情况类似,游戏的某些逻辑和CPU 时钟频率绑定,调用的函数在更高的CPU时钟频率下会产生数值溢出之类的问题。这个ASI Loader通过hook游戏调用的函数来解决《金刚》的问题。不过可惜GE-Proton 10-34上用这个补丁后游戏启动不了,不知道是不是Wine的相关函数实现的问题唉。WidescreenFixesPack提供有源码不过可惜自己没有技术力

至于调整CPU时钟频率,通过软件(像之前用的cpupower)降低频率看起来对游戏没有效果,不过BIOS设置降低CPU倍频可以。我的AM5主板TUF GAMING B650M-PLUS WIFI重炮手可以在高级模式 - > Ai Tweaker -> CPU Core RatioAuto改为CPU Core Ratio,倍频设置为40能让游戏正常运行

另一个《彩虹六号》2代和资料片里在wined3d和dgvoodoo2下游戏光标抖动问题在使用d7vk下能解决。但d7vk下的游戏UI会有渲染问题

linux不是原生帶cpu頻率調節嗎,這個也是臨時修改的,重啓會變回正常模式
sudo -i
cat /sys/devices/system/cpu/cpufreq/policy1234(幾個policy,看你自己電腦,一個policy控制幾個CPU)/scaling_available_frequencies 列出可用頻率
echo "userspace(自己調節)或powersave(鎖定最低頻率)" > /sys/devices/system/cpu/cpufreq/policy1234/scaling_governor
echo "頻率(僅userspace可用)" > /sys/devices/system/cpu/cpufreq/policy1234/scaling_setspeed
內核只接受acpi表廠商給定的值,不會讓你用隨便一個數字的
你 cpupower報錯就是沒設置userspace,以及沒考慮只有特定頻率被支持

试了试ls /sys/devices/system/cpu/cpufreq/policy15/ | grep scaling只有

scaling_available_governors
scaling_cur_freq
scaling_driver
scaling_governor
scaling_max_freq
scaling_min_freq
scaling_setspeed

scaling_available_frequencies,真奇怪,我另一台四代i7的老笔记本也是这样

cat 了/sys/devices/system/cpu/cpufreq/policy0/scaling_available_governors,發現沒userspace
好吧,問了ai.要先關閉pstate
echo passive > /sys/devices/system/cpu/amd_pstate(intel_pstate)/status
我這裏測試可以設置 userspace了

感覺是intel和amd的pstate驅動影響了
我測試了我的rk3528開發板,能直接調節頻率

sudo echo passive > /sys/devices/system/cpu/amd_pstate/status后提示

zsh: 权限不够: /sys/devices/system/cpu/amd_pstate/status

不过在grub加入内核参数amd_pstate=passive重启电脑可以

cat /sys/devices/system/cpu/amd_pstate/status
passive

只是这样子做了ls /sys/devices/system/cpu/cpufreq/policy15/ | grep scaling后也还是

scaling_available_governors
scaling_cur_freq
scaling_driver
scaling_governor
scaling_max_freq
scaling_min_freq
scaling_setspeed

没有scaling_available_frequencies

不过关掉amd_pstate后cpupower frequency-set -f不报错了,只是这样降频后游戏还是一样的问题,真不知道那些游戏制作时写代码写了什么鬼...

算了(结果感觉弄得更麻烦了)

冷知識:sudo就提權一次,也就是 echo passive是以root執行的, > /sys/devices/system/cpu/amd_pstate/status不會以root執行 ,所以報錯:broken_heart:

生草,大意了,sudo bash -c "echo passive > /sys/devices/system/cpu/amd_pstate/status"行了,没想到这个还可以即时改动