diff --git a/cgroups/fs/memory.go b/cgroups/fs/memory.go index 2e417877..dccdee69 100644 --- a/cgroups/fs/memory.go +++ b/cgroups/fs/memory.go @@ -62,6 +62,11 @@ func (s *MemoryGroup) Set(path string, cgroup *configs.Cgroup) error { return err } } + if cgroup.MemorySwappiness >= 0 && cgroup.MemorySwappiness <= 100 { + if err := writeFile(path, "memory.swappiness", strconv.FormatInt(cgroup.MemorySwappiness, 10)); err != nil { + return err + } + } return nil } diff --git a/cgroups/fs/memory_test.go b/cgroups/fs/memory_test.go index 527cc089..25cd5a1d 100644 --- a/cgroups/fs/memory_test.go +++ b/cgroups/fs/memory_test.go @@ -113,6 +113,34 @@ func TestMemorySetKernelMemory(t *testing.T) { } } +func TestMemorySetMemorySwappinessDefault(t *testing.T) { + helper := NewCgroupTestUtil("memory", t) + defer helper.cleanup() + + const ( + swappinessBefore = 60 //deafult is 60 + swappinessAfter = 0 + ) + + helper.writeFileContents(map[string]string{ + "memory.swappiness": strconv.Itoa(swappinessBefore), + }) + + helper.CgroupData.c.Memory = swappinessAfter + memory := &MemoryGroup{} + if err := memory.Set(helper.CgroupPath, helper.CgroupData.c); err != nil { + t.Fatal(err) + } + + value, err := getCgroupParamUint(helper.CgroupPath, "memory.swappiness") + if err != nil { + t.Fatalf("Failed to parse memory.swappiness - %s", err) + } + if value != swappinessAfter { + t.Fatal("Got the wrong value, set memory.swappiness failed.") + } +} + func TestMemoryStats(t *testing.T) { helper := NewCgroupTestUtil("memory", t) defer helper.cleanup() diff --git a/cgroups/systemd/apply_systemd.go b/cgroups/systemd/apply_systemd.go index c139b02b..fd7f680b 100644 --- a/cgroups/systemd/apply_systemd.go +++ b/cgroups/systemd/apply_systemd.go @@ -482,6 +482,12 @@ func joinMemory(c *configs.Cgroup, pid int) error { return err } } + if c.MemorySwappiness >= 0 && c.MemorySwappiness <= 100 { + err = writeFile(path, "memory.swappiness", strconv.FormatInt(c.MemorySwappiness, 10)) + if err != nil { + return err + } + } return nil } diff --git a/configs/cgroup.go b/configs/cgroup.go index 88b2a71d..140b530d 100644 --- a/configs/cgroup.go +++ b/configs/cgroup.go @@ -87,6 +87,9 @@ type Cgroup struct { // Whether to disable OOM Killer OomKillDisable bool `json:"oom_kill_disable"` + // Tuning swappiness behaviour per cgroup + MemorySwappiness int64 `json:"memory_swappiness"` + // Set priority of network traffic for container NetPrioIfpriomap []*IfPrioMap `json:"net_prio_ifpriomap"`