Skip to content

Commit 98f3e51

Browse files
Expose memory.use_hierarchy in MemoryStats
Signed-off-by: Derek Carr <[email protected]>
1 parent a4c49f5 commit 98f3e51

File tree

4 files changed

+22
-5
lines changed

4 files changed

+22
-5
lines changed

libcontainer/cgroups/fs/memory.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -243,6 +243,14 @@ func (s *MemoryGroup) GetStats(path string, stats *cgroups.Stats) error {
243243
}
244244
stats.MemoryStats.KernelTCPUsage = kernelTCPUsage
245245

246+
use_hierarchy := strings.Join([]string{"memory", "use_hierarchy"}, ".")
247+
value, err := getCgroupParamUint(path, use_hierarchy)
248+
if err != nil {
249+
return err
250+
}
251+
if value == 1 {
252+
stats.MemoryStats.UseHierarchy = true
253+
}
246254
return nil
247255
}
248256

libcontainer/cgroups/fs/memory_test.go

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,11 @@ import (
1212
const (
1313
memoryStatContents = `cache 512
1414
rss 1024`
15-
memoryUsageContents = "2048\n"
16-
memoryMaxUsageContents = "4096\n"
17-
memoryFailcnt = "100\n"
18-
memoryLimitContents = "8192\n"
15+
memoryUsageContents = "2048\n"
16+
memoryMaxUsageContents = "4096\n"
17+
memoryFailcnt = "100\n"
18+
memoryLimitContents = "8192\n"
19+
memoryUseHierarchyContents = "1\n"
1920
)
2021

2122
func TestMemorySetMemory(t *testing.T) {
@@ -273,6 +274,7 @@ func TestMemoryStats(t *testing.T) {
273274
"memory.kmem.max_usage_in_bytes": memoryMaxUsageContents,
274275
"memory.kmem.failcnt": memoryFailcnt,
275276
"memory.kmem.limit_in_bytes": memoryLimitContents,
277+
"memory.use_hierarchy": memoryUseHierarchyContents,
276278
})
277279

278280
memory := &MemoryGroup{}
@@ -281,7 +283,7 @@ func TestMemoryStats(t *testing.T) {
281283
if err != nil {
282284
t.Fatal(err)
283285
}
284-
expectedStats := cgroups.MemoryStats{Cache: 512, Usage: cgroups.MemoryData{Usage: 2048, MaxUsage: 4096, Failcnt: 100, Limit: 8192}, SwapUsage: cgroups.MemoryData{Usage: 2048, MaxUsage: 4096, Failcnt: 100, Limit: 8192}, KernelUsage: cgroups.MemoryData{Usage: 2048, MaxUsage: 4096, Failcnt: 100, Limit: 8192}, Stats: map[string]uint64{"cache": 512, "rss": 1024}}
286+
expectedStats := cgroups.MemoryStats{Cache: 512, Usage: cgroups.MemoryData{Usage: 2048, MaxUsage: 4096, Failcnt: 100, Limit: 8192}, SwapUsage: cgroups.MemoryData{Usage: 2048, MaxUsage: 4096, Failcnt: 100, Limit: 8192}, KernelUsage: cgroups.MemoryData{Usage: 2048, MaxUsage: 4096, Failcnt: 100, Limit: 8192}, Stats: map[string]uint64{"cache": 512, "rss": 1024}, UseHierarchy: true}
285287
expectMemoryStatEquals(t, expectedStats, actualStats.MemoryStats)
286288
}
287289

libcontainer/cgroups/fs/stats_util_test.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,11 @@ func expectMemoryStatEquals(t *testing.T, expected, actual cgroups.MemoryStats)
8484
expectMemoryDataEquals(t, expected.SwapUsage, actual.SwapUsage)
8585
expectMemoryDataEquals(t, expected.KernelUsage, actual.KernelUsage)
8686

87+
if expected.UseHierarchy != actual.UseHierarchy {
88+
logrus.Printf("Expected memory use hiearchy %v, but found %v\n", expected.UseHierarchy, actual.UseHierarchy)
89+
t.Fail()
90+
}
91+
8792
for key, expValue := range expected.Stats {
8893
actValue, ok := actual.Stats[key]
8994
if !ok {

libcontainer/cgroups/stats.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,8 @@ type MemoryStats struct {
5151
KernelUsage MemoryData `json:"kernel_usage,omitempty"`
5252
// usage of kernel TCP memory
5353
KernelTCPUsage MemoryData `json:"kernel_tcp_usage,omitempty"`
54+
// if true, memory usage is accounted for throughout a hierarchy of cgroups.
55+
UseHierarchy bool `json:"use_hierarchy"`
5456

5557
Stats map[string]uint64 `json:"stats,omitempty"`
5658
}

0 commit comments

Comments
 (0)