繁体   English   中英

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

[英]How to change kernel i/o buffer size

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

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

(需要明确的是,我不是在谈论处理器或磁盘缓存,我是在谈论 kernel 内部使用的缓冲区,该缓冲区在不时将读取/写入刷新到磁盘之前缓冲读取/写入)。

提前致谢。

kernel 不会像您想象的那样缓冲读取和写入...它维护一个“页面缓存”来保存磁盘中的页面。 你不能操纵它的大小(好吧,不是直接的,反正); kernel 将始终使用所有可用的免费 memory 作为页面缓存。

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

如果您想控制 kernel 在将脏页刷新到磁盘之前将其保留多长时间,请尝试搜索“linux dirty_ratio”。

特定应用程序还可以使用O_DIRECT完全绕过页面缓存,并且可以使用fsyncsync_file_rangeposix_fadviseposix_madvise对其进行一些控制。 O_DIRECTsync_file_range是特定于 Linux 的;rest 是 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,尽管您可以使用完整的 init 脚本并将其放入 RPM 或 DEB 中,以便大规模分发到许多系统。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM