我正在运行 64 位 Xubuntu 14.04、linux 版本 3.8.0-25、8GB RAM。
我有一个脚本(在 MATLAB 中,就其价值而言)可以一次加载大量数据文件 (~23k),总共大约 45G 的数据。我遇到的问题是,加载每个文件后,它仍保留在文件缓存中。 Linux 似乎更喜欢将这些文件缓存在内存中,而不是任何其他内存内容,导致几乎所有其他内容都被迫交换,导致我的系统速度慢得像爬行一样。我每秒读取几个文件,所以这种情况发生得相当快。我只读取每个文件一次,因此在使用完文件后不需要将它们保留在缓存中。
我尝试过关闭交换,这在一定程度上有效,但这似乎是一个糟糕的解决方案(当另一个程序开始使用过多的内存时,它已经失败了一次)。有没有办法可以限制 linux 用于文件缓存的 RAM 量?
答案1
不是真正的答案,但评论太长了。
Linux 的内存管理在其漫长的生命周期中已经被一些非常聪明的人仔细调整过,并且在选择在内存中保留什么和删除什么时,它通常可以很好地做出正确的决定。
不幸的是,看起来你的工作负载与其决策不太兼容:-(不过,我对你的报告感到非常惊讶,它实际上经常更愿意强制脏内存进行交换,而不是从缓存中删除某些内容。一个决定从缓存中删除内容 A 与从缓存中删除内容 B 之间可能是一个难以抉择的问题,但从缓存中删除内容 C 与将脏内存 D 写入交换之间的决定应该更倾向于删除内容 C,因为这样成本要低得多!
有一种方法可以通知 Linux 将来不再需要某些缓存内存,这就是系统madvise()
调用,MADV_DONTNEED
但我认为您很难从 MATLAB 脚本调用该系统调用...
无论如何,我认为减少文件缓存的大小并不是您真正想要做的。请记住,MATLAB 本身、您的脚本、GUI 环境和其他系统软件的可执行文件和库以及运行时文件和插件等也都位于文件缓存中,您将强制这些内容退出文件缓存(有利于文件缓存的其他内容或有利于堆内存和其他非文件支持的映射)。这将导致您的系统变慢,就像交换一样。