libcontainer: cgroups: add support for kmem.tcp limits
Kernel TCP memory has its own special knobs inside the cgroup. Signed-off-by: Aleksa Sarai <asarai@suse.de>
This commit is contained in:
parent
54a6e56004
commit
1448fe9568
|
@ -81,6 +81,11 @@ func (s *MemoryGroup) Set(path string, cgroup *configs.Cgroup) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if cgroup.Resources.KernelMemoryTCP != 0 {
|
||||||
|
if err := writeFile(path, "memory.kmem.tcp.limit_in_bytes", strconv.FormatInt(cgroup.Resources.KernelMemoryTCP, 10)); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
if cgroup.Resources.OomKillDisable {
|
if cgroup.Resources.OomKillDisable {
|
||||||
if err := writeFile(path, "memory.oom_control", "1"); err != nil {
|
if err := writeFile(path, "memory.oom_control", "1"); err != nil {
|
||||||
return err
|
return err
|
||||||
|
@ -148,6 +153,7 @@ func memoryAssigned(cgroup *configs.Cgroup) bool {
|
||||||
cgroup.Resources.MemoryReservation != 0 ||
|
cgroup.Resources.MemoryReservation != 0 ||
|
||||||
cgroup.Resources.MemorySwap > 0 ||
|
cgroup.Resources.MemorySwap > 0 ||
|
||||||
cgroup.Resources.KernelMemory > 0 ||
|
cgroup.Resources.KernelMemory > 0 ||
|
||||||
|
cgroup.Resources.KernelMemoryTCP > 0 ||
|
||||||
cgroup.Resources.OomKillDisable ||
|
cgroup.Resources.OomKillDisable ||
|
||||||
(cgroup.Resources.MemorySwappiness != nil && *cgroup.Resources.MemorySwappiness != -1)
|
(cgroup.Resources.MemorySwappiness != nil && *cgroup.Resources.MemorySwappiness != -1)
|
||||||
}
|
}
|
||||||
|
|
|
@ -114,6 +114,34 @@ func TestMemorySetKernelMemory(t *testing.T) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestMemorySetKernelMemoryTCP(t *testing.T) {
|
||||||
|
helper := NewCgroupTestUtil("memory", t)
|
||||||
|
defer helper.cleanup()
|
||||||
|
|
||||||
|
const (
|
||||||
|
kernelMemoryTCPBefore = 314572800 // 300M
|
||||||
|
kernelMemoryTCPAfter = 524288000 // 500M
|
||||||
|
)
|
||||||
|
|
||||||
|
helper.writeFileContents(map[string]string{
|
||||||
|
"memory.kmem.tcp.limit_in_bytes": strconv.Itoa(kernelMemoryTCPBefore),
|
||||||
|
})
|
||||||
|
|
||||||
|
helper.CgroupData.config.Resources.KernelMemory = kernelMemoryTCPAfter
|
||||||
|
memory := &MemoryGroup{}
|
||||||
|
if err := memory.Set(helper.CgroupPath, helper.CgroupData.config); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
value, err := getCgroupParamUint(helper.CgroupPath, "memory.kmem.tcp.limit_in_bytes")
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("Failed to parse memory.kmem.tcp.limit_in_bytes - %s", err)
|
||||||
|
}
|
||||||
|
if value != kernelMemoryTCPAfter {
|
||||||
|
t.Fatal("Got the wrong value, set memory.kmem.tcp.limit_in_bytes failed.")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestMemorySetMemorySwappinessDefault(t *testing.T) {
|
func TestMemorySetMemorySwappinessDefault(t *testing.T) {
|
||||||
helper := NewCgroupTestUtil("memory", t)
|
helper := NewCgroupTestUtil("memory", t)
|
||||||
defer helper.cleanup()
|
defer helper.cleanup()
|
||||||
|
|
|
@ -56,6 +56,9 @@ type Resources struct {
|
||||||
// Kernel memory limit (in bytes)
|
// Kernel memory limit (in bytes)
|
||||||
KernelMemory int64 `json:"kernel_memory"`
|
KernelMemory int64 `json:"kernel_memory"`
|
||||||
|
|
||||||
|
// Kernel memory limit for TCP use (in bytes)
|
||||||
|
KernelMemoryTCP int64 `json:"kernel_memory_tcp"`
|
||||||
|
|
||||||
// CPU shares (relative weight vs. other containers)
|
// CPU shares (relative weight vs. other containers)
|
||||||
CpuShares int64 `json:"cpu_shares"`
|
CpuShares int64 `json:"cpu_shares"`
|
||||||
|
|
||||||
|
|
3
spec.go
3
spec.go
|
@ -382,6 +382,9 @@ func createCgroupConfig(name string, spec *specs.Spec) (*configs.Cgroup, error)
|
||||||
if r.Memory.Kernel != nil {
|
if r.Memory.Kernel != nil {
|
||||||
c.Resources.KernelMemory = int64(*r.Memory.Kernel)
|
c.Resources.KernelMemory = int64(*r.Memory.Kernel)
|
||||||
}
|
}
|
||||||
|
if r.Memory.KernelTCP != nil {
|
||||||
|
c.Resources.KernelMemoryTCP = int64(*r.Memory.KernelTCP)
|
||||||
|
}
|
||||||
if r.Memory.Swappiness != nil {
|
if r.Memory.Swappiness != nil {
|
||||||
swappiness := int64(*r.Memory.Swappiness)
|
swappiness := int64(*r.Memory.Swappiness)
|
||||||
c.Resources.MemorySwappiness = &swappiness
|
c.Resources.MemorySwappiness = &swappiness
|
||||||
|
|
Loading…
Reference in New Issue