Kubernetes管理HugePages
Kubernetes Pod 中的应用程序可以分配和使用预分配的HugePages,并且像使用CPU与Memory一样可以设置最小请求值与最大限制值。
配置HugePages
Kubernetes 节点必须预先分配大页,以便节点报告其大页容量。节点可以预先分配多种大小的大页面。
节点将自动发现所有大页资源并将其报告为可调度资源。
1. 查看您的内核当前是否启用 HugePages。
cat /proc/sys/vm/nr_hugepages
0
在上面的示例中,nr_hugepages 参数值为 0,表示 HugePages 未启用。
2. 启用 HugePages,运行以下命令以将该内核参数值设置为 20。
sysctl -w vm.nr_hugepages=20
vm.nr_hugepages = 20
20为2MB大小的页面数。但是这个是动态设置的,系统重启后失效。
3. 设置静态HugePages,重启后依然有效。
echo "vm.nr_hugepages=20" >> /etc/sysctl.conf
cat /etc/sysctl.conf | grep huge
vm.nr_hugepages=20
4. 重新启动实例,然后,再次运行 cat 命令以验证 HugePages 值和配置。
┌──(root@i-2udbbtytcx3gv6bvmhzb)-[/var/log]
└─# cat /proc/sys/vm/nr_hugepages
20
5. 检查 /proc/meminfo 中的可用 HugePages。
─# grep Huge /proc/meminfo
AnonHugePages: 253952 kB
ShmemHugePages: 0 kB
FileHugePages: 0 kB
HugePages_Total: 20
HugePages_Free: 20
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
-
HugePages_Total为所分配的页面数目,和Hugepagesize相乘后得到所分配的内存大小。
-
HugePages_Free为从来没有被使用过的Hugepages数目。例如即使已经分配了这部分内存,但是如果没有实际写入,那么看到的还是Free的。
-
HugePages_Rsvd为已经被分配预留但是还没有使用的page数目。
可以看到服务器上已启用了 HugePages,大小为2048KB,Total数量为20,Free为20。
6. 禁用 HugePages 的方法:
- 将 nr_hugepages 改回 0。
- 删除 sysctl.conf 中的条目。
- 重新启动服务器以使其生效
应用程序编程接口
HugePage可以通过容器级资源需求来使用,使用资源名称hugepages-,其中是在特定节点上支持的整数值的最紧凑的二进制表示法。例如,如果一个节点支持2048KiB和1048576KiB的页面大小,它将暴露可调度的资源hugepages-2Mi和hugepages-1Gi。与CPU或内存不同,巨大页面不支持过度承诺。请注意,在请求hugepage资源时,必须同时请求内存或CPU资源。
一个Pod可以在单个Pod规范中使用多个巨大页面大小。在这种情况下,它必须对所有卷挂载使用medium: HugePages-的表示法
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
仅当Podmedium: 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
- 大页面请求必须等于限制。如果指定了限制,但未指定请求,则这是默认值。
- 大页面在容器范围内隔离,因此每个容器cgroup 沙箱都有自己的限制,这是容器规范中的要求。
- 由大页面支持的 EmptyDir 卷可能不会消耗比 Pod 请求更多的大页面内存。
- 通过shmget()和SHM_HUGETLB使用大页的应用程序必须以与proc/sys/vm/hugetlb_shm_group匹配的附加组运行。
- 通过使用hugepages-标记,一个命名空间中的巨大页面使用可以像其他计算资源(如CPU或内存)一样,通过ResourceQuota进行控制。