当我们执行 rm 或 > (重定向)运算符时,Linux 不会释放文件缓冲区

当我们执行 rm 或 > (重定向)运算符时,Linux 不会释放文件缓冲区

我有一台路由器,上面运行着内核版本为 2.4.22 的嵌入式 Linux。我知道它版本很旧,但我必须处理它。当我在我的机器上运行 free 命令时,请查看它的输出

[8300002902-3] 调试>免费

              total         used         free       shared      buffers
Mem:       128104       123928         4176            0         2164
Swap:            0            0            0
Total:       128104       123928         4176    

现在我的问题是,每当它执行某些命令并使用 > 运算符将其输出重定向到某个文件时,缓冲区大小就会增加 4KB,即使我使用 tm -rf 删除同一个文件,缓冲区也会再次增加 4KB。因此,当我的缓冲区大小达到接近 5.3MB 时,就会发生 OOM 问题,因为您可以看到我只有 128MB 的可用 RAM 空间。我认为内核没有回收缓冲区空间。请告诉我可以做些什么来摆脱这个问题。我尝试了互联网上的许多方法,例如通过在 /proc/sys/vm 中设置 drop_caches 值,这个命令在我的内核版本中不可用。请提出建议,提前致谢。

答案1

我知道你不想听这个,但 2.4.22 确实很旧,包含许多与 I/O 和内存相关的错误。这显然不是内核的预期行为,我怀疑它与输出重定向或 rm 没有直接关系。

例如,这个错误在启用 O_DIRECT 模式的情况下,每次打开和关闭文件时都会发生此事件,并且这个错误每次进程分叉时都会泄漏内存(这是 bash 在重定向 stdout 时所做的事)。

这些内存泄漏很小,因此在非嵌入式系统上不容易被注意到,但是当您只有 128MB 的 RAM 时,每个 KB 都很重要。

像这样的小规模一次性内存泄漏还有很多。Linux 内核在早期 2.4 版本中并不像今天这样稳定可靠。

不幸的是,除了更新到本世纪某个时候发布的内核之外,我认为你对此无能为力。:P

相关内容