Disable Transparent Huge Pages from Kubernetes

7/24/2017

I deploy Redis container via Kubernetes and get the following warning:

WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled

Is it possible to disable THP via Kubernetes? Perhaps via init-containers?

-- chingis
docker
kubernetes
redis

2 Answers

7/24/2017

Yes, with init-containers it's quite straightforward:

apiVersion: v1
kind: Pod
metadata:
  name: thp-test
spec:
  restartPolicy: Never
  terminationGracePeriodSeconds: 1
  volumes:
    - name: host-sys
      hostPath:
        path: /sys
  initContainers:
    - name: disable-thp
      image: busybox
      volumeMounts:
        - name: host-sys
          mountPath: /host-sys
      command: ["sh", "-c", "echo never >/host-sys/kernel/mm/transparent_hugepage/enabled"]
  containers:
    - name: busybox
      image: busybox
      command: ["cat", "/sys/kernel/mm/transparent_hugepage/enabled"]

Demo (notice that this is a system wide setting):

$ ssh THATNODE cat /sys/kernel/mm/transparent_hugepage/enabled
always [madvise] never
$ kubectl create -f thp-test.yaml
pod "thp-test" created
$ kubectl logs thp-test
always madvise [never]
$ kubectl delete pod thp-test
pod "thp-test" deleted
$ ssh THATNODE cat /sys/kernel/mm/transparent_hugepage/enabled
always madvise [never]
-- Janos Lenart
Source: StackOverflow

6/13/2018

Ay,

I don't know if what I did is a good idea but we needed to deactivate THP on all our K8S VMs for all our apps. So I used a DaemonSet instead of adding an init-container to all our stacks :

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: thp-disable
  namespace: kube-system
spec:
  selector:
    matchLabels:
      name: thp-disable
  template:
    metadata:
      labels:
        name: thp-disable
    spec:
      restartPolicy: Always
      terminationGracePeriodSeconds: 1
      volumes:
        - name: host-sys
          hostPath:
            path: /sys
      initContainers:
        - name: disable-thp
          image: busybox
          volumeMounts:
            - name: host-sys
              mountPath: /host-sys
          command: ["sh", "-c", "echo never >/host-sys/kernel/mm/transparent_hugepage/enabled"]
      containers:
        - name: busybox
          image: busybox
          command: ["watch", "-n", "600", "cat", "/sys/kernel/mm/transparent_hugepage/enabled"]

I think it's a little dirty but it works.

-- KrustyHack
Source: StackOverflow