XPEnology
April 19, 2025
Автопереключение регуляторов процессора
Скрипт переключения регуляторов частоты процессора в зависимости от нагрузки (переключает между performance и powersave)
1. Создать файл со следующим содержимым:
#!/bin/bash
# Пороговые значения средней нагрузки (1-минутный период)
HIGH_THRESHOLD=1.5
LOW_THRESHOLD=0.5
# Интервал проверки в секундах
INTERVAL=5
# Проверка доступных governors
check_governors() {
local governors=$(cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors 2>/dev/null)
if [[ ! "$governors" =~ "performance" ]]; then
echo "Error: Performance governor not available!"
exit 1
fi
if [[ ! "$governors" =~ "powersave" ]]; then
echo "Error: Powersave governor not available!"
exit 1
fi
}
# Установка governor для всех ядер CPU
set_governor() {
local governor="$1"
for cpu in /sys/devices/system/cpu/cpu[0-9]*; do
echo "$governor" > "$cpu/cpufreq/scaling_governor" 2>/dev/null
done
echo "Governor set to $governor"
}
# Функция сравнения чисел с плавающей точкой
compare_float() {
awk -v n1="$1" -v n2="$2" 'BEGIN {
if (n1 > n2) exit 0;
else exit 1
}'
}
# Основной цикл
main() {
check_governors
echo "Starting CPU frequency governor control..."
echo "High threshold: $HIGH_THRESHOLD | Low threshold: $LOW_THRESHOLD | Interval: $INTERVAL sec"
while true; do
local load=$(awk '{print $1}' /proc/loadavg)
local current_gov=$(cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor)
if compare_float "$load" "$HIGH_THRESHOLD"; then
[[ "$current_gov" != "performance" ]] && set_governor "performance"
elif compare_float "$LOW_THRESHOLD" "$load"; then
[[ "$current_gov" != "powersave" ]] && set_governor "powersave"
fi
sleep "$INTERVAL"
done
}
# Запуск скрипта
main2. Сохранить как cpu_gov.sh и сделать исполняемым:
chmod +x cpu_gov.sh
sudo ./cpu_gov.sh