我们正在调试一种情况,其中缓存/共享内存不断增加,直到系统达到 OOM-killer。
我们在sysctl.conf中设置了shmax和shmall,但没有任何明显的效果。我们是否需要启用更多功能才能使 shmax/shmall 正常工作?或者系统的某些部分是否可以超出这个限制,执行的力度有多大?有缺陷的用户空间应用程序或仅内核/驱动程序中的错误会导致它吗?我们调试的应用程序使用图形和视频解码。司机可以超越最大限制吗?
kernel.shmmax = 2147483648
kernel.shmall = 524288
Linux 内核是 5.15.71(来自 Yocto meta-intel)。我们的系统有 4GB 内存,没有交换(我们尝试启用交换,但它对系统的稳定性没有帮助)。我们使用 Wayland/weston 但不使用 systemd。我们在 sysctl.conf 中设置该值并重新启动以使其生效。我们还通过 ipcs 确认了这些值。我们尝试将共享内存设置为最大 2 GB。
ipcs -l
------ Shared Memory Limits --------
max number of segments = 4096
max seg size (kbytes) = 2097152
max total shared memory (kbytes) = 2097152
min seg size (bytes) = 1
以下是 free、meminfo、smem 等在达到 OOM 之前几分钟的一些示例输出。
free -w
total used free shared buffers cache available
Mem: 3844036 479428 263444 2711864 11324 3089840 585716
Swap: 0 0 0
#### cat /proc/meminfo
MemTotal: 3844036 kB
MemFree: 262680 kB
MemAvailable: 584940 kB
Buffers: 11324 kB
Cached: 3055620 kB
SwapCached: 0 kB
Active: 98764 kB
Inactive: 645792 kB
Active(anon): 732 kB
Inactive(anon): 394288 kB
Active(file): 98032 kB
Inactive(file): 251504 kB
Unevictable: 2708620 kB
Mlocked: 100 kB
SwapTotal: 0 kB
SwapFree: 0 kB
Dirty: 12 kB
Writeback: 0 kB
AnonPages: 386388 kB
Mapped: 162732 kB
Shmem: 2711864 kB
KReclaimable: 34208 kB
Slab: 68656 kB
SReclaimable: 34208 kB
SUnreclaim: 34448 kB
KernelStack: 4640 kB
PageTables: 5904 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 1922016 kB
Committed_AS: 4068728 kB
VmallocTotal: 34359738367 kB
VmallocUsed: 15104 kB
VmallocChunk: 0 kB
Percpu: 1040 kB
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
Hugetlb: 0 kB
DirectMap4k: 72236 kB
DirectMap2M: 3938304 kB
DirectMap1G: 2097152 kB
#### smem
PID User Command Swap USS PSS RSS
…..
1306 weston /usr/libexec/wpe-webkit-1.1 0 27192 51419 98928
1379 weston /usr/libexec/wpe-webkit-1.1 0 190268 214958 266040
Area Used Cache Noncache
firmware/hardware 0 0 0
kernel image 0 0 0
kernel dynamic memory 3030848 2938432 92416
userspace memory 555656 162732 392924
free memory 257532 257532 0
Map PIDs AVGPSS PSS
……
/usr/lib/libcrypto.so.3 20 527 10544
/usr/lib/dri/iris_dri.so 5 2196 10982
/usr/lib/dri/iHD_drv_video.so 1 20356 20356
/usr/lib/libWPEWebKit-1.1.so.0.2.6 5 14539 72697
[heap] 45 2060 92700
<anonymous> 45 5970 268688
编辑:为 tmpfs 添加了 df 信息。使用 df 显示的 tmpfs 挂载没有显示任何异常大小增加。
/# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/root 9.8G 1.9G 7.4G 21% /
devtmpfs 1.9G 2.1M 1.9G 1% /dev
tmpfs 1.9G 636K 1.9G 1% /run
tmpfs 751M 5.8M 745M 1% /var/volatile
tmpfs 40K 0 40K 0% /mnt/.psplash
答案1
SHMAX 和 SHMALL 不会限制您杂项的大小临时文件系统。
由于 tmpfs 完全存在于页面缓存和交换中,因此所有 tmpfs 页面将在 /proc/meminfo 中显示为“Shmem”,在 free(1) 中显示为“Shared”。
使用该实用程序检查df
您的系统上实际安装了多少个文件系统,并最终通过size=
相应安装操作的参数限制其最大可能大小。
当然,如果您的应用程序使用这种文件系统并且没有可用的交换空间,则应用程序很可能会阻止或停止处理,因为它找不到设备上剩余的任何空间。