user.slice
のようなcgroupがあり、CPUAccounting=true
が設定されている場合、cpuacct.usage
またはcpuacct.stat
のいずれかを使用して、特定のcgroupのCPU使用率を一定期間(1秒など)計算する方法を考えています。私はcpuacct.usage
を知っています CPU時間を提供します (ナノ秒単位)、これを使用して、ある期間中にその2つのスナップショットを差し引き、システムの合計CPU時間で除算することにより、CPUパーセンテージを計算できます同じ期間(間違っている場合は修正してください)ですが、ある期間の合計CPU時間を取得する方法がわかりません。
一定期間の合計CPU時間を取得したり、別の数式/ cgroup機能を使用してCPU使用率を計算したりする方法はありますか?前もって感謝します :)
注:この情報の一部を提供するsystemd-cgtop
は知っていますが、systemd-cgtop
を解析せずにプログラムでCPU使用率を計算したい
CPU使用率は、CPUがアクティブであった合計時間と壁のクロックの経過時間の比率です。 1つの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
(およびcat
)の呼び出しを避けたい場合は、次のようなものを使用できます:read tstart _ < /proc/uptime
。