Merge pull request #591 from hqhq/hq_add_kmemlimit

Add support for kmem limit
This commit is contained in:
Alexander Morozov 2015-05-15 08:45:19 -07:00
commit 5562cadd49
4 changed files with 60 additions and 14 deletions

View File

@ -54,6 +54,11 @@ func (s *MemoryGroup) Set(path string, cgroup *configs.Cgroup) error {
return err return err
} }
} }
if cgroup.KernelMemory > 0 {
if err := writeFile(path, "memory.kmem.limit_in_bytes", strconv.FormatInt(cgroup.KernelMemory, 10)); err != nil {
return err
}
}
if cgroup.OomKillDisable { if cgroup.OomKillDisable {
if err := writeFile(path, "memory.oom_control", "1"); err != nil { if err := writeFile(path, "memory.oom_control", "1"); err != nil {

View File

@ -112,6 +112,34 @@ func TestMemorySetMemoryswapDefault(t *testing.T) {
} }
} }
func TestMemorySetKernelMemory(t *testing.T) {
helper := NewCgroupTestUtil("memory", t)
defer helper.cleanup()
const (
kernelMemoryBefore = 314572800 // 300M
kernelMemoryAfter = 524288000 // 500M
)
helper.writeFileContents(map[string]string{
"memory.kmem.limit_in_bytes": strconv.Itoa(kernelMemoryBefore),
})
helper.CgroupData.c.KernelMemory = kernelMemoryAfter
memory := &MemoryGroup{}
if err := memory.Set(helper.CgroupPath, helper.CgroupData.c); err != nil {
t.Fatal(err)
}
value, err := getCgroupParamUint(helper.CgroupPath, "memory.kmem.limit_in_bytes")
if err != nil {
t.Fatalf("Failed to parse memory.kmem.limit_in_bytes - %s", err)
}
if value != kernelMemoryAfter {
t.Fatal("Got the wrong value, set memory.kmem.limit_in_bytes failed.")
}
}
func TestMemoryStats(t *testing.T) { func TestMemoryStats(t *testing.T) {
helper := NewCgroupTestUtil("memory", t) helper := NewCgroupTestUtil("memory", t)
defer helper.cleanup() defer helper.cleanup()

View File

@ -200,14 +200,10 @@ func (m *Manager) Apply(pid int) error {
return err return err
} }
// -1 disables memorySwap
if c.MemorySwap >= 0 && c.Memory != 0 {
if err := joinMemory(c, pid); err != nil { if err := joinMemory(c, pid); err != nil {
return err return err
} }
}
// we need to manually join the freezer, net_prio and cpuset cgroup in systemd // we need to manually join the freezer, net_prio and cpuset cgroup in systemd
// because it does not currently support it via the dbus api. // because it does not currently support it via the dbus api.
if err := joinFreezer(c, pid); err != nil { if err := joinFreezer(c, pid); err != nil {
@ -435,19 +431,33 @@ func joinDevices(c *configs.Cgroup, pid int) error {
} }
func joinMemory(c *configs.Cgroup, pid int) error { func joinMemory(c *configs.Cgroup, pid int) error {
path, err := getSubsystemPath(c, "memory")
if err != nil && !cgroups.IsNotFound(err) {
return err
}
// -1 disables memoryswap
if c.Memory != 0 && c.MemorySwap >= 0 {
memorySwap := c.MemorySwap memorySwap := c.MemorySwap
if memorySwap == 0 { if memorySwap == 0 {
// By default, MemorySwap is set to twice the size of RAM. // By default, MemorySwap is set to twice the size of RAM.
memorySwap = c.Memory * 2 memorySwap = c.Memory * 2
} }
err = writeFile(path, "memory.memsw.limit_in_bytes", strconv.FormatInt(memorySwap, 10))
path, err := getSubsystemPath(c, "memory") if err != nil {
if err != nil && !cgroups.IsNotFound(err) {
return err return err
} }
}
return writeFile(path, "memory.memsw.limit_in_bytes", strconv.FormatInt(memorySwap, 10)) if c.KernelMemory > 0 {
err = writeFile(path, "memory.kmem.limit_in_bytes", strconv.FormatInt(c.KernelMemory, 10))
if err != nil {
return err
}
}
return nil
} }
// systemd does not atm set up the cpuset controller, so we must manually // systemd does not atm set up the cpuset controller, so we must manually

View File

@ -30,6 +30,9 @@ type Cgroup struct {
// Total memory usage (memory + swap); set `-1' to disable swap // Total memory usage (memory + swap); set `-1' to disable swap
MemorySwap int64 `json:"memory_swap"` MemorySwap int64 `json:"memory_swap"`
// Kernel memory limit (in bytes)
KernelMemory int64 `json:"kernel_memory"`
// CPU shares (relative weight vs. other containers) // CPU shares (relative weight vs. other containers)
CpuShares int64 `json:"cpu_shares"` CpuShares int64 `json:"cpu_shares"`