web-dev-qa-db-ja.com

CPUの過熱によりゲーム中にUbuntuが停止する

ラップトップは、20〜30分間の頻繁な使用の後、突然シャットダウンすることがよくあります(ほぼ常にゲーム内)。次に、再起動後、BIOSはCPUが熱すぎて、オフにする必要があるというメッセージを表示します。

セットアップ:

  • Dell XPS(i7-7700 2.8Ghz CPU搭載)
  • Ubuntu 17.10(基本セットアップ)
  • nVidia 384.9ドライバーを搭載したnVidia GTP 1050モバイル

これは、同じマシン、同じゲーム、Win10では発生しませんでした。システム設定が間違っているか、ドライバーが見つからない可能性がありますが、修正方法を見つけることができませんでした。 Ubuntuにこれを防ぐことができるものはありますか?CPUをハードシャットダウンするのではなく、単にCPUを調整するだけで可能ですか?

1
itarato

問題を軽減するためにソフトウェアで行うことは、CPUを完全に使用して楽しむ能力を制限するだけです(可能な場合は、ファンの速度を上げることを除きます)。これは、ラップトップの熱設計におけるハードウェアの欠陥です。

このようなサイトでは範囲外ですが、ファンが回転していること、ラップトップの周りや下に空気が流れること(クッションやベッドの上ではないこと)、CPUがヒートシンクなどの熱に正しくバインドされていることを確認しています導体は適切なサーマルペーストと共に使用され、空気の移動を妨げるような埃の堆積などはありません。

しかし、一部のラップトップは、使用頻度が高い場合にCPUを冷却するように設計されておらず、不適切な設計を補うためにスロットルに依存しているという悲しい事実です。

2
thomasrutter

私は複数のラップトップで同様の問題を抱えていました。ラップトップのCPUは、時間の経過とともに簡単に過熱してシャットダウンする傾向があるようです。これらの状況では、CPUファンと高品質のサーマルペーストを交換しても役に立たなかった。これまでのところ、Ubuntuの最大周波数を制限していましたが、太陽の下でしばらく処理を行っている間にラップトップを離れてしまい、ラップトップ本体全体が過熱して、最終的にシャットダウンする可能性があります。

Intelチップを搭載した最新のラップトップはcpufreq-setでは正しく動作せず、 likwid ツールでのみ動作することを学びました。

このパッケージのインストール:

Sudo apt install likwid

次のpythonスクリプトを作成して、Ubuntu 18.04で最大CPU周波数を増減します(manipulate_cpu_freq.py)(Python 3.7が必要):

#!/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ポイント(たとえば、/ sys/devices/virtual/thermal/thermal_zone0/temp)にCPU温度が含まれているかを確認し、上記のスクリプトを適応させる必要があります。温度が68°C未満の場合はCPU最大周波数を上げ、76°Cを超える場合は下げます。これは非常に保守的なポリシーですが、温度が100°C(サーマルシャットダウンのしきい値付近)を超えると、80°Cを恒久的に超えるとすぐに到達する可能性があるため、念のために常に80°C未満に保つようにします。

ラップトップCPU(Intel i7-6600U)で継続的に集中的な計算を実行している間、晴れた暑い日のために2つのサーマルシャットダウンが発生したため、昨日上記のソリューションを開発する必要がありました。

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
0
kecsap