【问题标题】:How to change kernel i/o buffer size如何更改内核 i/o 缓冲区大小
【发布时间】:2014-11-07 22:22:10
【问题描述】:
我正在对 I/O 密集型应用程序进行一些实验,并试图了解改变内核 i/o 缓冲区大小、不同电梯算法等的影响。
我如何知道内核中 i/o 缓冲区的当前大小?内核是否在需要时使用多个缓冲区?如何更改此缓冲区的大小?是否有存储此信息的配置文件?
(需要明确的是,我不是在谈论处理器或磁盘缓存,我是在谈论内核内部使用的缓冲区,该缓冲区在不时将读取/写入刷新到磁盘之前对其进行缓冲)。
提前致谢。
【问题讨论】:
标签:
c
linux
io
linux-kernel
【解决方案1】:
内核不会像你想象的那样缓冲读写...它维护一个“页面缓存”来保存磁盘中的页面。你不能操纵它的大小(好吧,不是直接的,反正);内核将始终将所有可用的空闲内存用于页面缓存。
你需要解释你真正想要做什么。如果您想控制内核从磁盘预取多少数据,请尝试搜索“linux readahead”。 (提示:blockdev --setra XXX)
如果您想控制内核在将脏页刷新到磁盘之前将其保留多长时间,请尝试搜索“linuxdirty_ratio”。
特定应用程序也可以使用O_DIRECT 完全绕过页面缓存,并且可以使用fsync、sync_file_range、posix_fadvise 和posix_madvise 对其进行一些控制。 (O_DIRECT 和 sync_file_range 是特定于 Linux 的;其余的是 POSIX。)
如果您首先了解 Linux VM 子系统,尤其是页面缓存,您将能够提出更好的问题。
【解决方案2】:
我认为您的意思是磁盘 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 中,以便大规模分发到许多系统。