我使用的是联想 Legion Y720 笔记本电脑,配备 GTX 1060 GPU 和 i7 7700HQ CPU。我以前安装过 Nvidia 384 驱动程序,一切都很顺利,直到 390 驱动程序出现问题,我的笔记本电脑开始出现非常高的温度。我尝试手动安装 384 驱动程序,但它只是安装了 390 驱动程序。
以下是我玩 CS GO 时的温度:
- 我正在使用 Ubuntu 18.04
- Windows 10 上的最高温度为 75-80
- 我正在使用 Psensor 测量温度
我在其他地方找不到这个问题。有没有办法强制降级?如果我从 Nvidia 下载 384 驱动程序并尝试运行该文件,每次都无法安装。
答案1
我找到了此问题的半解决方案:
http://seperohacker.blogspot.com/2012/10/linux-keep-your-cpu-cool-with-frequency.html
我发现这个脚本可以将 CPU 从 3.8 GHZ 降低到 2.5 GHZ,从而使温度从 90+ 降至 77-80 摄氏度。
#!/bin/bash
# Usage: temp_throttle.sh max_temp
# USE CELSIUS TEMPERATURES.
# version 2.20
cat << EOF
Author: Sepero 2016 (sepero 111 @ gmx . com)
URL: http://github.com/Sepero/temp-throttle/
EOF
# Additional Links
# http://seperohacker.blogspot.com/2012/10/linux-keep-your-cpu-cool-with-frequency.html
# Additional Credits
# Wolfgang Ocker <weo AT weo1 DOT de> - Patch for unspecified cpu frequencies.
# License: GNU GPL 2.0
# Generic function for printing an error and exiting.
err_exit () {
echo ""
echo "Error: $@" 1>&2
exit 128
}
if [ $# -ne 1 ]; then
# If temperature wasn't given, then print a message and exit.
echo "Please supply a maximum desired temperature in Celsius." 1>&2
echo "For example: ${0} 60" 1>&2
exit 2
else
#Set the first argument as the maximum desired temperature.
MAX_TEMP=$1
fi
### START Initialize Global variables.
# The frequency will increase when low temperature is reached.
LOW_TEMP=$((MAX_TEMP - 5))
CORES=$(nproc) # Get number of CPU cores.
echo -e "Number of CPU cores detected: $CORES\n"
CORES=$((CORES - 1)) # Subtract 1 from $CORES for easier counting later.
# Temperatures internally are calculated to the thousandth.
MAX_TEMP=${MAX_TEMP}000
LOW_TEMP=${LOW_TEMP}000
FREQ_FILE="/sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies"
FREQ_MIN="/sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_min_freq"
FREQ_MAX="/sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_max_freq"
# Store available cpu frequencies in a space separated string FREQ_LIST.
if [ -f $FREQ_FILE ]; then
# If $FREQ_FILE exists, get frequencies from it.
FREQ_LIST=$(cat $FREQ_FILE) || err_exit "Could not read available cpu frequencies from file $FREQ_FILE"
elif [ -f $FREQ_MIN -a -f $FREQ_MAX ]; then
# Else if $FREQ_MIN and $FREQ_MAX exist, generate a list of frequencies between them.
FREQ_LIST=$(seq $(cat $FREQ_MAX) -100000 $(cat $FREQ_MIN)) || err_exit "Could not compute available cpu frequencies"
else
err_exit "Could not determine available cpu frequencies"
fi
FREQ_LIST_LEN=$(echo $FREQ_LIST | wc -w)
# CURRENT_FREQ will save the index of the currently used frequency in FREQ_LIST.
CURRENT_FREQ=2
# This is a list of possible locations to read the current system temperature.
TEMPERATURE_FILES="
/sys/class/thermal/thermal_zone0/temp
/sys/class/thermal/thermal_zone1/temp
/sys/class/thermal/thermal_zone2/temp
/sys/class/hwmon/hwmon0/temp1_input
/sys/class/hwmon/hwmon1/temp1_input
/sys/class/hwmon/hwmon2/temp1_input
/sys/class/hwmon/hwmon0/device/temp1_input
/sys/class/hwmon/hwmon1/device/temp1_input
/sys/class/hwmon/hwmon2/device/temp1_input
null
"
# Store the first temperature location that exists in the variable TEMP_FILE.
# The location stored in $TEMP_FILE will be used for temperature readings.
for file in $TEMPERATURE_FILES; do
TEMP_FILE=$file
[ -f $TEMP_FILE ] && break
done
[ $TEMP_FILE == "null" ] && err_exit "The location for temperature reading was not found."
### END Initialize Global variables.
### START define script functions.
# Set the maximum frequency for all cpu cores.
set_freq () {
# From the string FREQ_LIST, we choose the item at index CURRENT_FREQ.
FREQ_TO_SET=$(echo $FREQ_LIST | cut -d " " -f $CURRENT_FREQ)
echo $FREQ_TO_SET
for i in $(seq 0 $CORES); do
# Try to set core frequency by writing to /sys/devices.
{ echo $FREQ_TO_SET 2> /dev/null > /sys/devices/system/cpu/cpu$i/cpufreq/scaling_max_freq; } ||
# Else, try to set core frequency using command cpufreq-set.
{ cpufreq-set -c $i --max $FREQ_TO_SET > /dev/null; } ||
# Else, return error message.
{ err_exit "Failed to set frequency CPU core$i. Run script as Root user. Some systems may require to install the package cpufrequtils."; }
done
}
# Will reduce the frequency of cpus if possible.
throttle () {
if [ $CURRENT_FREQ -lt $FREQ_LIST_LEN ]; then
CURRENT_FREQ=$((CURRENT_FREQ + 1))
echo -n "throttle "
set_freq $CURRENT_FREQ
fi
}
# Will increase the frequency of cpus if possible.
unthrottle () {
if [ $CURRENT_FREQ -ne 1 ]; then
CURRENT_FREQ=$((CURRENT_FREQ - 1))
echo -n "unthrottle "
set_freq $CURRENT_FREQ
fi
}
get_temp () {
# Get the system temperature.
TEMP=$(cat $TEMP_FILE)
}
### END define script functions.
echo "Initialize to max CPU frequency"
unthrottle
# Main loop
while true; do
get_temp # Gets the current temperature and set it to the variable TEMP.
if [ $TEMP -gt $MAX_TEMP ]; then # Throttle if too hot.
throttle
elif [ $TEMP -le $LOW_TEMP ]; then # Unthrottle if cool.
unthrottle
fi
sleep 3 # The amount of time between checking temperatures.
done
如何使用:
sudo./temp_throttle.sh 75
(75 是温度,即油门在 75 摄氏度以上)
终端将开始打印 CPU 正在节流,并且它开始从 3.8 GHz(就我而言)降至 3.7 等等。不幸的是,它会继续这样做,直到达到 800 MHz,这会导致一切都滞后。我发现,当它达到节流点(例如 2.8 GHz)时,只需按 ctrl+C 即可结束该过程,它就会停留在那里。如果您想再次返回到最大功率,只需设置一些高温,例如 80 或更高,它就会返回到 3.8 GHz 或更高,具体取决于您的 CPU。