[英]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
完全绕过页面缓存,并且可以使用fsync
、 sync_file_range
、 posix_fadvise
和posix_madvise
对其进行一些控制。 ( O_DIRECT
和sync_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.