我有一台路由器,上面运行着内核版本为 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