如果我有一个类似的 cgroupuser.slice
并已设置,我想知道如何使用或CPUAccounting=true
来计算该特定 cgroup 在一段时间内(例如 1 秒)的 CPU 使用率。我知道cpuacct.usage
cpuacct.stat
cpuacct.usage
提供CPU时间(以纳秒为单位),可以通过减去一段时间内的两个快照并将其除以同一时间段内系统的总 CPU 时间来计算 CPU 百分比(如果我错了,请纠正我) ),但我不确定如何获取一段时间内的总 CPU 时间。
有没有办法获得一段时间内的总 CPU 时间或使用不同的公式/cgroup 功能来计算 CPU 使用率?提前致谢 :)
笔记:我知道systemd-cgtop
,它提供了一些此类信息,但是我想以编程方式计算 CPU 使用率,而无需解析systemd-cgtop
答案1
CPU 使用百分比是 CPU 活动的总时间与墙上时钟的运行时间的比率。如果您尝试将一个 CPU 时间与另一个 CPU 时间进行比较,这不是使用百分比。这个没有名字,它只是一个 CPU 时间与另一个 CPU 时间的比率。
您已经说过您知道如何获取经过的 CPU 时间(通过计算经期前后的 CPU 时间之差),因此只需将其除以挂钟时间即可。
cgroup=$(awk -F: '$2 == "cpu,cpuacct" { print $3 }' /proc/self/cgroup)
tstart=$(date +%s%N)
cstart=$(cat /sys/fs/cgroup/cpu/$cgroup/cpuacct.usage)
sleep 5
tstop=$(date +%s%N)
cstop=$(cat /sys/fs/cgroup/cpu/$cgroup/cpuacct.usage)
bc -l <<EOF
($cstop - $cstart) / ($tstop - $tstart) * 100
EOF
如果您想避免调用date
(and cat
),您可以使用类似:read tstart _ < /proc/uptime
。