Skip to content

Commit ff710f6

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

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
@@ -224,6 +224,14 @@ func (s *MemoryGroup) GetStats(path string, stats *cgroups.Stats) error {
224224
}
225225
stats.MemoryStats.KernelTCPUsage = kernelTCPUsage
226226

227+
use_hierarchy := strings.Join([]string{"memory", "use_hierarchy"}, ".")
228+
value, err := getCgroupParamUint(path, use_hierarchy)
229+
if err != nil {
230+
return err
231+
}
232+
if value == 1 {
233+
stats.MemoryStats.UseHierarchy = true
234+
}
227235
return nil
228236
}
229237

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) {
@@ -314,6 +315,7 @@ func TestMemoryStats(t *testing.T) {
314315
"memory.kmem.max_usage_in_bytes": memoryMaxUsageContents,
315316
"memory.kmem.failcnt": memoryFailcnt,
316317
"memory.kmem.limit_in_bytes": memoryLimitContents,
318+
"memory.use_hierarchy": memoryUseHierarchyContents,
317319
})
318320

319321
memory := &MemoryGroup{}
@@ -322,7 +324,7 @@ func TestMemoryStats(t *testing.T) {
322324
if err != nil {
323325
t.Fatal(err)
324326
}
325-
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}}
327+
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}
326328
expectMemoryStatEquals(t, expectedStats, actualStats.MemoryStats)
327329
}
328330

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)