如何更改内核I / O缓冲区大小

我正在使用I / O密集型应用程序进行一些实验,并试图了解改变内核I / O缓冲区大小,不同电梯algorithm等的影响。

我如何知道内核中I / O缓冲区的当前大小? 内核是否需要使用多个缓冲区? 我怎样才能改变这个缓冲区的大小? 有没有一个configuration文件存储这个信息?

(要清楚的是,我不是在谈论处理器或磁盘caching,我正在谈论缓冲区读取/写入之前,内部在内部使用的缓冲区之前,不时刷新到磁盘)。

提前致谢。

内核不会按照您的想法缓冲读取和写入操作……它维护一个“页面缓存”,用于保存磁盘中的页面。 你不能操纵它的大小(好吧,不是直接的)。 内核将始终使用所有可用的空闲内存作为页面缓存。

你需要解释你真的想要做什么。 如果要控制内核从磁盘预取多少数据,请尝试搜索“linux readahead”。 (提示: blockdev --setra XXX

如果你想控制内核在刷新到磁盘之前保存脏页面的时间,可以尝试搜索“linux dirty_ratio”。

特定的应用程序也可以使用O_DIRECT完全绕过页面缓存,并且可以使用fsyncsync_file_rangeposix_fadviseposix_madvise对它进行一些控制。 ( O_DIRECTsync_file_range是Linux专用的,其余的是POSIX。)

如果您首先了解Linux VM子系统,尤其是页面缓存,您将能够提出更好的问题。

我认为你的意思是磁盘IO队列。 例如:

 $ cat /sys/block/sda/queue/nr_requests 128 

如何使用此队列取决于正在使用的IO调度程序。

 $ cat /sys/block/sda/queue/scheduler noop anticipatory deadline [cfq] 

cfq是最常见的选择,尽管在具有高级磁盘控制器和虚拟客户系统的系统上, noop也是一个非常好的选择。

这个信息没有配置文件,我知道。 在我需要更改队列设置的系统上,我将更改放到/etc/rc.local中,尽管您可以使用完整的初始化脚本,并将其放入RPM或DEB中,以便大量分发到许多系统。