Begin implementing RTS
This commit is contained in:
111
perf/throttle.py
111
perf/throttle.py
@@ -1,10 +1,12 @@
|
||||
import psutil
|
||||
import asyncio
|
||||
import time
|
||||
|
||||
import psutil
|
||||
|
||||
import util
|
||||
|
||||
class DynamicThrottle(object):
|
||||
|
||||
class DynamicThrottle(object):
|
||||
def __init__(self, **kwargs):
|
||||
self.target_cpu_usage = kwargs.get("target_cpu_usage", 50)
|
||||
self.sleep_interval = 0.0
|
||||
@@ -22,13 +24,14 @@ class DynamicThrottle(object):
|
||||
self.consecutive_increments = 0
|
||||
self.consecutive_decrements = 0
|
||||
|
||||
self.last_was_increment = False
|
||||
self.consecutive_divisor = kwargs.get("consecutive_divisor", 1)
|
||||
|
||||
if kwargs.get("async"):
|
||||
self.dynamic_throttle = self.dynamic_throttle_async
|
||||
self.last_was_increment = kwargs.get("start_increment", True)
|
||||
|
||||
if kwargs.get("use_async"):
|
||||
self.wait = self.dynamic_throttle_async
|
||||
else:
|
||||
self.dynamic_throttle = self.dynamic_throttle
|
||||
|
||||
self.wait = self.dynamic_throttle
|
||||
|
||||
async def dynamic_throttle_async(self):
|
||||
"""
|
||||
@@ -37,22 +40,48 @@ class DynamicThrottle(object):
|
||||
current_cpu_usage = psutil.cpu_percent(interval=self.psutil_interval)
|
||||
|
||||
if current_cpu_usage > self.target_cpu_usage:
|
||||
self.sleep_interval += self.sleep_increment
|
||||
if self.last_was_increment:
|
||||
self.consecutive_increments += 1
|
||||
# self.log.debug(f"High CPU consecutive increments: {self.consecutive_increments}")
|
||||
else:
|
||||
self.consecutive_increments = 0 # ?
|
||||
self.consecutive_decrements = 0 # ?
|
||||
# self.log.debug(f"High CPU alert reset.")
|
||||
self.sleep_interval += self.sleep_increment * (
|
||||
max(1, self.consecutive_increments) / self.consecutive_divisor
|
||||
)
|
||||
self.last_was_increment = True
|
||||
if self.sleep_interval > self.sleep_max:
|
||||
self.sleep_interval = self.sleep_max
|
||||
self.log.info(
|
||||
f"CPU {current_cpu_usage}% > {self.target_cpu_usage}%, "
|
||||
f"=> sleep {self.sleep_interval:.3f}s"
|
||||
)
|
||||
elif current_cpu_usage < self.target_cpu_usage and self.sleep_interval > self.sleep_min:
|
||||
self.sleep_interval -= self.sleep_decrement
|
||||
self.log.info(
|
||||
f"CPU {current_cpu_usage}% < {self.target_cpu_usage}%, "
|
||||
f"=> sleep {self.sleep_interval:.3f}s"
|
||||
# self.log.debug(f"High CPU, but not increasing above {self.sleep_max:.3f}s")
|
||||
# self.log.debug(
|
||||
# f"High CPU: {current_cpu_usage}% > {self.target_cpu_usage}%, "
|
||||
# f"=> sleep {self.sleep_interval:.3f}s"
|
||||
# )
|
||||
elif current_cpu_usage < self.target_cpu_usage:
|
||||
if not self.last_was_increment:
|
||||
self.consecutive_decrements += 1
|
||||
# self.log.debug(f"Low CPU consecutive decrements: {self.consecutive_decrements}")
|
||||
else:
|
||||
self.consecutive_decrements = 0 # ?
|
||||
self.consecutive_increments = 0 # ?
|
||||
# self.log.debug(f"Low CPU alert reset.")
|
||||
self.sleep_interval -= self.sleep_decrement * (
|
||||
max(1, self.consecutive_decrements) / self.consecutive_divisor
|
||||
)
|
||||
self.last_was_increment = False
|
||||
if self.sleep_interval < self.sleep_min:
|
||||
self.sleep_interval = self.sleep_min
|
||||
# self.log.debug(f"Low CPU, but not decreasing below {self.sleep_min:.3f}s")
|
||||
# self.log.debug(
|
||||
# f"Low CPU: {current_cpu_usage}% < {self.target_cpu_usage}%, "
|
||||
# f"=> sleep {self.sleep_interval:.3f}s"
|
||||
# )
|
||||
|
||||
if self.sleep_interval > 0:
|
||||
await asyncio.sleep(self.sleep_interval)
|
||||
return self.sleep_interval
|
||||
return 0.0
|
||||
|
||||
def dynamic_throttle(self):
|
||||
"""
|
||||
@@ -61,19 +90,45 @@ class DynamicThrottle(object):
|
||||
current_cpu_usage = psutil.cpu_percent(interval=self.psutil_interval)
|
||||
|
||||
if current_cpu_usage > self.target_cpu_usage:
|
||||
self.sleep_interval += self.sleep_increment
|
||||
if self.last_was_increment:
|
||||
self.consecutive_increments += 1
|
||||
# self.log.debug(f"High CPU consecutive increments: {self.consecutive_increments}")
|
||||
else:
|
||||
self.consecutive_increments = 0 # ?
|
||||
self.consecutive_decrements = 0 # ?
|
||||
# self.log.debug(f"High CPU alert reset.")
|
||||
self.sleep_interval += self.sleep_increment * (
|
||||
max(1, self.consecutive_increments) / self.consecutive_divisor
|
||||
)
|
||||
self.last_was_increment = True
|
||||
if self.sleep_interval > self.sleep_max:
|
||||
self.sleep_interval = self.sleep_max
|
||||
self.log.info(
|
||||
f"CPU {current_cpu_usage}% > {self.target_cpu_usage}%, "
|
||||
f"=> sleep {self.sleep_interval:.3f}s"
|
||||
)
|
||||
elif current_cpu_usage < self.target_cpu_usage and self.sleep_interval > self.sleep_min:
|
||||
self.sleep_interval -= self.sleep_decrement
|
||||
self.log.info(
|
||||
f"CPU {current_cpu_usage}% < {self.target_cpu_usage}%, "
|
||||
f"=> sleep {self.sleep_interval:.3f}s"
|
||||
# self.log.debug(f"High CPU, but not increasing above {self.sleep_max:.3f}s")
|
||||
# self.log.debug(
|
||||
# f"High CPU: {current_cpu_usage}% > {self.target_cpu_usage}%, "
|
||||
# f"=> sleep {self.sleep_interval:.3f}s"
|
||||
# )
|
||||
elif current_cpu_usage < self.target_cpu_usage:
|
||||
if not self.last_was_increment:
|
||||
self.consecutive_decrements += 1
|
||||
# self.log.debug(f"Low CPU consecutive decrements: {self.consecutive_decrements}")
|
||||
else:
|
||||
self.consecutive_decrements = 0 # ?
|
||||
self.consecutive_increments = 0 # ?
|
||||
# self.log.debug(f"Low CPU alert reset.")
|
||||
self.sleep_interval -= self.sleep_decrement * (
|
||||
max(1, self.consecutive_decrements) / self.consecutive_divisor
|
||||
)
|
||||
self.last_was_increment = False
|
||||
if self.sleep_interval < self.sleep_min:
|
||||
self.sleep_interval = self.sleep_min
|
||||
# self.log.debug(f"Low CPU, but not decreasing below {self.sleep_min:.3f}s")
|
||||
# self.log.debug(
|
||||
# f"Low CPU: {current_cpu_usage}% < {self.target_cpu_usage}%, "
|
||||
# f"=> sleep {self.sleep_interval:.3f}s"
|
||||
# )
|
||||
|
||||
if self.sleep_interval > 0:
|
||||
time.sleep(self.sleep_interval)
|
||||
time.sleep(self.sleep_interval)
|
||||
return self.sleep_interval
|
||||
return 0.0
|
||||
|
||||
Reference in New Issue
Block a user