管理 HugePages
在集群中将 Huge Page 配置和管理为可调度资源。
特性状态:
Kubernetes v1.14 [稳定]
(默认启用:true)Kubernetes 支持 Pod 中的应用程序分配和使用预分配的 Huge Page。本页介绍用户如何使用 Huge Page。
开始之前
Kubernetes 节点必须预分配 Huge Page,以便节点报告其 Huge Page 容量。
节点可以预分配多种大小的 Huge Page,例如,/etc/default/grub
中的以下行分配 2*1GiB
的 1 GiB 页面和 512*2 MiB
的 2 MiB 页面
GRUB_CMDLINE_LINUX="hugepagesz=1G hugepages=2 hugepagesz=2M hugepages=512"
节点将自动发现并报告所有 Huge Page 资源作为可调度资源。
当描述 Node 时,你应该在 Capacity
和 Allocatable
部分看到类似如下内容
Capacity:
cpu: ...
ephemeral-storage: ...
hugepages-1Gi: 2Gi
hugepages-2Mi: 1Gi
memory: ...
pods: ...
Allocatable:
cpu: ...
ephemeral-storage: ...
hugepages-1Gi: 2Gi
hugepages-2Mi: 1Gi
memory: ...
pods: ...
注意
对于动态分配的页面(启动后),Kubelet 需要重启才能反映新的分配。API
Huge Page 可以通过容器级别的资源需求来使用,资源名称格式为 hugepages-<size>
,其中 <size>
是特定节点支持的使用整数值表示的最紧凑二进制形式。例如,如果一个节点支持 2048KiB 和 1048576KiB 的页面大小,它将暴露可调度资源 hugepages-2Mi
和 hugepages-1Gi
。与 CPU 或内存不同,Huge Page 不支持超额分配(overcommit)。请注意,在请求 Huge Page 资源时,也必须请求内存或 CPU 资源之一。
一个 Pod 可以在单个 Pod 规约中消耗多种 Huge Page 大小。在这种情况下,对于所有卷挂载,必须使用 medium: HugePages-<hugepagesize>
的表示法。
apiVersion: v1
kind: Pod
metadata:
name: huge-pages-example
spec:
containers:
- name: example
image: fedora:latest
command:
- sleep
- inf
volumeMounts:
- mountPath: /hugepages-2Mi
name: hugepage-2mi
- mountPath: /hugepages-1Gi
name: hugepage-1gi
resources:
limits:
hugepages-2Mi: 100Mi
hugepages-1Gi: 2Gi
memory: 100Mi
requests:
memory: 100Mi
volumes:
- name: hugepage-2mi
emptyDir:
medium: HugePages-2Mi
- name: hugepage-1gi
emptyDir:
medium: HugePages-1Gi
Pod 只有在请求单一大小的 Huge Page 时,才可以使用 medium: HugePages
。
apiVersion: v1
kind: Pod
metadata:
name: huge-pages-example
spec:
containers:
- name: example
image: fedora:latest
command:
- sleep
- inf
volumeMounts:
- mountPath: /hugepages
name: hugepage
resources:
limits:
hugepages-2Mi: 100Mi
memory: 100Mi
requests:
memory: 100Mi
volumes:
- name: hugepage
emptyDir:
medium: HugePages
- Huge Page 的请求值必须等于其限制值。如果指定了限制值但未指定请求值,则默认请求值等于限制值。
- Huge Page 在容器范围内是隔离的,因此每个容器都在其 cgroup 沙箱中有其自己的限制,该限制在容器规约中指定。
- 由 Huge Page 支持的 EmptyDir 卷消耗的 Huge Page 内存不能超过 Pod 的请求量。
- 通过带有
SHM_HUGETLB
的shmget()
函数使用 Huge Page 的应用程序必须以与proc/sys/vm/hugetlb_shm_group
匹配的补充组身份运行。 - 命名空间中的 Huge Page 使用量可以通过 ResourceQuota 进行控制,类似于使用
hugepages-<size>
标记来控制cpu
或memory
等其他计算资源。
最后修改于 太平洋标准时间 2024 年 6 月 6 日 凌晨 12:21:修复特性状态 (53da5f74ab)