
# 修改/dev/shm容量大小
#### 应用场景
/dev/shm由tmpfs文件系统构成，tmpfs是Linux/Unix系统上的一种基于内存的文件系统，故读写效率非常高。
目前有用户希望通过/dev/shm实现进程间数据交互或通过/dev/shm实现临时数据存储，此时CCI场景/dev/shm默认大小64M无法满足客户诉求，故提供修改/dev/shm size大小的能力。
本操作实践展示通过"memory类型EmptyDir"和"配置securityContext与mount命令"两种方式来修改/dev/shm容量。
#### 限制与约束
- /dev/shm使用基于内存的tmpfs文件系统，不具备持久性，容器重启后数据不保留。
- 用户可通过两种方式修改/dev/shm容量，但不建议在一个Pod中同时使用两种方式进行配置。
- EmptyDir所使用的memory从Pod申请的memory中进行分配，不会额外占用资源。
- 在/dev/shm中写数据相当于申请内存，此种场景下需评估进程内存使用量，当容器内的进程申请内存与EmptyDir中数据量之和超过容器请求的限制内存时，会出现内存溢出异常。
- 当需要修改/dev/shm容量时，容量大小通常设定为Pod内存申请量的50%。
 
#### 通过memory类型EmptyDir修改/dev/shm容量
临时路径(EmptyDir)：适用于临时存储、灾难恢复、共享运行时数据等场景，任务实例的删除或迁移会导致临时路径被删除。
CCI支持挂载Memory类型的EmptyDir，用户可通过指定EmptyDir分配内存的大小并挂载到容器内/dev/shm目录来实现/dev/shm的容量修改。
```
apiVersion: v1
kind: Pod
metadata:  
 name: pod-emptydir-name
spec:  
 containers:   
  - image: 'library/ubuntu:latest'     
    volumeMounts:      
     - name: volume-emptydir1    
       mountPath: /dev/shm   
    name: container-0   
    resources:      
     limits:        
      cpu: '4'      
      memory: 8Gi  
     requests:   
      cpu: '4'    
      memory: 8Gi 
 volumes:   
  - emptyDir:     
     medium: Memory   
     sizeLimit: 4Gi  
    name: volume-emptydir1
```
待Pod启动后，执行"df -h"指令，进入/dev/shm目录，如下图所示，/dev/shm容量修改成功。
图1/dev/shm目录详情   
![](https://support.huaweicloud.com/bestpractice-cci/zh-cn_image_0000001299765680.png "点击放大")
#### 通过配置securityContext和mount命令修改/dev/shm容量
- **容器赋予SYS_ADMIN权限**
 
linux原生提供了SYS_ADMIN权限，将该权限应用于容器中，首先需要Kubernetes在pod级别带入这个信息，在pod的描述文件中添加securityContext字段的描述。 例如：
```
"securityContext": { 
                    "capabilities": {
                         "add": [
                             "SYS_ADMIN"
                                ]
                                     } 
                    }
```
同时容器的描述信息中也需要加入另外一个描述字段CapAdd。
```
"CapAdd": [
                 "SYS_ADMIN"
            ],
```
这样的话容器在自动被kubelet拉起的时候就会带入一个参数。
```
docker run --cap-add=SYS_ADMIN
```
- **在给[容器赋予SYS_ADMIN权限]后，可直接在启动命令中通过mount命令实现/dev/shm的size修改。**
```
apiVersion: v1
kind: Pod
metadata:
  name: pod-emptydir-name
spec:
  containers:
    - command:
        - /bin/sh
        - '-c'
        - mount -o size=4096M -o remount /dev/shm;bash
      securityContext:
        capabilities:
          add: ["SYS_ADMIN"]
      image: 'library/ubuntu:latest'
      name: container-0
      resources:
        limits:
          cpu: '4'
          memory: 8Gi
        requests:
          cpu: '4'
          memory: 8Gi
```
待Pod启动后，执行"df -h"指令，进入/dev/shm目录，如下图所示，/dev/shm容量修改成功。
图2/dev/shm目录详情   
![](https://support.huaweicloud.com/bestpractice-cci/zh-cn_image_0000001353136253.png "点击放大")
