made governor_control async
This commit is contained in:
@@ -1,6 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="utf-8" ?>
|
<?xml version="1.0" encoding="utf-8" ?>
|
||||||
<cpuGovernorAutoAdjust>
|
<cpuGovernorAutoAdjust>
|
||||||
<logLevel>Info</logLevel>
|
<logLevel>Debug</logLevel>
|
||||||
<testMode>true</testMode>
|
<testMode>true</testMode>
|
||||||
<defaultGovernor>powersave</defaultGovernor>
|
<defaultGovernor>powersave</defaultGovernor>
|
||||||
<statisticsIntervalInSeconds>5</statisticsIntervalInSeconds>
|
<statisticsIntervalInSeconds>5</statisticsIntervalInSeconds>
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ from cpufreq import cpuFreq, cpufreq # type: ignore
|
|||||||
from functools import cached_property
|
from functools import cached_property
|
||||||
from cpu_governor_auto_adjust.exceptions import GovernorNotFound
|
from cpu_governor_auto_adjust.exceptions import GovernorNotFound
|
||||||
from typing import Optional, NamedTuple
|
from typing import Optional, NamedTuple
|
||||||
|
import asyncio
|
||||||
|
|
||||||
|
|
||||||
class Governor(NamedTuple):
|
class Governor(NamedTuple):
|
||||||
@@ -24,7 +25,8 @@ _governor_list: tuple[Governor, Governor, Governor, Governor, Governor, Governor
|
|||||||
class GovernorControl(AppClass):
|
class GovernorControl(AppClass):
|
||||||
def __init__(self, _config: Config) -> None:
|
def __init__(self, _config: Config) -> None:
|
||||||
super().__init__(_config)
|
super().__init__(_config)
|
||||||
self.log.info("current governor is: %s", self.current_governor)
|
self.governor = self.current_governor
|
||||||
|
self.log.info("current governor is: %s", self.governor)
|
||||||
|
|
||||||
@cached_property
|
@cached_property
|
||||||
def _cpufreq(self) -> Optional[cpuFreq]:
|
def _cpufreq(self) -> Optional[cpuFreq]:
|
||||||
@@ -35,9 +37,9 @@ class GovernorControl(AppClass):
|
|||||||
return None
|
return None
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def current_governor(self) -> Optional[Governor]:
|
def current_governor(self) -> Governor:
|
||||||
if self._cpufreq is None:
|
if self._config.testmode:
|
||||||
return None
|
return [g for g in _governor_list if g.name == "ondemand"].pop()
|
||||||
_governor = set(self._cpufreq.get_governors().values())
|
_governor = set(self._cpufreq.get_governors().values())
|
||||||
_governor_to_return = self._establish_governor(list(_governor)[0])
|
_governor_to_return = self._establish_governor(list(_governor)[0])
|
||||||
if len(_governor) == 0:
|
if len(_governor) == 0:
|
||||||
@@ -57,7 +59,7 @@ class GovernorControl(AppClass):
|
|||||||
raise RuntimeError("could not establish governor")
|
raise RuntimeError("could not establish governor")
|
||||||
return governor
|
return governor
|
||||||
|
|
||||||
def set_governor(self, governor_name: str) -> None:
|
def _set_governor(self, governor_name: str) -> None:
|
||||||
self.log.info("setting cpu governor to %s", governor_name)
|
self.log.info("setting cpu governor to %s", governor_name)
|
||||||
|
|
||||||
if self._config.testmode:
|
if self._config.testmode:
|
||||||
@@ -72,3 +74,11 @@ class GovernorControl(AppClass):
|
|||||||
return None
|
return None
|
||||||
|
|
||||||
self._cpufreq.set_governors(governor_name)
|
self._cpufreq.set_governors(governor_name)
|
||||||
|
|
||||||
|
async def run(self) -> None:
|
||||||
|
self.log.debug("running governor control")
|
||||||
|
while True:
|
||||||
|
if self.current_governor != self.governor:
|
||||||
|
self.log.debug("governor has changed from %s to %s", self.current_governor, self.governor)
|
||||||
|
self._set_governor(self.governor.name)
|
||||||
|
await asyncio.sleep(1)
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ class TriggerScheduler(AppClass):
|
|||||||
def governor_control(self) -> GovernorControl:
|
def governor_control(self) -> GovernorControl:
|
||||||
return GovernorControl(self._config)
|
return GovernorControl(self._config)
|
||||||
|
|
||||||
def establish_preferred_governor(self) -> str:
|
def establish_preferred_governor(self) -> Governor:
|
||||||
self.log.debug('establishing preferred governor, default governor: %s', self._config.default_governor)
|
self.log.debug('establishing preferred governor, default governor: %s', self._config.default_governor)
|
||||||
preferred_governor: Governor = [gov for gov in _governor_list if gov.name == self._config.default_governor].pop()
|
preferred_governor: Governor = [gov for gov in _governor_list if gov.name == self._config.default_governor].pop()
|
||||||
for trigger in self.running_triggers:
|
for trigger in self.running_triggers:
|
||||||
@@ -29,19 +29,8 @@ class TriggerScheduler(AppClass):
|
|||||||
if trigger._active:
|
if trigger._active:
|
||||||
if trigger.governor.priority < preferred_governor.priority:
|
if trigger.governor.priority < preferred_governor.priority:
|
||||||
preferred_governor = trigger.governor
|
preferred_governor = trigger.governor
|
||||||
self.log.debug('preferred governor: %s', preferred_governor.name)
|
self.log.debug('preferred governor: %s', preferred_governor)
|
||||||
return preferred_governor.name
|
return preferred_governor
|
||||||
|
|
||||||
async def set_governor(self, governor_name: str) -> None:
|
|
||||||
if self.governor_control.current_governor is None:
|
|
||||||
self.log.debug("unable to retrieve current governor")
|
|
||||||
return
|
|
||||||
|
|
||||||
if self.governor_control.current_governor.name == governor_name:
|
|
||||||
self.log.debug("governor is already set to: %s", governor_name)
|
|
||||||
return
|
|
||||||
|
|
||||||
self.governor_control.set_governor(governor_name)
|
|
||||||
|
|
||||||
async def start_trigger(self, _trigger: Trigger) -> None:
|
async def start_trigger(self, _trigger: Trigger) -> None:
|
||||||
"""Start a new trigger."""
|
"""Start a new trigger."""
|
||||||
@@ -75,9 +64,9 @@ class TriggerScheduler(AppClass):
|
|||||||
self.loop.add_signal_handler(sig, partial(signal_handler, sig=signal.SIGINT))
|
self.loop.add_signal_handler(sig, partial(signal_handler, sig=signal.SIGINT))
|
||||||
|
|
||||||
try:
|
try:
|
||||||
|
self.loop.create_task(self.governor_control.run())
|
||||||
while True:
|
while True:
|
||||||
preferred_governor = self.establish_preferred_governor()
|
self.governor_control.governor = self.establish_preferred_governor()
|
||||||
await self.schedule_task(self.set_governor, preferred_governor)
|
|
||||||
await asyncio.sleep(1) # Keep the main function alive
|
await asyncio.sleep(1) # Keep the main function alive
|
||||||
except asyncio.exceptions.CancelledError:
|
except asyncio.exceptions.CancelledError:
|
||||||
pass
|
pass
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
[project]
|
[project]
|
||||||
name = "cpu_governor_auto_adjust"
|
name = "cpu_governor_auto_adjust"
|
||||||
version = "0.5.17"
|
version = "0.5.19"
|
||||||
description = "This application has been developed to automatically change cpu governor based on certain triggers."
|
description = "This application has been developed to automatically change cpu governor based on certain triggers."
|
||||||
authors = [
|
authors = [
|
||||||
{ name = "Martin Reurekas", email = "martin@semrks.nl" }
|
{ name = "Martin Reurekas", email = "martin@semrks.nl" }
|
||||||
|
|||||||
Reference in New Issue
Block a user