1

这是我基于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 显示空闲 273m 时,%wa 太高了,这会影响我的进程,而 vmstat 显示很多 si 等等。

4

2 回答 2

1

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

也许你可能会在你的程序中使用posix_fadvise(2)sync_file_range(2)(很少使用fsync(2) or fdatasync(2)or or sync(2) or syncfs(2), ...)。还要看看madvise(2)mlock(2) 和munlock(2),当然还有mmap(2)munmap(2)。也许ionice(1)可以提供帮助。

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

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

于 2013-05-13T10:25:01.943 回答
1

要删除 pagecache,您可以执行以下操作:

         "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 的使用,它定义了一些数据需要多少时间才能被写入。

于 2013-05-13T16:17:15.157 回答