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