Skip to content

Commit 360fd8b

Browse files
authored
Merge pull request #391 from fuweid/update-cgroupv2-memory
cgroup2: expose split workingset memory stats
2 parents aa6a9dc + 1266be0 commit 360fd8b

8 files changed

Lines changed: 353 additions & 191 deletions

File tree

.github/workflows/ci.yml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -193,11 +193,17 @@ jobs:
193193
go-version: '1.22.x'
194194
cache-dependency-path: src/github.com/containerd/cgroups
195195

196+
- name: Read buf version
197+
id: buf-version
198+
working-directory: src/github.com/containerd/cgroups
199+
run: echo "version=$(cat script/buf-version)" >> $GITHUB_OUTPUT
200+
196201
- name: Install buf
197202
uses: bufbuild/buf-action@v1
198203
with:
199204
# We use the action to install buf.
200205
setup_only: true
206+
version: ${{ steps.buf-version.outputs.version }}
201207

202208
- name: Install go-fix-acronym
203209
run: go install github.com/containerd/protobuild/cmd/go-fix-acronym@v0.3.0

cgroup2/manager.go

Lines changed: 42 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -665,44 +665,48 @@ func readMemoryStats(cgroupPath string) (*stats.MemoryStat, error) {
665665
return nil, err
666666
}
667667
return &stats.MemoryStat{
668-
Anon: memoryStat["anon"],
669-
File: memoryStat["file"],
670-
KernelStack: memoryStat["kernel_stack"],
671-
Slab: memoryStat["slab"],
672-
Sock: memoryStat["sock"],
673-
Shmem: memoryStat["shmem"],
674-
FileMapped: memoryStat["file_mapped"],
675-
FileDirty: memoryStat["file_dirty"],
676-
FileWriteback: memoryStat["file_writeback"],
677-
AnonThp: memoryStat["anon_thp"],
678-
InactiveAnon: memoryStat["inactive_anon"],
679-
ActiveAnon: memoryStat["active_anon"],
680-
InactiveFile: memoryStat["inactive_file"],
681-
ActiveFile: memoryStat["active_file"],
682-
Unevictable: memoryStat["unevictable"],
683-
SlabReclaimable: memoryStat["slab_reclaimable"],
684-
SlabUnreclaimable: memoryStat["slab_unreclaimable"],
685-
Pgfault: memoryStat["pgfault"],
686-
Pgmajfault: memoryStat["pgmajfault"],
687-
WorkingsetRefault: memoryStat["workingset_refault"],
688-
WorkingsetActivate: memoryStat["workingset_activate"],
689-
WorkingsetNodereclaim: memoryStat["workingset_nodereclaim"],
690-
Pgrefill: memoryStat["pgrefill"],
691-
Pgscan: memoryStat["pgscan"],
692-
Pgsteal: memoryStat["pgsteal"],
693-
Pgactivate: memoryStat["pgactivate"],
694-
Pgdeactivate: memoryStat["pgdeactivate"],
695-
Pglazyfree: memoryStat["pglazyfree"],
696-
Pglazyfreed: memoryStat["pglazyfreed"],
697-
ThpFaultAlloc: memoryStat["thp_fault_alloc"],
698-
ThpCollapseAlloc: memoryStat["thp_collapse_alloc"],
699-
Usage: getStatFileContentUint64(filepath.Join(cgroupPath, "memory.current")),
700-
UsageLimit: getStatFileContentUint64(filepath.Join(cgroupPath, "memory.max")),
701-
MaxUsage: getStatFileContentUint64(filepath.Join(cgroupPath, "memory.peak")),
702-
SwapUsage: getStatFileContentUint64(filepath.Join(cgroupPath, "memory.swap.current")),
703-
SwapLimit: getStatFileContentUint64(filepath.Join(cgroupPath, "memory.swap.max")),
704-
SwapMaxUsage: getStatFileContentUint64(filepath.Join(cgroupPath, "memory.swap.peak")),
705-
PSI: getStatPSIFromFile(filepath.Join(cgroupPath, "memory.pressure")),
668+
Anon: memoryStat["anon"],
669+
File: memoryStat["file"],
670+
KernelStack: memoryStat["kernel_stack"],
671+
Slab: memoryStat["slab"],
672+
Sock: memoryStat["sock"],
673+
Shmem: memoryStat["shmem"],
674+
FileMapped: memoryStat["file_mapped"],
675+
FileDirty: memoryStat["file_dirty"],
676+
FileWriteback: memoryStat["file_writeback"],
677+
AnonThp: memoryStat["anon_thp"],
678+
InactiveAnon: memoryStat["inactive_anon"],
679+
ActiveAnon: memoryStat["active_anon"],
680+
InactiveFile: memoryStat["inactive_file"],
681+
ActiveFile: memoryStat["active_file"],
682+
Unevictable: memoryStat["unevictable"],
683+
SlabReclaimable: memoryStat["slab_reclaimable"],
684+
SlabUnreclaimable: memoryStat["slab_unreclaimable"],
685+
Pgfault: memoryStat["pgfault"],
686+
Pgmajfault: memoryStat["pgmajfault"],
687+
WorkingsetRefault: memoryStat["workingset_refault"],
688+
WorkingsetActivate: memoryStat["workingset_activate"],
689+
WorkingsetNodereclaim: memoryStat["workingset_nodereclaim"],
690+
Pgrefill: memoryStat["pgrefill"],
691+
WorkingsetRefaultAnon: memoryStat["workingset_refault_anon"],
692+
WorkingsetRefaultFile: memoryStat["workingset_refault_file"],
693+
WorkingsetActivateAnon: memoryStat["workingset_activate_anon"],
694+
WorkingsetActivateFile: memoryStat["workingset_activate_file"],
695+
Pgscan: memoryStat["pgscan"],
696+
Pgsteal: memoryStat["pgsteal"],
697+
Pgactivate: memoryStat["pgactivate"],
698+
Pgdeactivate: memoryStat["pgdeactivate"],
699+
Pglazyfree: memoryStat["pglazyfree"],
700+
Pglazyfreed: memoryStat["pglazyfreed"],
701+
ThpFaultAlloc: memoryStat["thp_fault_alloc"],
702+
ThpCollapseAlloc: memoryStat["thp_collapse_alloc"],
703+
Usage: getStatFileContentUint64(filepath.Join(cgroupPath, "memory.current")),
704+
UsageLimit: getStatFileContentUint64(filepath.Join(cgroupPath, "memory.max")),
705+
MaxUsage: getStatFileContentUint64(filepath.Join(cgroupPath, "memory.peak")),
706+
SwapUsage: getStatFileContentUint64(filepath.Join(cgroupPath, "memory.swap.current")),
707+
SwapLimit: getStatFileContentUint64(filepath.Join(cgroupPath, "memory.swap.max")),
708+
SwapMaxUsage: getStatFileContentUint64(filepath.Join(cgroupPath, "memory.swap.peak")),
709+
PSI: getStatPSIFromFile(filepath.Join(cgroupPath, "memory.pressure")),
706710
}, nil
707711
}
708712

cgroup2/memoryv2_test.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,24 @@ func TestCgroupv2MemoryStats(t *testing.T) {
5151
checkFileContent(t, c.path, "memory.max", "629145600")
5252
}
5353

54+
func TestReadMemoryStatsWorkingsetBreakdown(t *testing.T) {
55+
cgroupPath := t.TempDir()
56+
err := os.WriteFile(
57+
fmt.Sprintf("%s/memory.stat", cgroupPath),
58+
[]byte("workingset_refault_anon 1\nworkingset_refault_file 2\nworkingset_activate_anon 3\nworkingset_activate_file 4\n"),
59+
0o644,
60+
)
61+
require.NoError(t, err)
62+
63+
stats, err := readMemoryStats(cgroupPath)
64+
require.NoError(t, err)
65+
66+
assert.Equal(t, uint64(1), stats.WorkingsetRefaultAnon)
67+
assert.Equal(t, uint64(2), stats.WorkingsetRefaultFile)
68+
assert.Equal(t, uint64(3), stats.WorkingsetActivateAnon)
69+
assert.Equal(t, uint64(4), stats.WorkingsetActivateFile)
70+
}
71+
5472
func TestSystemdCgroupMemoryController(t *testing.T) {
5573
checkCgroupMode(t)
5674
group := fmt.Sprintf("testing-memory-%d.scope", os.Getpid())

0 commit comments

Comments
 (0)