Ubuntu 在玩游戏时因 CPU 过热而关闭

Ubuntu 在玩游戏时因 CPU 过热而关闭

笔记本电脑经常在重度使用 20-30 分钟后突然关机(几乎总是在玩游戏)。然后重启后 BIOS 会显示一条消息,提示 CPU 太热,必须关闭。

设置:

  • 戴尔 XPS(配备 i7-7700 2.8Ghz CPU)
  • Ubuntu 17.10(基本设置)
  • nVidia GTP 1050 移动版,带 nVidia 384.9 驱动程序

在同一台机器、同一游戏和 Win10 上没有发生这种情况。我怀疑我的系统设置不正确或缺少驱动程序 - 但真的找不到如何修复它。Ubuntu 中有什么可以防止这种情况 - 也许只是通过限制 CPU 而不是硬关闭它?

答案1

您在软件中为缓解此问题所做的任何操作都只会限制您充分使用和享受 CPU 的能力(除非提高风扇速度,如果可能的话)。这是笔记本电脑散热设计中的硬件缺陷。

虽然超出了此类网站的范围,但我所说的是确保风扇转动,空气可以在笔记本电脑周围和下方流动(它不在垫子或床上),CPU 与其散热器或任何使用适当导热膏的导热体正确结合,没有会阻止空气流动的灰尘堆积,等等。

但令人遗憾的事实是,有些笔记本电脑的设计不足以在频繁使用时冷却 CPU,只能依靠节流来弥补不良的设计。

答案2

我以前在多台笔记本电脑上遇到过类似的问题。似乎笔记本电脑中的 CPU 随着时间的推移更容易过热并关机。在这种情况下,更换 CPU 风扇和优质导热膏对我没有任何帮助。到目前为止,我限制了 Ubuntu 的最大频率,但可能会发生这种情况:你在处理某些事情时将笔记本电脑放在阳光下片刻,这会导致整个笔记本电脑机身过热,最终导致关机。

我了解到,配备英特尔芯片的最新笔记本电脑无法正确使用 cpufreq-set,只能使用利克维德工具。

安装此软件包:

sudo apt install likwid

我编写了以下 Python 脚本来在 Ubuntu 18.04(需要 Python 3.7)下减少/增加最大 CPU 频率(manipulate_cpu_freq.py):

#!/usr/bin/python3.7

import argparse
import os
import subprocess

parser = argparse.ArgumentParser(description = "Manipulate CPU frequencies", prefix_chars = '-')
parser.add_argument("-d", "--decrease", help = "decrease the max frequency", type = bool, default = False)
parser.add_argument("-i", "--increase", help = "increase the max frequency", type = bool, default = False)
parser.add_argument("-s", "--silent", help = "silent mode", type = bool, default = False)
args = parser.parse_args()

query_freqs_output = subprocess.run(["likwid-setFrequencies", "-l"], capture_output = True)
query_freqs_output = query_freqs_output.stdout.decode('utf-8').split('\n')[1]
query_freqs_output = query_freqs_output.split(' ')
available_freqs = list(map(float, query_freqs_output))

query_curr_freq_output = subprocess.run(["likwid-setFrequencies", "-p"], capture_output = True)
query_curr_freq_output = query_curr_freq_output.stdout.decode('utf-8').split('\n')[1]
query_curr_freq_output = query_curr_freq_output.split('/')[-1]
current_freq = float(query_curr_freq_output.split(' ')[0])
curr_freq_index = min(range(len(available_freqs)), key = lambda i: abs(available_freqs[i]-current_freq))

if not args.silent:
  print("Available frequencies:", available_freqs)
  print("Current frequency:", current_freq)

if args.decrease:
  print("Decrease the frequency")
  if curr_freq_index == 0:
    print("Warning: Can't decrease the frequency because it is already at min")
    exit(1)

  print("Set to frequency", available_freqs[curr_freq_index-1], "Ghz")
  subprocess.run(["likwid-setFrequencies", "-y", str(available_freqs[curr_freq_index-1])])
  exit(0)

if args.increase:
  print("Increase the frequency")
  if curr_freq_index == len(available_freqs)-1:
    print("Warning: Can't increase the frequency because it is already at max")
    exit(1)

  print("Set to frequency", available_freqs[curr_freq_index+1], "Ghz")
  subprocess.run(["likwid-setFrequencies", "-y", str(available_freqs[curr_freq_index+1])])
  exit(0)

我使用在后台运行的脚本来监视CPU温度(run_cpu_policy.sh):

#!/bin/bash

while true
do
  CPU_TEMP=$(cat /sys/devices/virtual/thermal/thermal_zone0/temp)
  echo CPU Temperature: $(echo ${CPU_TEMP}/1000 | bc)°C
  if [ "$CPU_TEMP" -gt 76000 ]; then
    echo Decrease the max CPU frequency
    sudo manipulate_cpu_freq.py -s 1 -d 1
  fi
  if [ "$CPU_TEMP" -le 68000 ]; then
    echo Increase the max CPU frequency
    sudo manipulate_cpu_freq.py -s 1 -i 1
  fi
  sleep 10
done

当然,您必须检查哪个系统点(例如 /sys/devices/virtual/thermal/thermal_zone0/temp)包含您的 CPU 温度并调整上述脚本。当温度低于 68°C 时,我增加 CPU 最大频率,如果温度高于 76°C,则降低频率。这是非常保守的政策,但如果温度长期高于 80°C,温度可能会迅速达到 100°C 以上(在热关机阈值附近),因此我尝试始终保持在 80°C 以下,以确保万无一失。

昨天我不得不开发上述解决方案,因为当我在笔记本电脑 CPU(Intel i7-6600U)上连续运行密集计算时,由于阳光明媚、天气炎热,我出现了两次热关机。

您可以在每次启动后运行该脚本,并将其添加到 cron 作业(/etc/crontab):

@reboot root systemd-run --scope sudo -u YOUR_USER screen -dmS cpu_policy /home/YOUR_USER/run_cpu_policy.sh

确保已安装屏幕:

sudo apt install screen

您可以在运行时检查它:

screen -r cpu_policy

相关内容