use psutil for calcilate cpu utilization on get_cpu_stats

This commit is contained in:
Sergey Krashevich 2023-05-03 03:59:17 +03:00
parent 5ba48d6313
commit 61ffbab513
No known key found for this signature in database
GPG Key ID: 625171324E7D3856

View File

@ -799,28 +799,11 @@ def get_cpu_stats() -> dict[str, dict]:
docker_memlimit = get_docker_memlimit_bytes() / 1024
total_mem = os.sysconf("SC_PAGE_SIZE") * os.sysconf("SC_PHYS_PAGES") / 1024
for pid in os.listdir("/proc"):
if pid.isdigit():
for process in psutil.process_iter(['pid', 'name', 'cpu_percent']):
pid = process.info['pid']
try:
with open(f"/proc/{pid}/stat", "r") as f:
stats = f.readline().split()
utime = int(stats[13])
stime = int(stats[14])
starttime = int(stats[21])
with open("/proc/uptime") as f:
system_uptime_sec = int(float(f.read().split()[0]))
clk_tck = os.sysconf(os.sysconf_names["SC_CLK_TCK"])
process_utime_sec = utime // clk_tck
process_stime_sec = stime // clk_tck
process_starttime_sec = starttime // clk_tck
process_elapsed_sec = system_uptime_sec - process_starttime_sec
process_usage_sec = process_utime_sec + process_stime_sec
cpu_usage = process_usage_sec * 100 // process_elapsed_sec
cpu_percent = process.info['cpu_percent']
with open(f"/proc/{pid}/statm", "r") as f:
mem_stats = f.readline().split()
mem_res = int(mem_stats[1]) * os.sysconf("SC_PAGE_SIZE") / 1024
@ -831,7 +814,7 @@ def get_cpu_stats() -> dict[str, dict]:
mem_pct = round((mem_res / total_mem) * 100, 1)
usages[pid] = {
"cpu": str(round(cpu_usage, 2)),
"cpu": str(cpu_percent),
"mem": f"{mem_pct}",
}
except: