web-dev-qa-db-ja.com

一定期間のcgroupのCPU使用率の計算

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使用率を計算したい

2
Dylan

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

3
Patrick