这是我的基于Linux2.6.32.12的系统:
1它包含20个进程,占用了大量的usr cpu
2它需要将速率为100M / s的数据写入磁盘,并且最近不会使用这些数据。
我的期望:
它可以稳定运行,磁盘I / O不会影响我的系统。
我的问题:
一开始,系统按我的想法运行。但随着时间的推移,Linux会为磁盘I / O缓存大量数据,从而导致物理内存减少。最后,没有足够的内存,那么Linux将交换进出我的进程。这将导致I / O问题,即I / O使用了大量的cpu时间。
我尝试了什么:
我尝试通过“fsync”解决问题,每当我写一个大块时。但物理内存在缓存增加时仍然在减少。
如何在此停止页面缓存,对我来说没用;
更多信息:
当Top显示免费46963m时,一切都很好,包括cpu%wa低和vmstat显示没有si左右。
当Top显示免费273m时,%wa是如此之高,这会影响我的进程,而vmstat显示很多si等等。
答案 0 :(得分: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已经在这些点上有了显着改善,这是非常老的。
答案 1 :(得分:1)
要删除pagecache,您可以执行以下操作:
"echo 1 > /proc/sys/vm/drop_caches"
drop_caches通常为0.并且可以根据需要进行更改。正如您已经确定的那样,您需要释放pagecache,因此这是如何做到的。您还可以查看dirty_writeback_centisecs(及其相关的可调参数)(http://lxr.linux.no/linux+ * / Documentation / sysctl / vm.txt#L129)以进行快速回写,但请注意它可能会产生后果,因为它会调用内核闪存线程写出脏页。另外,请注意dirty_expire_centices的用法,它定义了一些数据需要多少时间才能进行写出。