gke cant禁用透明大页面...权限被拒绝

时间:2017-03-26 17:51:04

标签: redis permission-denied google-kubernetes-engine

我正在尝试在gke中运行redis图像。它有效,除了我得到了可怕的"透明的巨大页面"警告:

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.

Redis目前太慢而无法使用......所以我关掉了THP:

sheena@gke-projectwaxd-cluster-default-pool-23593a74-wxrv ~ $ cat  /sys/kernel/mm/transparent_hugepage/enabled
always [madvise] never
sheena@gke-projectwaxd-cluster-default-pool-23593a74-wxrv ~ $ echo never >  /sys/kernel/mm/transparent_hugepage/enabled 
-bash: /sys/kernel/mm/transparent_hugepage/enabled: Permission denied
sheena@gke-projectwaxd-cluster-default-pool-23593a74-wxrv ~ $ sudo echo never >  /sys/kernel/mm/transparent_hugepage/enabled 
-bash: /sys/kernel/mm/transparent_hugepage/enabled: Permission denied

这些权限错误令人不安。 Redis希望THP关闭,以便它可以正常工作。

我做了一点挖掘,发现google使用了一个特殊的os映像,它使/ sys /成为只读路径。还有一个基于Debian 7的替代图像。它让我很兴奋,但最终我遇到了完全相同的问题。

那么如何阻止redis受到Google容器引擎上THP的影响?

这不像我在这里做一些独特的事情。在容器中运行数据库是很正常的。当启用THP时,数据库出现故障是很正常的。那么......我在这里错过了什么?

1 个答案:

答案 0 :(得分:6)

您的命令稍有不正确:echo以root身份运行,但重定向本身(>)以用户身份运行,因此无法写入/sys/

以下命令在container-vm(基于debian)和gci(基于chromeos)上运行正常两者

sudo sh -c 'echo never > /sys/kernel/mm/transparent_hugepage/enabled'

在container-vm

上保留此设置

将此内核命令行参数添加到/etc/default/grub中(之后不要忘记运行sudo update-grubsudo reboot):

GRUB_CMDLINE_LINUX="... transparent_hugepage=never"

在gci

上保留此设置

首先,使用云控制台复制节点池正在使用的实例模板。

其次,在元数据下更改userdata的值:

#cloud-config

write_files:
  - path: /etc/systemd/system/hugepage.service
    permissions: 0644
    owner: root
    content: |
      [Unit]
      Description=Disable THP

      [Service]
      Type=oneshot
      ExecStart=/bin/sh -c "echo never > /sys/kernel/mm/transparent_hugepage/enabled"

      [Install]
      WantedBy=kubernetes.target
...
runcmd:
 - ...
 - systemctl enable hugepage.service
 - systemctl start kubernetes.target

第三,将实例模板更改为新创建的模板:

gcloud compute instance-groups managed set-instance-template \
  gke-YOUCLUSTER-YOURPOOL-grp \
  --template=YOURNEWTEMPLATENAME \
  --zone=...

Forth,重新创建实例:

gcloud compute instance-groups managed recreate-instances \
   gke-YOUCLUSTER-YOURPOOL-grp \
   --zone=... \
   --instances=...

实例将松散所有数据并启用THP禁用。所有新实例也将禁用THP(在此节点池中)。