2011-03-16 193 views
0

我想知道是否有任何方法来设置缓冲区缓存可用地址空间的上限?我想认为没有限制,一旦内存使用到达某一点,其他进程会被换出来使缓冲区缓存扩展?限制缓冲区缓存

说了这么多,我想如果说到这一点,读取/写入可能会失败吧?

+0

你为什么认为读写会失败? – Zimbabao 2011-03-17 06:25:46

回答

3

只是因为BufferCache占用大量内存,读写不会失败。只有未使用的RAM用作高速缓存磁盘的缓冲区,但如果某个进程需要内存,它将获得更高的优先级。这是由内核自动完成的,缓冲区缓存只是资源的最佳利用,它不会损害系统的正常工作。

+0

我想我不太在意读/写失败 - 我知道如果缓冲区缓存变得太大,我的进程将被换出,这是我从不想要的。所以,除了调整swappiness等,我宁愿在缓冲区缓存上设置一个上限,如果可能的话 – stackmate 2011-03-17 11:22:38

+0

只有未使用的进程的一部分将被换出。例如,有时候人们制造的缓冲池或堆太大,现在因为你不需要那么多,因为你的数据较少,在这种情况下它会被换出。如果你解释你真正的问题,它会有帮助。 – Zimbabao 2011-03-17 12:18:24

+1

vm.vfs_cache_pressure是您可以检查的另一个参数。它在0到200之间,100是默认值。 0支持inode,dentry缓存(非常小),200支持数据缓存。交换与此参数一起可以帮助您获得所需的内容。限制缓冲区缓存是不可能的。 – Zimbabao 2011-03-17 12:26:14

1

一般问题不是读写会失败,但是你的应用程序会冻结并最终失败。这是一个非常简单的实验。获取非常大的文件目录并将其复制到非常慢的设备。你会发现100%的可用内存将被写入缓存消耗。只有通过写入慢速设备才能清除此缓存。问题是当应用程序需要内存或需要交换已交换到磁盘的内容时发生的情况?由于缓存空间太慢,唯一真正的选择是将其他内容交换到磁盘以提供更多内存。所以现在整个系统都在颠簸。如果你没有交换空间,那么你有严重的问题。无论哪种方式,您的桌面是相当长的,甚至可能完全锁定,直到您的复制完成。

虽然我不知道要解决这个问题,但可以将vm.vfs_cache_pressure调整为0,将vm.swappiness调整为0以帮助减少此问题。

+0

这正是我所看到的问题。我已经尝试将vm.vfs_cache_pressure设置为1(也是0),将vm.swappiness设置为0,这只会有所帮助:复制大文件时,缓冲区仍然占用一半内存,只剩下其他程序的一对夫妇,从而使它们真的慢。 – Mihai 2014-06-04 22:24:10