解决共享内存占用很大问题
传统的共享内存是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 ~]#