Source code for neclib.core.security.load_check
import time
from typing import Dict, Optional, Tuple
import astropy.units as u
import psutil
from astropy.units import Quantity
[docs]class LoadChecker:
cpu_count = psutil.cpu_count()
"""Number of logical processors.
Number of threads that can be handled simultaneously. Normally this is the same as
the number of CPU cores. If simultaneous multi-threading is enabled (e.g., Intel's
Hyper-Threading technology), this value would be larger than the number of CPU
cores.
"""
def __init__(self):
self._last_netcount: Optional[Dict[str, float]] = None
# Ensure that the first call of methods returns meaningful values.
self.cpu_usage()
self.network_amount()
[docs] def cpu_usage(self) -> Quantity:
"""Mean CPU usage since last call.
This method averages the usage from last call or class initialization.
"""
usage = psutil.cpu_percent(interval=None, percpu=True)
return usage * u.percent
[docs] def loadavg(self) -> Tuple[float, float, float]:
"""Load average per processor.
Returns
-------
Number of processes using or waiting to use the processor, averaged over all
logical processors. The load is averaged over time duration of 1min, 5min, and
15min.
"""
return tuple(load / self.cpu_count for load in psutil.getloadavg())
[docs] def memory_available(self) -> Quantity:
"""Available memory."""
return psutil.virtual_memory().available * u.byte
[docs] def disk_usage(self) -> Quantity:
"""Disk (storage) usage."""
return psutil.disk_usage("/").percent * u.percent
[docs] def network_amount(self) -> Dict[str, Quantity]:
"""Network communication amount.
This method averages the data rate from last call or class initialization.
"""
netcount = psutil.net_io_counters()
current_netcount: Dict[str, float] = {
"sent": netcount.bytes_sent,
"recv": netcount.bytes_recv,
"time": time.monotonic(),
}
if self._last_netcount is None:
self._last_netcount = current_netcount
return {"sent": 0 * u.byte / u.s, "recv": 0 * u.byte / u.s}
dt = current_netcount["time"] - self._last_netcount["time"]
dsent = netcount.bytes_sent - self._last_netcount["sent"]
drecv = netcount.bytes_recv - self._last_netcount["recv"]
self._last_netcount = current_netcount
return {"sent": dsent / dt * u.byte / u.s, "recv": drecv / dt * u.byte / u.s}