1
0
mirror of https://github.com/kata-containers/kata-containers.git synced 2025-05-10 09:27:03 +00:00

agent: Fix CPU usage reporting for cgroup v2 in kata-agent

kata-agent incorrectly reports CPU time for cgroup v2, causing 1000x underreporting.

For cgroup v2, kata-agent reads the cpu.stat file, which reports the time consumed by the processes in the cgroup in µs.
However, there was a bug in kata-agent where it returned this value in µs without converting it to ns.

This commit adds the necessary µs to ns conversion for cgroup v2, aligning it with v1 behavior and kata-shim's expectations.

This fixes 

Signed-off-by: Alex Man <alexman@stripe.com>
This commit is contained in:
Alex Man 2024-09-09 15:25:36 -07:00
parent 6f8897249b
commit 7e400f7bb2

View File

@ -724,9 +724,20 @@ fn get_cpuacct_stats(cg: &cgroups::Cgroup) -> MessageField<CpuUsage> {
let cpu_controller: &CpuController = get_controller_or_return_singular_none!(cg);
let stat = cpu_controller.cpu().stat;
let h = lines_to_map(&stat);
let usage_in_usermode = *h.get("user_usec").unwrap_or(&0);
let usage_in_kernelmode = *h.get("system_usec").unwrap_or(&0);
let total_usage = *h.get("usage_usec").unwrap_or(&0);
// All fields in CpuUsage are expressed in nanoseconds (ns).
//
// For cgroup v1 (cpuacct controller):
// kata-agent reads the cpuacct.stat file, which reports the number of ticks
// consumed by the processes in the cgroup. It then converts these ticks to nanoseconds.
// Ref: https://www.kernel.org/doc/Documentation/cgroup-v1/cpuacct.txt
//
// For cgroup v2 (cpu controller):
// kata-agent reads the cpu.stat file, which reports the time consumed by the
// processes in the cgroup in microseconds (us). It then converts microseconds to nanoseconds.
// Ref: https://www.kernel.org/doc/Documentation/cgroup-v2.txt, section 5-1-1. CPU Interface Files
let usage_in_usermode = *h.get("user_usec").unwrap_or(&0) * 1000;
let usage_in_kernelmode = *h.get("system_usec").unwrap_or(&0) * 1000;
let total_usage = *h.get("usage_usec").unwrap_or(&0) * 1000;
let percpu_usage = vec![];
MessageField::some(CpuUsage {