import threading # Все структуры AIS-данных (vessels/base_stations/buoys/stats/slots/...) вынесены в # централизованный процесс ais_hub (localhost:8081). Здесь остаётся только функция # измерения загрузки CPU для эндпоинта /api/sysinfo — ais_hub системные метрики не отдаёт. _cpu_prev_jiffies = None _cpu_jiffy_lock = threading.Lock() def _read_cpu_aggregated_jiffies(): """Суммарные jiffies по всем ядрам: первая строка cpu в /proc/stat.""" with open("/proc/stat", "r") as f: line = f.readline() parts = line.split() if not parts or parts[0] != "cpu": return None nums = [int(x) for x in parts[1:]] idle = nums[3] + nums[4] # idle + iowait total = sum(nums) return total, idle def get_cpu_usage_percent(): """ Загрузка CPU в % (0–100), как в htop: разница двух замеров /proc/stat. Первый запрос после старта может вернуть None — ещё нет предыдущего замера. """ global _cpu_prev_jiffies try: cur = _read_cpu_aggregated_jiffies() if cur is None: return None total, idle = cur with _cpu_jiffy_lock: prev = _cpu_prev_jiffies _cpu_prev_jiffies = (total, idle) if prev is None: return None p_total, p_idle = prev dt = total - p_total di = idle - p_idle if dt <= 0: return None busy = dt - di pct = max(0.0, min(100.0, 100.0 * busy / dt)) return round(pct, 1) except Exception: return None