XPEnology
April 19

Автопереключение регуляторов процессора

Скрипт переключения регуляторов частоты процессора в зависимости от нагрузки (переключает между 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
}

# Запуск скрипта
main

2. Сохранить как cpu_gov.sh и сделать исполняемым:

chmod +x cpu_gov.sh

3. Запустить с правами root:

sudo ./cpu_gov.sh