如何更改内核i / o缓冲区大小

时间:2011-08-12 18:45:14

标签: c linux io linux-kernel

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

如何知道内核中i / o缓冲区的当前大小?内核是否在需要时使用多个缓冲区?如何更改此缓冲区的大小?是否存在存储此信息的配置文件?

(很明显,我不是在谈论处理器或磁盘缓存,我在谈论内核使用的缓冲区,它会在不时地将它们刷新到磁盘之前缓冲读/写)。

提前致谢。

2 个答案:

答案 0 :(得分:9)

内核不会以您的思维方式缓冲读取和写入...它维护一个“页面缓存”,用于保存磁盘中的页面。你无法操纵它的大小(好吧,不管怎么说);内核将始终使用所有可用空闲内存用于页面缓存。

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

如果你想控制内核在将它们刷新到磁盘之前保存多长时间,请尝试搜索“linux dirty_ratio”。

特定应用程序还可以使用O_DIRECT完全绕过页面缓存,并且可以使用fsyncsync_file_rangeposix_fadvise和{{{}}对其进行一些控制{1}}。 (posix_madviseO_DIRECT是特定于Linux的;其余是POSIX。)

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

答案 1 :(得分:3)

我认为你的意思是磁盘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中,以便大量分发到许多系统。