【问题标题】:How to stop page cache for disk I/O in my linux system?如何在我的 linux 系统中停止磁盘 I/O 的页面缓存?
【发布时间】:2013-05-07 06:33:36
【问题描述】:

这是我基于 Linux2.6.32.12 的系统:
1 它包含20个占用大量usr cpu的进程 2 需要以 100M/s 的速率将数据写入磁盘,这些数据最近不会被使用。

我的期望:
它可以稳定运行,磁盘 I/O 不会影响我的系统。

我的问题:
一开始,系统按我想的那样运行。但随着时间的推移,Linux 会为磁盘 I/O 缓存大量数据,从而导致物理内存减少。最后,内存不足,Linux 会换入/换出我的进程。大量cpu时间用于I/O会导致I/O问题。

我的尝试:
我尝试通过每次写入大块时“fsync”来解决问题。但是物理内存仍在减少,而缓存增加。

这里怎么停止页面缓存,对我没用

更多信息:
当 Top 显示空闲 46963m 时,一切正常,包括 cpu %wa 低,vmstat 显示没有 si 左右。
当 Top 显示 free 273m 时,%wa 太高了,这会影响我的进程,而 vmstat 显示很多 si 等等。

【问题讨论】:

  • 为什么这对你很重要?阅读linuxatemyram.com
  • 根据 linuxatemyram.com,“如果应用程序需要更多内存,他们只需从磁盘缓存中取回。他们不会开始交换。”
    但在我的情况下,我观​​察到交换。
  • 您为什么认为改变这种行为会提高整体性能?
  • 如果没有缓存,进程将始终停留在物理内存中。那么没有换入/换出将保持低 I/O。

标签: linux caching io disk


【解决方案1】:

我不确定更改某些内容会影响整体性能。

也许你可能会在你的程序中使用posix_fadvise(2)sync_file_range(2)(更不用说fsync(2)fdatasync(2)sync(2)syncfs(2),...)。另请查看madvise(2)mlock(2)munlock(2),当然还有mmap(2)munmap(2)。也许ionice(1) 可以提供帮助。

在阅读器进程中,您可能会使用readhahead(2)(可能在单独的线程中)。

升级您的内核(到 3.6 或更高版本)肯定会有所帮助:自 2.6.32 以来,Linux 在这些方面有了显着改进,这真的很老了。

【讨论】:

  • 似乎 posix_fadvise 是解决方案。让我试试。非常感谢
  • 尝试内核升级。
【解决方案2】:

要删除页面缓存,您可以执行以下操作:

         "echo 1 > /proc/sys/vm/drop_caches"

drop_caches 通常为 0。并且,可以根据需要进行更改。正如您自己确定的那样,您需要释放页面缓存,所以这是如何做到的。您还可以查看dirty_writeback_centisecs(及其相关的可调参数)(http://lxr.linux.no/linux+*/Documentation/sysctl/vm.txt#L129)以进行快速写回,但请注意它可能会产生后果,因为它会调用内核闪存线程来写出脏页。另外,请注意dirty_expire_centices 的使用,它定义了一些数据需要多少时间才能被写入。

【讨论】:

    猜你喜欢
    • 2012-03-22
    • 2011-12-18
    • 2019-10-26
    • 2015-11-06
    • 2023-03-13
    • 2010-10-16
    • 2012-08-20
    • 2019-12-07
    • 2014-05-20
    相关资源
    最近更新 更多