Ensure panic_on_oom disabled

pull/6/head
derekwaynecarr 2015-10-09 15:39:30 -04:00
parent ed382ec0a0
commit 0ec36ae210
2 changed files with 49 additions and 19 deletions

View File

@ -142,26 +142,48 @@ func createManager(containerName string) *fs.Manager {
}
}
const sysctlVmOvercommitMemory = "vm/overcommit_memory"
// TODO: plumb this up as a flag to Kubelet in a future PR
type KernelTunableBehavior string
// disableKernelMemoryOvercommitHandling tells the kernel to perform no memory over-commit handling.
// Under this setting, the potential for memory overload is increased, but so is performance for
// memory-intensive tasks
// sets /proc/sys/vm/overcommit_memory to 1
func disableKernelMemoryOvercommitHandling() error {
val, err := utilsysctl.GetSysctl(sysctlVmOvercommitMemory)
if err != nil {
return err
const (
KernelTunableWarn KernelTunableBehavior = "warn"
KernelTunableError KernelTunableBehavior = "error"
KernelTunableModify KernelTunableBehavior = "modify"
)
// setupKernelTunables validates kernel tunable flags are set as expected
// depending upon the specified option, it will either warn, error, or modify the kernel tunable flags
func setupKernelTunables(option KernelTunableBehavior) error {
desiredState := map[string]int{
utilsysctl.VmOvercommitMemory: utilsysctl.VmOvercommitMemoryAlways,
utilsysctl.VmPanicOnOOM: utilsysctl.VmPanicOnOOMInvokeOOMKiller,
}
if val == 1 {
return nil
errList := []error{}
for flag, expectedValue := range desiredState {
val, err := utilsysctl.GetSysctl(flag)
if err != nil {
errList = append(errList, err)
continue
}
if val == expectedValue {
continue
}
switch option {
case KernelTunableError:
errList = append(errList, fmt.Errorf("Invalid kernel flag: %v, expected value: %v, actual value: %v", flag, expectedValue, val))
case KernelTunableWarn:
glog.V(2).Infof("Invalid kernel flag: %v, expected value: %v, actual value: %v", flag, expectedValue, val)
case KernelTunableModify:
glog.V(2).Infof("Updating kernel flag: %v, expected value: %v, actual value: %v", flag, expectedValue, val)
err = utilsysctl.SetSysctl(flag, expectedValue)
if err != nil {
errList = append(errList, err)
}
}
}
glog.V(2).Infof("Updating kernel memory overcommit flag from %v to %v", val, 1)
err = utilsysctl.SetSysctl(sysctlVmOvercommitMemory, 1)
if err != nil {
return err
}
return nil
return errors.NewAggregate(errList)
}
func (cm *containerManagerImpl) setupNode() error {
@ -169,7 +191,8 @@ func (cm *containerManagerImpl) setupNode() error {
return err
}
if err := disableKernelMemoryOvercommitHandling(); err != nil {
// TODO: plumb kernel tunable options into container manager, right now, we modify by default
if err := setupKernelTunables(KernelTunableModify); err != nil {
return err
}

View File

@ -23,7 +23,14 @@ import (
"strings"
)
const sysctlBase = "/proc/sys"
const (
sysctlBase = "/proc/sys"
VmOvercommitMemory = "vm/overcommit_memory"
VmPanicOnOOM = "vm/panic_on_oom"
VmOvercommitMemoryAlways = 1 // kernel performs no memory over-commit handling
VmPanicOnOOMInvokeOOMKiller = 0 // kernel calls the oom_killer function when OOM occurs
)
// GetSysctl returns the value for the specified sysctl setting
func GetSysctl(sysctl string) (int, error) {