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

8
我正在进行一些与I/O密集型应用程序相关的实验,并尝试了解变化内核i/o缓冲区大小、不同电梯算法等的影响。如何知道内核中当前i/o缓冲区的大小?内核是否会根据需要使用多个缓冲区?我该如何更改此缓冲区的大小?是否有一个存储此信息的配置文件?(明确一点,我不是在谈论处理器或磁盘缓存,我是在谈论内核在将读/写缓冲到磁盘之前内部使用的缓冲区)。谢谢您的帮助。
2个回答

10
内核不会按照您想象的方式缓冲读写... 它维护一个"页面缓存",其中包含来自磁盘的页面。 您无法操纵其大小(嗯,至少不能直接操作); 内核始终会使用所有可用的空闲内存来进行页缓存。
您需要解释一下您真正想要做什么。 如果您想对内核预取自磁盘的数据量进行某些控制,请尝试搜索"linux readahead"。(提示: blockdev --setra XXX)
如果您希望对内核在将脏页刷新到磁盘之前保留这些页的时间有所控制,请尝试搜索"linux dirty_ratio"。
特定应用程序也可以通过使用O_DIRECT完全绕过页面缓存,并且可以使用fsyncsync_file_rangeposix_fadviseposix_madvise来对其进行某些控制。 (O_DIRECTsync_file_range是仅限于Linux的; 其余是POSIX。)
如果您首先学习Linux VM子系统,特别是页面缓存,那么您将能够提出更好的问题。

4

我想你是指磁盘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 中,尽管您也可以使用完整的 init 脚本,并将其放入 RPM 或 DEB 中以进行大规模分发到许多系统中。


这不完全是我想要的,但也有所帮助。 - Korizon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接