傳統的共享內存是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 ~]#