停止特定进程加热系统 CPU

停止特定进程加热系统 CPU

我有一个进程一直在做一些计算。它会导致我的系统 CPU 升温并且风扇旋转得更快。

我希望该进程运行,但优先级较低。我不希望我的系统变热并且风扇因此而旋转。有可能实现这一目标吗?

如果重要的话,我的 CPU 是 AMD Ryzen 5 3500U,进程是一个浏览器选项卡(我在 Chromium 中运行它,但如果有帮助,我很乐意更改浏览器)。如果有帮助的话,我什至愿意在虚拟机中运行整个浏览器。


我尝试了什么以及失败的原因:

  1. 目前找到的最佳解决方案是限制最大 CPU 频率:

    echo 0 > /sys/devices/system/cpu/cpufreq/boost
    cpupower frequency-set -u 1200MHz
    

    它有效,但这意味着其他进程也会受到影响:编译、(解)压缩等需要更长的时间。
    此外,与进程未运行时相比,CPU 的温度仍然较高。尽管达到可接受的温度。

  2. CPU限制削弱目标进程的性能。
    如果我将允许的 CPU 百分比设置为 50% ( cpulimit -l 50 -p ...),计算速度会比正常情况慢很多(比如慢 10 倍;我没有一个好的方法来测量准确的减速情况)。

  3. 我用 cgroups 玩了一下,但没有得到任何效果。

  4. 尼斯当然没有任何影响。

还有什么我应该尝试的吗?

答案1

我发现一些调控器(按需和保守)支持在选择扩大或缩小规模时忽略具有正nice值的进程的标志。

来自kernel.org CPUFreq 调控器文档:

忽略nice_load:

该参数的值为“0”或“1”。当设置为“0”(默认值)时,所有进程都计入“CPU 利用率”值。当设置为“1”时,以“nice”值运行的进程将不会计入总体使用情况计算中(因此会被忽略)。如果您在笔记本电脑上运行 CPU 密集型计算,并且您不关心需要多长时间才能完成,那么这非常有用,因为您可以对其进行“优化”并阻止它参与是否增加 CPU 频率的决策过程。

我加载了 ondemand 调控器,启用了它的ignore_nice_load标志,并为低优先级始终计算进程设置了一个很好的值:

# load and enable the ondemand governor
sudo modprobe cpufreq_ondemand
sudo cpupower frequency-set -g ondemand

# enable ignore_nice_load
echo 1 | sudo tee /sys/devices/system/cpu/cpufreq/ondemand/ignore_nice_load

# set a nice value to the target process
renice -n 19 -p PID

现在,尽管计算进程始终占用 100% 的核心,但我的所有核心始终保持凉爽(风扇很安静)。每当其他东西需要大量计算能力时,它们就会立即扩大规模。

答案2

Linux 允许设置每个 CPU 核心的最大频率,所以如果我是你,我会执行以下操作:

echo 2100000 | sudo tee /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq`

(其他可能的值为 1700000 和 1400000)

然后将此 CPU 密集型任务固定到第一个核心(在 Unix 下通常称为“设置 CPU 关联性”):

sudo taskset -cp 0 $PID

相关内容