Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在linux系统中停止磁盘I/O的页面缓存?_Linux_Caching_Io_Disk - Fatal编程技术网

如何在linux系统中停止磁盘I/O的页面缓存?

如何在linux系统中停止磁盘I/O的页面缓存?,linux,caching,io,disk,Linux,Caching,Io,Disk,这是我基于Linux2.6.32.12的系统: 1它包含20个进程,占用大量usr cpu 2需要以100M/s的速率将数据写入磁盘,这些数据最近不会被使用 我的期望: 它可以稳定运行,磁盘I/O不会影响我的系统 我的问题: 开始时,系统按照我的想法运行。但是随着时间的推移,Linux会为磁盘I/O缓存大量数据,这会导致物理内存的减少。最后,内存不足,Linux将交换我的进程。大量的cpu时间用于I/O,这将导致I/O问题 我所尝试的: 我试图解决这个问题,每次我写一个大数据块时都使用“fsyn

这是我基于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 show free 273m时,wa的百分比非常高,这会影响我的流程,而vmstat会显示很多si等等。

我不确定更改某些内容是否会影响总体性能

也许您可以在您的程序中使用and(更为罕见的是或
fdatasync(2)
syncfs(2)
,…)。还可以查看和
munlock(2)
,当然还有
munmap(2)
。也许我能帮上忙

在读卡器过程中,您可能会使用(可能在单独的线程中)


升级您的内核(升级到3.6或更高版本)肯定会有所帮助。自2.6.32版本以来,Linux在这些方面有了显著的改进。要删除页面缓存,您可以执行以下操作:

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

drop_缓存通常为0。并且,可以根据需要进行更改。正如您所确定的,您需要释放pagecache,所以这就是如何做到的。您还可以查看dirty_writeback_centisecs(及其相关的可调参数)(*/Documentation/sysctl/vm.txt#L129)以进行快速写回,但请注意,它可能会产生后果,因为它会调用内核闪光器线程来写出脏页。另外,请注意dirty_expire_centices的用法,它定义了某些数据需要多少时间才能有资格进行写操作

为什么这对你很重要?根据linuxatemyram.com的说法,“如果应用程序需要更多的内存,它们只是从磁盘缓存中取回。它们不会开始交换。”
但在我的情况下,我观察到交换。为什么你认为改变这种行为会提高整体性能?如果没有缓存,进程将始终保留在物理内存中。那么,没有交换入/出将保持低I/O。看来posix_fadvise是解决方案。让我试试。非常感谢,还有一个内核升级。