Linux shm/tempfs
linux默认支持 挂载tmpfs 时指定大小,如下所示:
1 | mount tmpfs -t tmpfs /home/test/ -o size=1M |
这个命令只是逻辑占用,并不会占用真实的内存空间,但是在该目录
测试 shm 大小
使用以下命令写入文件到目录/dev/shm ,块大小为1M,数量1024个,一共1G大小
1 | dd if=/dev/zero of=/dev/shm/test.random bs=1M count=1024 |
创建shm时,会占用内存空间,可以使用free -hm 命令查看,如下所示
1 | root@ajkqpkmajvc6q-0:/dev/shm# free -mh |
kubernetes Befor 1.20
虽然docker支持配置shm 参数,但是kubernetes并不支持该参数,社区里有基于emptyDir的方式使用,如下所示,定义emptyDir的卷,并挂载到容器的/dev/shm 目录
1 | .... |
虽然这里有sizeLimit参数,但是其实并不生效,默认使用的大小为宿主机内存的一半,k8s代码里面进行挂载时,并未增加size参数,只是挂载tmpfs文件
1 | k8s.io\kubernetes\pkg\volume\emptydir\empty_dir.go |
但是这时候设置的sizeLimit:4Gi 起到了别的作用,kubelet的eviction manager会监控pod的emptyDir卷使用的空间大小,当使用空间超过该值时,会将该Pod驱逐(kubelet 可以获取到Pod对应容器的emptyDir卷空间使用信息 k8s.io\kubernetes\pkg\kubelet\server\stats)
1 | k8s.io\kubernetes\pkg\kubelet\eviction\eviction_manager.go |
所以说,如果你想在低版本的k8s上使用shm,请不要设置sizeLimit
kubernetes1.20版本
1.20 版本合入了一个(PR)[https://github.com/kubernetes/kubernetes/pull/94444/commits],可以在kubelet设置开启一个feature 特性,kubelet在创建容器时,会为Pod挂载shm,此时还是需要为Pod以挂载卷的方式实现shm
- 当 Pod 并没有设置memory limit时,此时 shm大小为node的Allocateable Memory大小
- 当Pod 设置了Memory Limit 但是在medium的emptyDir未设置sizeLimit时,shm 大小为Pod 的memory Limit
- 当Pod的medium emptyDir设置sizeLimit时,shm大小为sizeLimit
1 |
|