Skip to content

Commit

Permalink
cgroups: fix memory usage on cgroup v1
Browse files Browse the repository at this point in the history
calculate the memory usage on cgroup v1 using the same logic as cgroup
v2.

Since there is no single "anon" field, calculate the memory usage by
summing the two fields "total_active_anon" and "total_inactive_anon".

Closes: #1642

Closes: https://issues.redhat.com/browse/RHEL-16376

[NO NEW TESTS NEEDED]

Signed-off-by: Giuseppe Scrivano <gscrivan@redhat.com>
(cherry picked from commit 1a9d45c)
  • Loading branch information
giuseppe committed Sep 18, 2024
1 parent 448e039 commit 00ff6a8
Showing 1 changed file with 20 additions and 1 deletion.
21 changes: 20 additions & 1 deletion pkg/cgroups/memory_linux.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,9 @@
package cgroups

import (
"fmt"
"path/filepath"
"strconv"

"github.com/opencontainers/runc/libcontainer/cgroups"
"github.com/opencontainers/runc/libcontainer/cgroups/fs"
Expand Down Expand Up @@ -63,9 +65,26 @@ func (c *linuxMemHandler) Stat(ctr *CgroupControl, m *cgroups.Stats) error {
} else {
memoryRoot = ctr.getCgroupv1Path(Memory)
limitFilename = "memory.limit_in_bytes"
if memUsage.Usage.Usage, err = readFileAsUint64(filepath.Join(memoryRoot, "memory.usage_in_bytes")); err != nil {

path := filepath.Join(memoryRoot, "memory.stat")
values, err := readCgroup2MapPath(path)
if err != nil {
return err
}

// cgroup v1 does not have a single "anon" field, but we can calculate it
// from total_active_anon and total_inactive_anon
memUsage.Usage.Usage = 0
for _, key := range []string{"total_active_anon", "total_inactive_anon"} {
if _, found := values[key]; !found {
continue
}
res, err := strconv.ParseUint(values[key][0], 10, 64)
if err != nil {
return fmt.Errorf("parse %s from %s: %w", key, path, err)
}
memUsage.Usage.Usage += res
}
}

memUsage.Usage.Limit, err = readFileAsUint64(filepath.Join(memoryRoot, limitFilename))
Expand Down

0 comments on commit 00ff6a8

Please sign in to comment.