Pod无法在kubernetes中分配hugepages

Pod无法在kubernetes中分配hugepages,kubernetes,Kubernetes,我在kubernetes中运行一个pod,主机中分配了hugepages,pod中定义了hugepages。kubernetes工人在虚拟机中。VM(主机)分配了大量页面。不过pod无法分配hugepages。应用程序在尝试写入第一个hugepage分配时获取SIGBUS pod定义包括hugepages: securityContext: allowPrivilegeEscalation: true privileged: true runAsUse

我在kubernetes中运行一个pod,主机中分配了hugepages,pod中定义了hugepages。kubernetes工人在虚拟机中。VM(主机)分配了大量页面。不过pod无法分配hugepages。应用程序在尝试写入第一个hugepage分配时获取SIGBUS

pod定义包括hugepages:

    securityContext:
      allowPrivilegeEscalation: true
      privileged: true
      runAsUser: 0
      capabilities:
        add: ["SYS_ADMIN", "IPC_LOCK"]
    resources:
      requests:
        intel.com/intel_sriov_netdevice : 2
        memory: 2Gi
        hugepages-2Mi: 4Gi
      limits:
        intel.com/intel_sriov_netdevice : 2
        memory: 2Gi
        hugepages-2Mi: 4Gi
    volumeMounts:
    - mountPath: /sys
      name: sysfs
    - mountPath: /dev/hugepages
      name: hugepage
      readOnly: false
  volumes:
  - name: hugepage
    emptyDir:
      medium: HugePages
  - name: sysfs
    hostPath:
      path: /sys

托管pod的VM已分配hugepages:

cat /proc/meminfo | grep -i hug
AnonHugePages:         0 kB
HugePages_Total:    4096
HugePages_Free:     4096
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
下面的代码在托管pod的VM中运行良好,我可以看到在/dev/hugepages中创建的hugepages文件,并且进程运行时,hugepages_Free计数器减少

#包括
#包括
#包括
#包括
#包括
#包括
#定义长度(2UL*1024*1024)
#定义文件名“/dev/hugepages/hugepages文件”
静态无效写入字节(char*addr)
{
无符号长i;
对于(i=0;i
但是如果我在pod中运行相同的代码,那么在尝试写入分配的第一个hugepage时会得到一个SIGBUS

虚拟机上的结果(托管pod)

pod中的结果:

Program received signal SIGBUS, Bus error.
0x00005555555547cb in write_bytes ()
(gdb) where
#0  0x00005555555547cb in write_bytes ()
#1  0x00005555555548a6 in main ()


在worker节点上配置hugepage后,需要重新启动kubelet以通知K8S hugepage资源。 (当我在K8S1.16版本中尝试此功能时,我也遇到了同样的问题,也许现在它工作得更好了?

这是在K8S中

罪魁祸首是kubelet在节点状态更新时不更新/sys/fs/cgroup/hugetlb/kubepods/hugetlb.2MB.limit_in_bytes,默认情况下每5分钟更新一次。但在主机上启用hugepages后,它会正确更新节点的资源。这使得在根cgroup中具有错误配置限制的节点上使用hugepages调度工作负载成为可能


不久前我参加了K8s,但它从未被接受。如果它仍然适用,您可以尝试将其应用于您的K8s构建。如果不是的话,我会很感激其他人重新调整它并再次提交。我花了太多的时间试图进入,然后切换到另一个项目。

这看起来像是kubernetes的问题,可能是因为我配置不正确。但是文件/sys/fs/cgroup/hugetlb/kubepods/hugetlb.2MB.limit_in_bytes limit设置为0。以下操作使pod中的分配工作正常:
echo 9223372036854771712 | sudo tee hugetlb.2MB。限制字节数
是否尝试在节点中切换操作系统?k8s上似乎支持这一点,但内存分配也可能取决于底层主机。得到了完全相同的问题,感谢您的代码示例,顺便说一句。挖掘了一段时间,没有找到任何东西。最后通过重新启动kubelet服务来摆脱这种行为。。。奇怪这应该是一个评论而不是答案。
Program received signal SIGBUS, Bus error.
0x00005555555547cb in write_bytes ()
(gdb) where
#0  0x00005555555547cb in write_bytes ()
#1  0x00005555555548a6 in main ()