详解Kubernetes中HugePages的配置与使用

2,330 阅读3分钟

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 的方法:

  1. 将 nr_hugepages 改回 0。
  2. 删除 sysctl.conf 中的条目。
  3. 重新启动服务器以使其生效

应用程序编程接口

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进行控制。