web-dev-qa-db-fra.com

Ubuntu s'éteint pendant le jeu en raison d'une surchauffe du processeur

L'ordinateur portable est souvent en train de s'arrêter soudainement après 20 à 30 minutes d'utilisation intensive (presque toujours en jeu). Ensuite, après le redémarrage du BIOS, un message indique que le processeur était trop chaud et qu'il a dû être éteint.

La mise en place:

  • Dell XPS (avec processeur i7-7700 de 2,8 GHz)
  • Ubuntu 17.10 (configuration de base)
  • nVidia GTP 1050 mobile avec pilote nVidia 384.9

Cela ne s'est pas produit avec la même machine, le même jeu et Win10. Je soupçonne peut-être un mauvais système ou un pilote manquant, mais je ne trouve pas vraiment comment le réparer. Y a-t-il quelque chose dans Ubuntu qui puisse empêcher cela - peut-être en limitant simplement le processeur au lieu de le fermer durement?

1
itarato

Tout ce que vous faites dans un logiciel pour atténuer le problème ne fera que restreindre votre capacité à utiliser pleinement votre processeur et à en profiter pleinement (sauf pour augmenter la vitesse du ventilateur, si cela est possible). Ceci est un défaut matériel, dans la conception thermique de l'ordinateur portable.

Bien que hors de portée sur un site comme celui-ci, je parle de m'assurer que les ventilateurs tournent, que l'air peut circuler autour et sous l'ordinateur portable (ce n'est pas sur un coussin ou un lit), le processeur est correctement lié à son radiateur conducteur est utilisé avec une pâte thermique appropriée, il n’ya pas d’accumulation de poussière qui empêcherait la circulation de l’air, etc.

Mais il est triste de constater que certains ordinateurs portables ne sont pas conçus de manière adéquate pour refroidir un processeur, même s’il est confronté à une utilisation intensive, en s’appuyant sur l’accélération pour compenser une mauvaise conception.

2
thomasrutter

J'avais l'habitude d'avoir des problèmes similaires pour plusieurs ordinateurs portables. Il semble que le processeur des ordinateurs portables ait tendance à surchauffer plus facilement au fil du temps et à s’éteindre. Remplacement du ventilateur du processeur et de la pâte thermique de qualité ne m'a jamais aidé dans ces situations. Jusqu'à présent, j'ai limité la fréquence maximale sur Ubuntu, mais il se peut que vous laissiez votre ordinateur portable tout en effectuant quelques traitements pendant un moment sous le soleil. Cela surchauffe tout le corps de l'ordinateur portable, ce qui finit par l'éteindre.

J'ai appris que les derniers ordinateurs portables équipés de puces Intel ne fonctionnent pas correctement avec cpufreq-set, mais uniquement avec les outils likwid .

Installer ce paquet:

Sudo apt install likwid

J'ai écrit le script python suivant pour diminuer/augmenter la fréquence maximale du processeur (manipulate_cpu_freq.py) sous Ubuntu 18.04 (nécessite 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)

Et j'utilise un script exécuté en arrière-plan pour surveiller la température du processeur (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

Vous devez sûrement vérifier quel point système (par exemple,/sys/devices/virtual/thermal/thermal_zone0/temp) contient la température de votre processeur et adaptez le script ci-dessus. J'augmente la fréquence maximale du processeur lorsque la température est inférieure à 68 ° C et diminue si elle est supérieure à 76 ° C. C'est une politique très conservatrice, mais la température peut atteindre rapidement plus de 100 ° C (autour du seuil d'arrêt thermique), si elle reste en permanence au-dessus de 80 ° C, j'essaie donc de toujours rester au-dessous de 80 ° C, juste pour être sûr.

J'ai dû développer la solution ci-dessus hier parce que j'avais deux arrêts thermiques à cause de la journée chaude et ensoleillée lors de l'exécution de calculs intensifs sur le processeur de mon ordinateur portable (Intel i7-6600U) en continu.

Vous pouvez exécuter le script après chaque démarrage en ajoutant des tâches cron (/ etc/crontab):

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

Assurez-vous que l'écran est installé:

Sudo apt install screen

Vous pouvez le vérifier en cours d'exécution:

screen -r cpu_policy
0
kecsap