0

Context

I have a system in which I have to check periodically usage:

  • relative (percents) for CPU
  • and absolute (GB) for memory.

How it's currently implemented

Language we're using is python.

system-wide psutil

For system-wide stats it's trivial since we can use psutil.cpu_percent() and psutil.virtual_memory().

cgroup (v1)

The problem is that sometimes the script is run inside container, and then we'd like to monitor usage of particular cgroup instead of system-wide statistics.

There's already implementation for cgroups in our system which bases on:

  • for CPU:
    • cpu.cfs_period_us
    • cpu.cfs_quota_us
    • cpuacct.usage
  • for memory:
    • memory.usage_in_bytes
    • memory.limit_in_bytes

What I need

Here I need an answer for two questions:

  • Is the present implementation based on reading values directly from files ok for cgroup?
  • If no, are there any tools which supports obtaining such kind of information easily.
  • If yes, how can I adapt this solution to cgroup2?

Why current solution doesn't work for cgroup2

The main problem I have now is lack of support for cgroup2 since current implementation is based on nested files structure.

cgroup on Ubuntu 20.04

$ cat /proc/mounts | grep cgroup
tmpfs /sys/fs/cgroup tmpfs ro,nosuid,nodev,noexec,mode=755 0 0
cgroup2 /sys/fs/cgroup/unified cgroup2 rw,nosuid,nodev,noexec,relatime,nsdelegate 0 0
cgroup /sys/fs/cgroup/systemd cgroup rw,nosuid,nodev,noexec,relatime,xattr,name=systemd 0 0
cgroup /sys/fs/cgroup/rdma cgroup rw,nosuid,nodev,noexec,relatime,rdma 0 0
cgroup /sys/fs/cgroup/cpuset cgroup rw,nosuid,nodev,noexec,relatime,cpuset 0 0
cgroup /sys/fs/cgroup/devices cgroup rw,nosuid,nodev,noexec,relatime,devices 0 0
cgroup /sys/fs/cgroup/perf_event cgroup rw,nosuid,nodev,noexec,relatime,perf_event 0 0
cgroup /sys/fs/cgroup/freezer cgroup rw,nosuid,nodev,noexec,relatime,freezer 0 0
cgroup /sys/fs/cgroup/pids cgroup rw,nosuid,nodev,noexec,relatime,pids 0 0
cgroup /sys/fs/cgroup/memory cgroup rw,nosuid,nodev,noexec,relatime,memory 0 0
cgroup /sys/fs/cgroup/net_cls,net_prio cgroup rw,nosuid,nodev,noexec,relatime,net_cls,net_prio 0 0
cgroup /sys/fs/cgroup/blkio cgroup rw,nosuid,nodev,noexec,relatime,blkio 0 0
cgroup /sys/fs/cgroup/cpu,cpuacct cgroup rw,nosuid,nodev,noexec,relatime,cpu,cpuacct 0 0
cgroup /sys/fs/cgroup/hugetlb cgroup rw,nosuid,nodev,noexec,relatime,hugetlb 0 0

cgroup2 on Ubuntu 22.04

$ cat /proc/mounts | grep cgroup
cgroup2 /sys/fs/cgroup cgroup2 rw,nosuid,nodev,noexec,relatime 0 0
Jakub Kuszneruk
  • 1,188
  • 1
  • 12
  • 37
  • sooo why not use zabbix, nagios, prometheus, anything existing? https://en.wikipedia.org/wiki/Comparison_of_network_monitoring_systems – KamilCuk Nov 24 '22 at 12:51
  • This module is part of our existing library we publish for clients. It's one of our features, we had to implement, but at the same time we want our library to not rely on external dependencies if necessary. Tools like Zabbix are just overkill in this case. – Jakub Kuszneruk Nov 24 '22 at 12:56

0 Answers0