Ограничить использование процессора по температуре

8

Я запускаю проекты распределенных вычислений, которые обычно хотят использовать 100% процессорного времени. Как ограничить использование ЦП с точки зрения температуры, а не процента использования? Кроме того, какова максимальная безопасная температура, чтобы Intel i5 работал 24/7? (Без ограничения CPU FahCore_a4 заставляет эту машину работать при 82 градусах Цельсия.)

jeffythedragonslayer
источник

Ответы:

8

На этой веб-странице есть скрипт bash, который будет пытаться поддерживать ваш процессор ниже указанной температуры. http://seperohacker.blogspot.com/2012/10/linux-keep-your-cpu-cool-with-frequency.html

Вам просто нужно предоставить ему желаемую максимальную температуру, и он будет задавливать ваши процессоры, чтобы оставаться ниже этой температуры.

Бесстыдный плагин - я написал и поддерживаю приведенный выше скрипт.

Sepero
источник
2
Хотя это может теоретически ответить на вопрос, было бы предпочтительным включить сюда основные части ответа и предоставить ссылку для справки.
fossfreedom
1
хороший сценарий .. хорошая идея :)
Superbiji
1
Вот важные части: github.com/Sepero/temp-throttle
DmitrySandalov
3

Вот как я решил это с помощью bash. Если кто-то придумает лучшего демона (лучше держится при температуре ниже целевой), пожалуйста, опубликуйте его.

#!/bin/bash

while true; do
        val=$(sensors | awk '/Core 0/ {print $3}')
        max="+60.0"
        if [[ "$val" < "$max" ]]
        then
                killall cpulimit
                sleep .1
        else
                cpulimit -e FahCore_a4 -l 99 &
                sleep 1
        fi
        clear
        sensors
done
jeffythedragonslayer
источник
0

Сам процессор имеет механизм, который отключает его, если он слишком горячий. (возможно, нет, если вы отключите прерывания SMI, я не уверен в этом.)

Основным приложением пользовательского пространства является lm-sensorsпакет. После установки запустите его, sensors-detectчтобы настроить, если ваши машины одинаковые, вы можете запустить его один раз и использовать полученные результаты везде.

Частота процессора легко контролируется через подсистему драйвера cpufreq. см. https://wiki.archlinux.org/index.php/CPU_Frequency_Scaling

Вы можете написать демон, который использует lm-sensor для опроса температуры и, если он слишком горячий, уменьшит частоту процессора.

user72421
источник
На каком языке было бы проще написать такого демона? Баш, питон, а?
Jeffythedragonslayer
Я бы сказал, что Bash самый простой. Вот пример (посмотрите на строки 55-66).
Adobe
0

Именно так я решил свои проблемы с перегревом, которые были вызваны не определенным процессом, а неспособностью моего ноутбука рассеивать тепло, вызванное высокой нагрузкой на процессор в течение более длительных периодов времени. Основное отличие от решения, предлагаемого самим da code monkey, заключается в том, что я использую масштабирование частоты процессора вместо использования cpulimit в конкретном процессе. Так как у меня установлен и работает Psensor, я использую Psensor. Демон, подобный предложенной обезьяной кода, также должен работать, однако требуются два порога (мин и макс). В Psensor (Настройки датчика-> Тревога) я устанавливаю сигнал тревоги для соответствующего датчика, если он становится выше, чем верхний порог (я использую 85), или ниже, чем нижний порог (я использую 80). В Preferences-> Sensors-> Script, выполняемом при возникновении тревоги, я называю свой скрипт heatcontrol.sh следующим образом:

/ALLUSER/heatcontrol.sh powersave ondemand 82

Первый параметр - это допустимый scaling_governor, который уменьшает частоту процессора, например, powersave. Второй параметр по умолчанию - scaling_governor - ondemand для большинства систем. Третий параметр - это температура между нижним и верхним порогом (точное значение не имеет значения). Psensor добавляет еще два параметра: идентификатор датчика и сообщаемую температуру.

И это мой скрипт heatcontrol.sh:

#!/bin/bash
 # TempNZ is temperature reported by Psensor; strip of trailing °C
TempNZ=$5 
bnum=`expr index "$TempNZ" "°"`
if (( bnum < 2 )); then
    echo "ERROR"
fi
TempNZ=${TempNZ:0:$(($bnum-1))}
STR=$1
# Is this a low threshold alarm?
if [ "$TempNZ" -le "$3" ]; then
    STR=$2
fi
sudo sh -c "echo '$STR' > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor"
# echo new scaling_governor
sudo cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
# play sound - audio feedback - optional
paplay /usr/share/sounds/ubuntu/stereo/message-new-instant.ogg

У меня отлично работает (UBUNTU 14.04 LTS).

Будучи новичком в Linux и Bash, я использовал ряд ресурсов, в том числе:

https://wiki.archlinux.org/index.php/CPU_frequency_scaling

http://elinux.org/Jetson/Performance#Viewing_the_current_CPU_status

user369752
источник