59,829
社区成员
发帖
与我相关
我的任务
分享k8s在给容器分配hugepages时总是趋向于用最少的NUMA node: 分配完NUMA 0, 才去分配NUMA 1。
问题是部分应用需要在NUMA nodes间平均分配需要的CPU和hugepages.
请问如下例子,如果配置实现?
Server上有32 hugepages, 2 NUMA nodes, 容器需要8 hugepages, 请问如果实现NUMA 0和NUMA 1上各分4个?
如果有完全去掉hugepages的管理的方法也行。比如Docker不对hugepages做管理, 容器可以自由申请需要的hugepages. 问题是K8S中的容器,如果不在POD中定义需要的hugepages, 应用在容器中无法像docker一样申请到hugepages, 会报错。
请问有没有方法可以彻底去掉k8s对hugepages的管理?
在Kubernetes中,每个节点能够预先分配多种规格的巨页,但Kubernetes在给容器分配巨页时总是趋向于使用最少的NUMA node。
要实现NUMA 0和NUMA 1上各分配4个hugepages,可以尝试以下方法:
在每个节点上预先分配8个hugepages,并公开可调度的资源hugepages-2Mi和hugepages-1Gi。
在Pod的spec中请求8个hugepages资源,并指定在NUMA 0和NUMA 1上各分配4个。
在请求巨页资源时,必须请求内存或CPU资源。
至于完全去掉Kubernetes对hugepages的管理,目前没有很好的方法。因为Kubernetes需要预先分配巨页,以便节点能够上报巨页容量。如果不在POD中定义需要的hugepages,应用在容器中无法像Docker一样申请到hugepages,会报错。如有其他问题,建议咨询Kubernetes专家或官方文档。
要实现NUMA 0和NUMA 1上各分4个hugepages,可以在Pod的YAML文件中设置resources.requests.memory和resources.limits.memory。以下是一个示例:
复制代码
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: my-container
image: my-image
resources:
requests:
memory: "8Gi"
limits:
memory: "8Gi"
在这个例子中,我们为容器设置了8个GiB的内存请求和限制。这将导致Kubernetes在调度时尽量均匀地分配内存,包括hugepages。然而,这种方法不能保证NUMA节点上的内存分布是1:1的,因为Kubernetes可能会优先考虑其他因素,如Pod的其他资源需求、节点上的其他容器等。
要彻底去掉k8s对hugepages的管理,可以尝试将--feature-gates=MemoryManager=off添加到运行容器的命令中。例如:
复制代码
kubectl run my-pod --image=my-image --restart=Never --command="sh" --feature-gates=MemoryManager=off
这将禁用Kubernetes的内存管理器,允许容器自由申请需要的hugepages。然而,请注意,这可能会导致内存使用不均衡和其他问题,因此在使用此选项时要谨慎。