如何获取 podman 容器的 cgroup 路径?

如何获取 podman 容器的 cgroup 路径?

有没有办法获取 podman 容器的 cgroup 根路径?

似乎podman inspect没有透露任何有关 cgroup 的信息。

我发现的一种“hacky”方法是做类似的事情

# Run the container, writing its container ID to /tmp/cid
podman run --rm -it --cidfile=/tmp/cid busybox

# Search /sys/fs/cgroup for the CID
cid=$(cat /tmp/cid)
find /sys/fs/cgroup | grep "/libpod-$cid/" | grep '/cpu,cpuacct/' | grep '/cpuacct.usage'
# prints something like: /sys/fs/cgroup/cpu,cpuacct/libpod_parent/libpod-abc123.../cpuacct.usage

但我对这个解决方案并不满意,因为:

  • 它需要低效的搜索 ( find)
  • 不确定 的搜索路径是否/sys/fs/cgroup保证正确
  • 如果正在使用 cgroup v2,我正在查找的文件可能具有不同的基本名称(例如,它可能memory.current代替memory.usage_in_bytescgroup v2)

有没有更直接的方法使用 podman 或 Go SDK 之一来获取此信息?

答案1

您需要知道的只是容器 ID。没有必要使用findor grep;您只需在正确的位置插入容器 ID 即可构建所需的显式路径。

其中cgroupsv2,基本路径为/sys/fs/cgroup/machine.slice/libpod-<container_id>.scope。在该目录下,您会发现:

cgroup...
container...
cpu...
cpuset...
hugetlb...
io...
memory...
pids...

cgroupvs1,路径是/sys/fs/cgroup/<cgroup>/machine.slice/libpod-<container_id>.scope。因此,如果您想要cpu,cpuacctcgroup,您需要:

$ ls /sys/fs/cgroup/cpu,cpuacct/machine.slice/libpod-756bf46cd9ff1f509f65d063b69e42a5a560b9d29608ec48ec7466880b26d65e.scope
cgroup.clone_children
cgroup.procs
cpu.cfs_period_us
cpu.cfs_quota_us
cpu.rt_period_us
cpu.rt_runtime_us
cpu.shares
cpu.stat
cpuacct.stat
cpuacct.usage
cpuacct.usage_all
cpuacct.usage_percpu
cpuacct.usage_percpu_sys
cpuacct.usage_percpu_user
cpuacct.usage_sys
cpuacct.usage_user
notify_on_release
tasks

相关内容