Add config file for preferred governor and turbo boost behaviour. (#250)
* Add config file for setting preferred governor and turbo boost settings. * Add an example config file. * Display notice when using settings from config file when starting * Add section about configuring to README.md * Add --config parameter to set path for configuration file to use
This commit is contained in:
parent
ffc0bf0ca3
commit
6cb2c00786
25
README.md
25
README.md
|
@ -73,6 +73,31 @@ In case you encounter any problems with `auto-cpufreq-installer`, please [submit
|
|||
|
||||
Instead run `systemctl start auto-cpufreq` to start the service. Run `systemctl status auto-cpufreq` to see the status of service, and `systemctl enable auto-cpufreq` for service to persist running accross reboots.
|
||||
|
||||
## Configuring auto-cpufreq
|
||||
|
||||
You can configure profiles for battery and power supply. These profiles will let you pick which governor to use and how and when turbo boost is enabled. The possible values for turbo boost behavior are always, auto and never. The default behavior is auto, which only kicks in during high load.
|
||||
|
||||
### Example config
|
||||
```
|
||||
# settings for when connected to a power source
|
||||
[charger]
|
||||
# see available governors by running: cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors
|
||||
# preferred governor.
|
||||
governor = performance
|
||||
|
||||
# turbo boost setting. possible values: always, auto, never
|
||||
turbo = auto
|
||||
|
||||
# settings for when using battery power
|
||||
[battery]
|
||||
# see available governors by running: cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors
|
||||
# preferred governor
|
||||
governor = powersave
|
||||
|
||||
# turbo boost setting. possible values: always, auto, never
|
||||
turbo = auto
|
||||
```
|
||||
|
||||
## How to run auto-cpufreq
|
||||
|
||||
auto-cpufreq can be run by simply running the `auto-cpufreq` and following on screen instructions, i.e:
|
||||
|
|
|
@ -0,0 +1,20 @@
|
|||
# configuration file for auto-cpufreq
|
||||
# located in /etc/auto-cpufreq.conf
|
||||
|
||||
# settings for when connected to a power source
|
||||
[charger]
|
||||
# see available governors by running: cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors
|
||||
# preferred governor.
|
||||
governor = performance
|
||||
|
||||
# turbo boost setting. possible values: always, auto, never
|
||||
turbo = auto
|
||||
|
||||
#settings for when using battery power
|
||||
[battery]
|
||||
# see available governors by running: cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors
|
||||
# preferred governor
|
||||
governor = powersave
|
||||
|
||||
# turbo boost setting. possible values: always, auto, never
|
||||
turbo = auto
|
|
@ -11,6 +11,7 @@ import distro
|
|||
import time
|
||||
import click
|
||||
import warnings
|
||||
import configparser
|
||||
from math import isclose
|
||||
from pathlib import Path
|
||||
from subprocess import getoutput, call, run, check_output, DEVNULL
|
||||
|
@ -61,6 +62,17 @@ def file_stats():
|
|||
auto_cpufreq_stats_file = open(auto_cpufreq_stats_path, "w")
|
||||
sys.stdout = auto_cpufreq_stats_file
|
||||
|
||||
def get_config(config_file=''):
|
||||
if not hasattr(get_config, 'dict'):
|
||||
get_config.dict = dict()
|
||||
|
||||
config = configparser.ConfigParser()
|
||||
config.read(config_file)
|
||||
|
||||
for section in config.sections():
|
||||
get_config.dict[section] = dict(config.items(section))
|
||||
|
||||
return get_config.dict
|
||||
|
||||
# get distro name
|
||||
dist_name = distro.id()
|
||||
|
@ -415,8 +427,14 @@ def display_load():
|
|||
|
||||
# set powersave and enable turbo
|
||||
def set_powersave():
|
||||
print(f'Setting to use: "{get_avail_powersave()}" governor')
|
||||
run(f"cpufreqctl.auto-cpufreq --governor --set={get_avail_powersave()}", shell=True)
|
||||
gov = get_config()
|
||||
if "battery" in gov:
|
||||
if "governor" in gov["battery"]:
|
||||
gov = gov["battery"]["governor"]
|
||||
else:
|
||||
gov = get_avail_powersave()
|
||||
print(f'Setting to use: "{gov}" governor')
|
||||
run(f"cpufreqctl.auto-cpufreq --governor --set={gov}", shell=True)
|
||||
if (
|
||||
Path(
|
||||
"/sys/devices/system/cpu/cpu0/cpufreq/energy_performance_preference"
|
||||
|
@ -438,76 +456,92 @@ def set_powersave():
|
|||
print("Average temp. of all cores:", avg_all_core_temp, "°C")
|
||||
|
||||
# conditions for setting turbo in powersave
|
||||
if psutil.cpu_percent(percpu=False, interval=0.01) >= 30.0 or isclose(
|
||||
max(psutil.cpu_percent(percpu=True, interval=0.01)), 100
|
||||
):
|
||||
print("\nHigh CPU load")
|
||||
|
||||
# high cpu usage trigger
|
||||
if cpuload >= 20:
|
||||
print("setting turbo boost: on")
|
||||
turbo(True)
|
||||
|
||||
# set turbo state based on average of all core temperatures
|
||||
elif cpuload <= 20 and avg_all_core_temp >= 70:
|
||||
print(
|
||||
"Optimal total CPU usage:",
|
||||
cpuload,
|
||||
"%, high average core temp:",
|
||||
avg_all_core_temp,
|
||||
"°C",
|
||||
)
|
||||
print("setting turbo boost: off")
|
||||
turbo(False)
|
||||
else:
|
||||
print("setting turbo boost: off")
|
||||
turbo(False)
|
||||
|
||||
elif load1m > powersave_load_threshold:
|
||||
print("\nHigh system load")
|
||||
|
||||
# high cpu usage trigger
|
||||
if cpuload >= 20:
|
||||
print("setting turbo boost: on")
|
||||
turbo(True)
|
||||
|
||||
# set turbo state based on average of all core temperatures
|
||||
elif cpuload <= 20 and avg_all_core_temp >= 65:
|
||||
print(
|
||||
"Optimal total CPU usage:",
|
||||
cpuload,
|
||||
"%, high average core temp:",
|
||||
avg_all_core_temp,
|
||||
"°C",
|
||||
)
|
||||
print("setting turbo boost: off")
|
||||
turbo(False)
|
||||
else:
|
||||
print("setting turbo boost: off")
|
||||
turbo(False)
|
||||
|
||||
auto = get_config()
|
||||
if "battery" in auto:
|
||||
if "turbo" in auto["battery"]:
|
||||
auto = auto["battery"]["turbo"]
|
||||
else:
|
||||
print("\nLoad optimal")
|
||||
auto = "auto"
|
||||
|
||||
# high cpu usage trigger
|
||||
if cpuload >= 20:
|
||||
print("setting turbo boost: on")
|
||||
turbo(True)
|
||||
if auto == "always":
|
||||
print("Configuration file enforces turbo boost")
|
||||
print("setting turbo boost: on")
|
||||
turbo(True)
|
||||
elif auto == "never":
|
||||
print("Configuration file disables turbo boost")
|
||||
print("setting turbo boost: off")
|
||||
turbo(True)
|
||||
else:
|
||||
if psutil.cpu_percent(percpu=False, interval=0.01) >= 30.0 or isclose(
|
||||
max(psutil.cpu_percent(percpu=True, interval=0.01)), 100
|
||||
):
|
||||
print("\nHigh CPU load")
|
||||
|
||||
# high cpu usage trigger
|
||||
if cpuload >= 20:
|
||||
print("setting turbo boost: on")
|
||||
turbo(True)
|
||||
|
||||
# set turbo state based on average of all core temperatures
|
||||
elif cpuload <= 20 and avg_all_core_temp >= 70:
|
||||
print(
|
||||
"Optimal total CPU usage:",
|
||||
cpuload,
|
||||
"%, high average core temp:",
|
||||
avg_all_core_temp,
|
||||
"°C",
|
||||
)
|
||||
print("setting turbo boost: off")
|
||||
turbo(False)
|
||||
else:
|
||||
print("setting turbo boost: off")
|
||||
turbo(False)
|
||||
|
||||
elif load1m > powersave_load_threshold:
|
||||
print("\nHigh system load")
|
||||
|
||||
# high cpu usage trigger
|
||||
if cpuload >= 20:
|
||||
print("setting turbo boost: on")
|
||||
turbo(True)
|
||||
|
||||
# set turbo state based on average of all core temperatures
|
||||
elif cpuload <= 20 and avg_all_core_temp >= 65:
|
||||
print(
|
||||
"Optimal total CPU usage:",
|
||||
cpuload,
|
||||
"%, high average core temp:",
|
||||
avg_all_core_temp,
|
||||
"°C",
|
||||
)
|
||||
print("setting turbo boost: off")
|
||||
turbo(False)
|
||||
else:
|
||||
print("setting turbo boost: off")
|
||||
turbo(False)
|
||||
|
||||
# set turbo state based on average of all core temperatures
|
||||
elif cpuload <= 20 and avg_all_core_temp >= 60:
|
||||
print(
|
||||
"Optimal total CPU usage:",
|
||||
cpuload,
|
||||
"%, high average core temp:",
|
||||
avg_all_core_temp,
|
||||
"°C",
|
||||
)
|
||||
print("setting turbo boost: off")
|
||||
turbo(False)
|
||||
else:
|
||||
print("setting turbo boost: off")
|
||||
turbo(False)
|
||||
print("\nLoad optimal")
|
||||
|
||||
# high cpu usage trigger
|
||||
if cpuload >= 20:
|
||||
print("setting turbo boost: on")
|
||||
turbo(True)
|
||||
|
||||
# set turbo state based on average of all core temperatures
|
||||
elif cpuload <= 20 and avg_all_core_temp >= 60:
|
||||
print(
|
||||
"Optimal total CPU usage:",
|
||||
cpuload,
|
||||
"%, high average core temp:",
|
||||
avg_all_core_temp,
|
||||
"°C",
|
||||
)
|
||||
print("setting turbo boost: off")
|
||||
turbo(False)
|
||||
else:
|
||||
print("setting turbo boost: off")
|
||||
turbo(False)
|
||||
|
||||
footer()
|
||||
|
||||
|
@ -601,10 +635,16 @@ def mon_powersave():
|
|||
|
||||
# set performance and enable turbo
|
||||
def set_performance():
|
||||
gov = get_config()
|
||||
if "charger" in gov:
|
||||
if "governor" in gov["charger"]:
|
||||
gov = gov["charger"]["governor"]
|
||||
else:
|
||||
gov = get_avail_performance()
|
||||
|
||||
print(f'Setting to use: "{get_avail_performance()}" governor')
|
||||
print(f'Setting to use: "{gov}" governor')
|
||||
run(
|
||||
f"cpufreqctl.auto-cpufreq --governor --set={get_avail_performance()}",
|
||||
f"cpufreqctl.auto-cpufreq --governor --set={gov}",
|
||||
shell=True,
|
||||
)
|
||||
if (
|
||||
|
@ -627,77 +667,93 @@ def set_performance():
|
|||
print("Total system load:", load1m)
|
||||
print("Average temp. of all cores:", avg_all_core_temp, "°C")
|
||||
|
||||
if (
|
||||
psutil.cpu_percent(percpu=False, interval=0.01) >= 20.0
|
||||
or max(psutil.cpu_percent(percpu=True, interval=0.01)) >= 75
|
||||
):
|
||||
print("\nHigh CPU load")
|
||||
|
||||
# high cpu usage trigger
|
||||
if cpuload >= 20:
|
||||
print("setting turbo boost: on")
|
||||
turbo(True)
|
||||
|
||||
# set turbo state based on average of all core temperatures
|
||||
elif cpuload <= 25 and avg_all_core_temp >= 70:
|
||||
print(
|
||||
"Optimal total CPU usage:",
|
||||
cpuload,
|
||||
"%, high average core temp:",
|
||||
avg_all_core_temp,
|
||||
"°C",
|
||||
)
|
||||
print("setting turbo boost: off")
|
||||
turbo(False)
|
||||
else:
|
||||
print("setting turbo boost: on")
|
||||
turbo(True)
|
||||
|
||||
elif load1m >= performance_load_threshold:
|
||||
print("\nHigh system load")
|
||||
|
||||
# high cpu usage trigger
|
||||
if cpuload >= 20:
|
||||
print("setting turbo boost: on")
|
||||
turbo(True)
|
||||
|
||||
# set turbo state based on average of all core temperatures
|
||||
elif cpuload <= 25 and avg_all_core_temp >= 65:
|
||||
print(
|
||||
"Optimal total CPU usage:",
|
||||
cpuload,
|
||||
"%, high average core temp:",
|
||||
avg_all_core_temp,
|
||||
"°C",
|
||||
)
|
||||
print("setting turbo boost: off")
|
||||
turbo(False)
|
||||
else:
|
||||
print("setting turbo boost: on")
|
||||
turbo(True)
|
||||
|
||||
auto = get_config()
|
||||
if "charger" in auto:
|
||||
if "turbo" in auto["charger"]:
|
||||
auto = auto["charger"]["turbo"]
|
||||
else:
|
||||
print("\nLoad optimal")
|
||||
auto = "auto"
|
||||
|
||||
# high cpu usage trigger
|
||||
if cpuload >= 20:
|
||||
print("setting turbo boost: on")
|
||||
turbo(True)
|
||||
if auto == "always":
|
||||
print("Configuration file enforces turbo boost")
|
||||
print("setting turbo boost: on")
|
||||
turbo(True)
|
||||
elif auto == "never":
|
||||
print("Configuration file disables turbo boost")
|
||||
print("setting turbo boost: off")
|
||||
turbo(True)
|
||||
else:
|
||||
if (
|
||||
psutil.cpu_percent(percpu=False, interval=0.01) >= 20.0
|
||||
or max(psutil.cpu_percent(percpu=True, interval=0.01)) >= 75
|
||||
):
|
||||
print("\nHigh CPU load")
|
||||
|
||||
# high cpu usage trigger
|
||||
if cpuload >= 20:
|
||||
print("setting turbo boost: on")
|
||||
turbo(True)
|
||||
|
||||
# set turbo state based on average of all core temperatures
|
||||
elif cpuload <= 25 and avg_all_core_temp >= 70:
|
||||
print(
|
||||
"Optimal total CPU usage:",
|
||||
cpuload,
|
||||
"%, high average core temp:",
|
||||
avg_all_core_temp,
|
||||
"°C",
|
||||
)
|
||||
print("setting turbo boost: off")
|
||||
turbo(False)
|
||||
else:
|
||||
print("setting turbo boost: on")
|
||||
turbo(True)
|
||||
|
||||
elif load1m >= performance_load_threshold:
|
||||
print("\nHigh system load")
|
||||
|
||||
# high cpu usage trigger
|
||||
if cpuload >= 20:
|
||||
print("setting turbo boost: on")
|
||||
turbo(True)
|
||||
|
||||
# set turbo state based on average of all core temperatures
|
||||
elif cpuload <= 25 and avg_all_core_temp >= 65:
|
||||
print(
|
||||
"Optimal total CPU usage:",
|
||||
cpuload,
|
||||
"%, high average core temp:",
|
||||
avg_all_core_temp,
|
||||
"°C",
|
||||
)
|
||||
print("setting turbo boost: off")
|
||||
turbo(False)
|
||||
else:
|
||||
print("setting turbo boost: on")
|
||||
turbo(True)
|
||||
|
||||
# set turbo state based on average of all core temperatures
|
||||
elif cpuload <= 25 and avg_all_core_temp >= 60:
|
||||
print(
|
||||
"Optimal total CPU usage:",
|
||||
cpuload,
|
||||
"%, high average core temp:",
|
||||
avg_all_core_temp,
|
||||
"°C",
|
||||
)
|
||||
print("setting turbo boost: off")
|
||||
turbo(False)
|
||||
else:
|
||||
print("setting turbo boost: off")
|
||||
turbo(False)
|
||||
print("\nLoad optimal")
|
||||
|
||||
# high cpu usage trigger
|
||||
if cpuload >= 20:
|
||||
print("setting turbo boost: on")
|
||||
turbo(True)
|
||||
|
||||
# set turbo state based on average of all core temperatures
|
||||
elif cpuload <= 25 and avg_all_core_temp >= 60:
|
||||
print(
|
||||
"Optimal total CPU usage:",
|
||||
cpuload,
|
||||
"%, high average core temp:",
|
||||
avg_all_core_temp,
|
||||
"°C",
|
||||
)
|
||||
print("setting turbo boost: off")
|
||||
turbo(False)
|
||||
else:
|
||||
print("setting turbo boost: off")
|
||||
turbo(False)
|
||||
|
||||
footer()
|
||||
|
||||
|
|
|
@ -15,6 +15,7 @@ from auto_cpufreq.core import *
|
|||
|
||||
# cli
|
||||
@click.command()
|
||||
@click.option("--config", is_flag=False, default="/etc/auto-cpufreq.conf", help="Use config file at defined path")
|
||||
@click.option("--daemon", is_flag=True, hidden=True)
|
||||
@click.option("--debug", is_flag=True, help="Show debug info (include when submitting bugs)")
|
||||
@click.option("--install/--remove", default=True, help="Install/remove daemon for (permanent) automatic CPU optimizations")
|
||||
|
@ -23,7 +24,7 @@ from auto_cpufreq.core import *
|
|||
@click.option("--monitor", is_flag=True, help="Monitor and see suggestions for CPU optimizations")
|
||||
@click.option("--stats", is_flag=True, help="View live stats of CPU optimizations made by daemon")
|
||||
@click.option("--version", is_flag=True, help="Show currently installed version")
|
||||
def main(daemon, debug, install, live, log, monitor, stats, version):
|
||||
def main(config, daemon, debug, install, live, log, monitor, stats, version):
|
||||
if len(sys.argv) == 1:
|
||||
print("\n" + "-" * 32 + " auto-cpufreq " + "-" * 33 + "\n")
|
||||
print("Automatic CPU speed & power optimizer for Linux")
|
||||
|
@ -33,6 +34,8 @@ def main(daemon, debug, install, live, log, monitor, stats, version):
|
|||
run(["auto-cpufreq", "--help"])
|
||||
footer()
|
||||
else:
|
||||
if bool(get_config(config)):
|
||||
print("\nUsing settings defined in " + config + " file")
|
||||
# Important: order does matter
|
||||
if daemon:
|
||||
file_stats()
|
||||
|
|
Loading…
Reference in New Issue