解決共享內存占用很大問題


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM