降低CPU速度以减少热量

降低CPU速度以减少热量

这是该问题的一个彻底更新的版本。我必须更新它,因为这个问题被标记为该问题的重复,但该问题已不再有有效答案。


  • 该问题的初始版本带有 11.04 标签:

我是脚本和 Linux 的新手,我的电脑有时会过热,我想编写一个脚本来检测 temp1,如果温度超过 65 C,就必须将其置于休眠状态。我在比较脚本中的值时遇到了困难,我无法正确定义数字,有人能解决这个问题吗?这是我迄今为止的尝试

#!/bin/bash

max=65

val=$   sensors | grep '^temp1:' | sed -e 's/.*: \+\([+-][0-9.]\+\)°C.*$/0\1/'

while true; do
    if [[ "$val" > "$max" ]]; then
        sudo /etc/acpi/sleep.sh force
        sleep 1
    else
        sleep 10
    fi
    clear
    sensors
done

以上得到一个答案根据评论,这个脚本在某个时候已更新至 14.04

 #!/bin/bash

 while true; do
    val=$(sensors | awk '/temp1/ {print $2}')
    max="+75.0"
    if [[ "$val" > "$max" ]]; then
        dbus-send --system --print-reply --dest="org.freedesktop.UPower" /org/freedesktop/UPower org.freedesktop.UPower.Suspend
    fi
    sleep 10
    clear
    sensors
 done
 exit 0

正如链接问题所指出的,上述脚本在 16.04 中不起作用。

这个问题一个答案使用简单修改后的脚本版本:

 #!/bin/bash

 while true; do
    val=$(sensors | awk '/temp1/ {print $2}')
    max="+75.0"
    if [[ "$val" > "$max" ]]; then
        systemctl suspend
    fi
    clear
    sensors
 done
 exit 0

但是,虽然它完成了工作(当温度超过 75 时系统会进入睡眠状态),但它消耗的 CPU 电量比预期的要多,并且在运行时将温度推高至 10 摄氏度;这更有用,在不运行时更凉爽!

我不知道问题是否出在最初的 11.04 脚本上或最后的更改上,但这需要针对 16.04 的全新答案。

答案1

我设法制作了自己的剧本。

#!/bin/bash
while true; do
   val=$(sensors | awk '/temp1/ {print $2}')
   max="+75.0"
   if [[ "$val" > "$max" ]]; then
       dbus-send --system --print-reply --dest="org.freedesktop.UPower" /org/freedesktop/UPower org.freedesktop.UPower.Suspend
   fi
   sleep 10
   clear
   sensors
done
exit 0

对于 16.04(也这里):

#!/bin/bash
while true; do
   val=$(sensors | awk '/temp1/ {print $2}')
   max="+75.0"
   if [[ "$val" > "$max" ]]; then
       systemctl suspend
   fi
   sleep 10
   clear
   sensors
done
exit 0

答案2

介绍

为了方便 systemd 切换前和切换后的用户,我编写了一个脚本,它将根据您的操作系统版本号采用适当的暂停方法。本质上,它与 OP 更新的脚本所做的相同,只是它会强制暂停,尽管有带有-i标志的抑制剂。可以对脚本进行多项考虑和改进,但就目前而言,这个版本完成了 90% 的工作。

我在 16.04 LTS 上进行了简单测试,运行良好。将来我可能会用 Python 重写它,因为我可以或者根据用户要求。

脚本源

#!/usr/bin/env bash

suspend_system(){

    os_version=$(awk -F'["=]' '/VERSION_ID/{print substr($3,1,2)}' /etc/os-release)
    if [ $os_version -ge 15   ]
    then
        systemctl suspend -i
        # Alternative way is to call login manager method via dbus
        # qdbus --system org.freedesktop.login1 /org/freedesktop/login1 \
        #       org.freedesktop.login1.Manager.Suspend True 

    else
        dbus-send --system --print-reply --dest="org.freedesktop.UPower"\
                  /org/freedesktop/UPower org.freedesktop.UPower.Suspend
    fi

}

is_critical_temp(){
    local temp=$(sensors | awk '/temp1/ {print substr($2,2,2)}')
    if [ $temp -gt 75  ]
    then
        return 0
    else
        return 1
    fi
}

main(){

    while true
    do
        if is_critical_temp
        then
           # optional dialog if running from GUI, not necessary if running form /etc/rc.local
           #zenity --info --text "Reached critical temperature. Suspending in 10 seconds" &
           sleep 10
           suspend_system
        fi
    sleep 3
    done
}
main "$@"

替代方法

不久前,我pm-suspend在软件包中找到了实用程序pm-utils。无论操作系统版本如何,此程序都可以正常工作。小缺点是它需要 root 访问权限,但很容易解决这一不便。

我个人会做以下事情:

  1. sudo apt-get install pm-utils
  2. sudo visudoyourusername ALL = NOPASSWD: /usr/sbin/pm-suspend在文件末尾添加。
  3. 编辑脚本来调用sudo pm-suspend而不是 dbus 命令。

暂停 Ubuntu 机器的一般方法

您要求答案来自可靠的来源。事实上,Ask Ubuntu 确实有关于从命令行暂停的规范帖子:如何从命令行暂停/休眠?根据您希望脚本拥有的方法和权限级别,有多种方法可以解决此问题。有些方法比其他方法更有效。在我的回答中,我提供了 dbus 和 systemctl 方法,因为它们也适用于屏幕锁定。如果您写入/sys/class/power/state,它不会锁定屏幕,尽管可以使用一些脚本魔法来解决这个问题。目前,我认为更好的方法是简单地确定操作系统版本并选择适当的方法(如我的脚本中所示),或者使用pm-suspend替代方法。

答案3

在我的系统上,每次sensors运行时视频流都会出现卡顿。每 10 秒发生一次这种情况,或者无论建议的脚本运行多少次,都会让我发疯。更好的暂停解决方案是使用英特尔的thermald强力夹钳降低 CPU 速度以减少热量。我在另一个问题中写了这个答案(防止 CPU 过热),为方便起见,我将其复制到此处。

此外,上述脚本依赖于temp1在我的 Ubuntu 16.04 上经常损坏并且只有temp3100% 可靠的脚本不会显示sensors。即:

$ cat /sys/class/thermal/thermal_zone*/temp
27800
29800
58000

来自sensors

acpitz-virtual-0
Adapter: Virtual device
temp1:        +27.8°C  (crit = +106.0°C)
temp2:        +29.8°C  (crit = +106.0°C)

这发生在暂停/恢复之后。真实的温度为 +58.0°C,但在恢复后被错误地报告为 +27.8°C。因此,热保护只会在暂停时起作用一次,直到重新启动后才会再次起作用。因此,系统将达到临界温度 (+106.0°C),此时将执行硬关机,数据可能会损坏。

因此,我推荐的解决方案是防止过热并利用 CPU 减速而不是彻底暂停系统。

降低CPU速度以减少热量

这适用于配备 Intel Sandy Bridge 和较新处理器的 Ubuntu 16.04+。

从 (wiki.debian.org-thermald)是 Debian(Ubuntu 使用)关于thermald,用于冷却平板电脑和笔记本电脑的 Linux 守护进程。一旦系统温度达到某个阈值,Linux 守护进程就会启动各种冷却方法来冷却系统。

Linux 热守护进程 (thermald) 监控和控制配备最新 Intel sandy bridge 和最新 Intel CPU 版本的笔记本电脑、平板电脑的温度。一旦系统温度达到某个阈值,Linux 守护进程就会启动各种冷却方法来尝试冷却系统。

它以两种模式运行:

零配置模式

  • 对于大多数用户来说,这足以控制系统的 CPU 温度。它使用 DTS 温度传感器,并使用英特尔 P 状态驱动程序、功率钳位驱动程序、运行平均功率限制控制和 cpufreq 作为冷却方法。

用户定义配置模式

  • 这允许在热 XML 配置文件中进行 ACPI 样式配置。这可用于修复有缺陷的 ACPI 配置或通过添加更多传感器和冷却设备进行微调。这是在用户模式下实现闭环热控制的第一步,可以根据社区反馈和建议进行增强。

如何安装

apt-get install thermald

英特尔 Powerclamp

英特尔强力夹钳驱动程序定义在这里(kernel.org - 英特尔功率钳位.txt)并且是thermald如上所述。直接引用强力夹钳来自链接:

考虑这样一种情况:由于功率预算、热约束或噪声水平,系统运行时必须降低功耗,并且不推荐主动冷却。必须执行软件管理的被动功率降低,以防止为灾难性场景设计的硬件操作。

目前,P 状态、T 状态(时钟调制)和 CPU 离线用于 CPU 节流。

在 Intel CPU 上,C 状态可有效降低功耗,但目前仅根据工作负载适时使用。随着 intel_powerclamp 驱动程序的开发,引入了在所有在线 CPU 线程上同步空闲注入的方法。目标是实现强制且可控的 C 状态驻留。

已在功耗、性能、可扩展性和用户体验方面进行了测试/分析。在许多情况下,与使 CPU 脱机或调节 CPU 时钟相比,它显示出明显的优势。


您如何知道 Powerclamp 正在运行?

强力夹钳每年可能只会出现一次,即风扇通风口积满灰尘和棉绒。那么你怎么知道它实际上是在后台运行的呢?使用:

lsmod | grep intel

您应该看到类似这样的列表:

btintel                16384  1 btusb
bluetooth             520192  29 bnep,btbcm,btrtl,btusb,rfcomm,btintel
intel_rapl             20480  0
intel_powerclamp       16384  0
   (.... more intel drivers ....)
snd                    81920  18 snd_hwdep,snd_timer,snd_hda_codec_hdmi,snd_hda_codec_idt,snd_pcm,snd_seq,snd_rawmidi,snd_hda_codec_generic,snd_hda_codec,snd_hda_intel,snd_seq_device

如果您看到intel_rapl并且intel_powerclamp知道它正在工作,只需等待温度超过 85C。


Conky 展示的 Powerclamp 实际操作

这是屏幕截图强力夹钳注射睡眠周期:

Kidie 注射液

通常,在观看 HTML5 视频并打开 10 个 Chrome 标签时,此系统的 CPU 时钟速度为 2400 Mhz 至 3400 Mhz。通常,8 个 CPU 的 CPU 利用率约为 9% 至 12%。当情况变得太热时(86C强力夹钳开始起作用,发生以下情况:

  • CPU 速度降低至 1200 Mhz。
  • CPU 利用率飙升至 80%。这是误导性的,因为额外的 70% 是睡眠时间。
  • 前 9 个 CPU 进程通常是 5 或 6 个 Chrome 进程加上 Xorg、Conky、Pulse Audio 和偶尔的 kworker。但现在前 10 个中有 8 个是kidle_inject/x进程x从 0 到 7。针对前 8 个 CPU。

强力夹钳驱动程序运行直至温度再次降至 85C 以下。驱动程序运行时,您的视频可能会瞬间暂停,键盘和鼠标也可能会瞬间延迟。


禁用英特尔睿频加速

回到 Ubuntu 14.04 的“酷炫旧时光”,当时 Intel Turbo Boost 坏了,所以我的处理器速度在 1200 Mhz 和 2400 Mhz 之间波动。升级到 Ubuntu 16.04 后,它会升至 3400 Mhz(3.4 Ghz),因为 Turbo Boost 终于可以正常工作了。但它也增加了热量。

要禁用 Intel Turbo Boost,请使用:

echo "1" | sudo tee /sys/devices/system/cpu/intel_pstate/no_turbo

答案4

我已经彻底编辑了上述问题,以便请求更新 16.04,因此我下面的回答只是对Kenn 的初步回答,我在上面发布了重复的问题并且还是回答在那之下。

由于 16.04 中的错误Error org.freedesktop.DBus.Error.UnknownMethod: No such method 'Suspend',在尼克西利托在下面我重复的问题链接到答案是,我修改了脚本,替换了整个部分:

    dbus-send --system --print-reply --dest="org.freedesktop.UPower" /org/freedesktop/UPower org.freedesktop.UPower.Suspend

    systemctl suspend

正如评论中指出的那样怀安德雷亚在下面重复的问题sleep 10或者不应删除类似的值(正如我最初所做的那样);如果没有该行,修改后的脚本将使用更多的电量,因为它不是每 10 秒运行一次,而是尽可能快地运行 - 每秒运行几十次。

此时,当超过线路设置的水平时,系统将进入睡眠状态

max="+75.0"

因为我想要一个更高的值,82,所以我使用的脚本是:

#!/bin/bash

while true; do
   val=$(sensors | awk '/temp1/ {print $2}')
   max="+82.0"
   if [[ "$val" > "$max" ]]; then
                        systemctl suspend

   fi
   sleep 10
   clear
   sensors
done
exit 0

相关内容