取消链接 /dev/shm 中的文件不会释放内存?

取消链接 /dev/shm 中的文件不会释放内存?

我感觉我快要疯了,或者 tmpfs 不适合长期使用。

我的工作负载非常快速地创建和取消链接 /dev/shm/[某个目录树] 中的文件。 Linux Slab 使用量(大小为 64 和大小 128)随着 inode 分配/取消链接而线性增加,并且永远不会下降(内存通过 meminfo 被列为不可回收,slabinfo 显示数百万个活动对象)。

该内存永远不会被回收,如果允许继续,则会出现 OOM。唯一的修复方法是卸载并重新安装 /dev/shm。

几年前另一个用户问过这个问题,但答案实际上并没有涵盖所讨论的问题(/dev/shm 中的操作导致溢出)。

这仅仅是 tmpfs 的设计决定还是还有其他原因?索引节点一旦分配就永远不会被释放,这感觉非常糟糕。

时间轴:进程创建 500 万个文件,一次一个,并在创建后立即取消每个文件的链接。此时所有用户进程都被杀死。内存使用情况就好像 /dev/shm 中仍然有 500 万个 inode,尽管 df -i 和 df -h 报告 /dev/shm 基本上是空的。进程循环的进一步迭代会线性增加内存使用量,直到系统完全耗尽内存并出现 OOM。

编辑:对于后来遇到这个问题的人来说,这似乎是我运行的旧内核(SLES 11、2.6.32-something)的产物。较新的内核无法重现该问题。

答案1

看起来这只是在这台特定机器上运行的旧内核中的一个错误。我无法在具有最新内核补丁的较新 RHEL 6 计算机上重现它。

答案2

为了清楚起见,我对我们在评论中讨论的内容添加了或多或少的脚本测试。这是在内核4.7.2如果问题也没有发生:

$ cd /dev/shm
$ free
              total        used        free      shared  buff/cache   available
Mem:        1794788      673948      873668       19300      247172      963316
Swap:       2097148           0     2097148
$ for i in `seq 100000`; do touch node$i; done
$ ls -1|wc -l  # oops, there are extra three pulseaudio files here
 100003
$ free
              total        used        free      shared  buff/cache   available
Mem:        1794788      738240      811944       19300      244604      890184
Swap:       2097148           0     2097148

好的,我们得到了内存占用。但rm清除它

$ rm node*
$ free
              total        used        free      shared  buff/cache   available
Mem:        1794788      671484      896524       19300      226780      965884
Swap:       2097148           0     2097148

这场比赛并不完美,因为我同时清理了一些缓存。但在这个小实验的开始和结束时,空闲内存和缓存中的内存量是相同的。

因此,是的,该问题仅发生在旧内核版本中。这表明存在错误,但已修复。

相关内容