挂载EmptyDir Volume以修改shm大小

本文介绍如何设置Memory类型的emptyDir VolumesizeLimit,并将其挂载到/dev/shm,从而修改ACS Podshm大小,解决共享内存不够用的问题。

功能场景

默认情况下,Kubernetes创建的Pod,其共享内存默认为64 MiB(即/dev/shm大小为64 MiB),且不支持更改。

修改shm1

Kubernetes没有提供设置shm大小的途径,您可以通过将Memory类型的emptyDir Volume挂载到/dev/shm的方式,解决共享内存不够用的问题。

配置示例

以下分别演示如何修改普通工作负载和GPU工作负载的shm大小。

CPU工作负载

  1. 创建emptydir-shm.yaml。示例中通过设置EmptyDir VolumemediumMemorysizeLimit256MiB,并将EmptyDir Volume挂载到/dev/shm目录,从而将Podshm大小修改为256 MiB。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: test
      labels:
        app: test
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          name: nginx-test
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx
            image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6
            ports:
            - containerPort: 80
            volumeMounts:
            - mountPath: /dev/shm
              name: cache-volume
          volumes:
          - emptyDir:
              medium: Memory
              sizeLimit: 256Mi
            name: cache-volume
  2. 部署Deployment。

    kubectl apply -f emptydir-shm.yaml
  3. 查看结果。

    kubectl exec -it deploy/test -- df -h

    预期输出:

    Filesystem      Size  Used Avail Use% Mounted on
    overlay          30G  2.8G   26G  10% /
    tmpfs            64M     0   64M   0% /dev
    tmpfs           2.8G     0  2.8G   0% /sys/fs/cgroup
    tmpfs           256M     0  256M   0% /dev/shm
    /dev/vda5        30G  2.8G   26G  10% /etc/hosts
    tmpfs           4.0G   12K  4.0G   1% /run/secrets/kubernetes.io/serviceaccount
    tmpfs           2.8G     0  2.8G   0% /proc/acpi
    tmpfs           2.8G     0  2.8G   0% /proc/scsi
    tmpfs           2.8G     0  2.8G   0% /sys/firmware

    可以看到/dev/shm的大小已增加到256 MiB。

GPU工作负载

  1. 创建emptydir-shm-gpu.yaml。示例中通过设置EmptyDir VolumemediumMemorysizeLimit256Mi,并将EmptyDir Volume挂载到/dev/shm目录,从而将GPU Podshm大小改为256 MiB。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        app: test-gpu
      name: test-gpu
      namespace: default
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: test-gpu
      template:
        metadata:
          labels:
            app: test-gpu
            alibabacloud.com/compute-class: gpu
            alibabacloud.com/compute-qos: default
            alibabacloud.com/gpu-model-series: T4
        spec:
          volumes:
          - emptyDir:
              medium: Memory
              sizeLimit: 256Mi
            name: cache-volume
          containers:
            - image: registry.cn-beijing.aliyuncs.com/acs/tensorflow-mnist-sample:v1.5
              name: tensorflow-mnist
              command: 
              - sleep
              - infinity
              resources:
                limits:
                  nvidia.com/gpu: "1"
              volumeMounts:
                - mountPath: /dev/shm
                  name: cache-volume
  2. 部署Deployment。

    kubectl apply -f emptydir-shm-gpu.yaml
  3. 查看结果。

    kubectl exec -it deploy/test-gpu -- df -h

    预期输出:

    Filesystem                    Size  Used Avail Use% Mounted on
    35xxxxxfe-rootfs               30G  283M   29G   1% /
    tmpfs                          64M     0   64M   0% /dev
    tmpfs                         1.5G     0  1.5G   0% /sys/fs/cgroup
    tmpfs                         256M     0  256M   0% /dev/shm
    tmpfs                         1.5G  116K  1.5G   1% /etc/hosts
    tmpfs                         3.4G   12K  3.4G   1% /run/secrets/kubernetes.io/serviceaccount
    virtiofs-default              189G   17M  189G   1% /run/nvidia-topologyd/virtualTopology.xml
    tmpfs                         1.5G   68K  1.5G   1% /proc/driver/nvidia/params
    tmpfs                         1.5G  4.0K  1.5G   1% /etc/nvidia/nvidia-application-profiles-rc.d
    devtmpfs                      1.5G     0  1.5G   0% /dev/nvidia0

    可以看到/dev/shm的大小已增加到256 Mi。