解决共享内存占用很大问题

传统的共享内存是System V形式的,可通过"/proc/sys/kernel/shmall"参数限制其占用的最大物理内存空间,像这样:

echo 1024 > /proc/sys/kernel/shmall

# 1个G
echo 1048576 > /proc/sys/kernel/shmall

[root@ecs-5611 ~]# cat /proc/sys/kernel/shmall
18446744073692774399

这里"shmall"的数值是以page为单位的,因为page的大小通常为4KiB,所以设置1024意味着其总大小不能超过1024*4KiB=4096KiB。

free -h

除了System V形式的共享内存,还有POSIX形式的共享内存,而"shmall"参数只对System V形式的共享内存有效,对POSIX形式的共享内存无效。要想限制POSIX形式的共享内存,得用其他的手段。

System V共享内存由内核管理,对用户不可见,而POSIX共享内存可通过"df -h"命令查看,在df命令的输出结果中,"Filesystem"为"tmpfs"或者"devtmpfs"的就是POSIX共享内存,其中"/run", "/sys/fs/cgroups"是系统目录,而"/dev/shm"是可由用户使用的。

[root@ecs-5611 ~]# df -h
文件系统        容量  已用  可用 已用% 挂载点
devtmpfs        7.5G     0  7.5G    0% /dev
tmpfs           7.7G     0  7.7G    0% /dev/shm
tmpfs           7.7G   18M  7.7G    1% /run
tmpfs           7.7G     0  7.7G    0% /sys/fs/cgroup
/dev/vda2        98G   28G   66G   30% /
tmpfs           7.7G  4.2G  3.6G   54% /tmp
/dev/vda1      1022M  5.8M 1017M    1% /boot/efi
/dev/vdb1       492G   16G  451G    4% /data
tmpfs           1.6G     0  1.6G    0% /run/user/0
overlay          98G   28G   66G   30% /home/docker-data/overlay2/1e9ce9a42b4ae13671785f40a06a827adeaa7d3d1947f0ee92613661615628d7/merged
overlay          98G   28G   66G   30% /home/docker-data/overlay2/a8b0482bd16311cf594efac875148b9c691316bcb97ec1d0e0565cac644bf025/merged
shm              64M     0   64M    0% /home/docker-data/containers/56e63894cc7b2ec6243c4aadb3931040f429167d333af0e9fa9bcf2c0f68e57a/mounts/shm
shm              64M     0   64M    0% /home/docker-data/containers/42143b7514fac7e317395af8e505e96b2e6ae4cf7002e7113cfda7a250ed5a9c/mounts/shm
[root@ecs-5611 ~]# 

这些POSIX共享内存是以内存文件系统的形式挂载的,如果不设置,那么挂载的默认大小为内存的一半(代码位于/mm/shmem.c)。

在我的机器上,内存大小是接近8个GiB,所以其默认大小是3.9GiB。如果要限制"/dev/shm"这个挂载点的共享文件系统的大小,则可以在"/etc/fstab"配置文件中添加如下的语句:

echo 'tmpfs /dev/shm tmpfs nodev,nosuid,size=128M 0 0' >> /etc/fstab

echo 'tmpfs /dev/shm tmpfs nodev,nosuid,size=1024M 0 0' >> /etc/fstab

# 重启生效
echo 'tmpfs /tmp tmpfs nodev,nosuid,size=1024M 0 0' >> /etc/fstab

这里"size"的设置就比较简单直观了,不像"shmall"那样还需要换算一下大小。重启之后再用"df -h /dev/shm"命令看一下,"Size"表示的大小已经变成了我们之前设定的值。

那如何解除这种限制呢?永久性的办法当然还是和前面一样,填写"/etc/fstab"配置文件,但那毕竟需要重启才能生效,如果想立刻生效以便快速进行接下来进一步的实验,只需"remount"一下就可以了,像这样:

# 立即生效
mount -o remount,size=7G /dev/shm

mount -o remount,size=3G /tmp

# 共享内存已经超过3G size=3G 会报错
[root@ecs-5611 ~]# mount -o remount,size=3G /tmp
mount: /tmp: 挂载点未挂载或选项有误.

mount -o remount,size=1G /tmp

本人遇到的问题 flink 上传jar默认是存到/tmp目录下,/tmp目录又是存到内存中的

把上传路径改了之后,莫名看不到的共享内存回来了

建议把/tmp 卸载了

[root@ecs-5611 ~]# free -h
              total        used        free      shared  buff/cache   available
Mem:           15Gi       9.7Gi       1.2Gi        22Mi       4.6Gi       3.7Gi
Swap:            0B          0B          0B
[root@ecs-5611 ~]# df -h
文件系统        容量  已用  可用 已用% 挂载点
devtmpfs        7.5G     0  7.5G    0% /dev
tmpfs           7.0G     0  7.0G    0% /dev/shm
tmpfs           7.7G   18M  7.7G    1% /run
tmpfs           7.7G     0  7.7G    0% /sys/fs/cgroup
/dev/vda2        98G   28G   66G   30% /
tmpfs           1.0G  5.0M 1019M    1% /tmp
/dev/vda1      1022M  5.8M 1017M    1% /boot/efi
/dev/vdb1       492G   19G  448G    5% /data
tmpfs           1.6G     0  1.6G    0% /run/user/0
overlay          98G   28G   66G   30% /home/docker-data/overlay2/1e9ce9a42b4ae13671785f40a06a827adeaa7d3d1947f0ee92613661615628d7/merged
overlay          98G   28G   66G   30% /home/docker-data/overlay2/a8b0482bd16311cf594efac875148b9c691316bcb97ec1d0e0565cac644bf025/merged
shm              64M     0   64M    0% /home/docker-data/containers/56e63894cc7b2ec6243c4aadb3931040f429167d333af0e9fa9bcf2c0f68e57a/mounts/shm
shm              64M     0   64M    0% /home/docker-data/containers/42143b7514fac7e317395af8e505e96b2e6ae4cf7002e7113cfda7a250ed5a9c/mounts/shm
[root@ecs-5611 ~]# 

参考:https://zhuanlan.zhihu.com/p/93142176

posted @ 2021-09-18 16:27  1769987233  阅读(798)  评论(0编辑  收藏  举报