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

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

问题描述:

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

如何知道内核中I/O缓冲区的当前大小?内核是否需要使用多个缓冲区?我怎样才能改变这个缓冲区的大小?有没有一个配置文件存储这个信息? (不言而喻,我不是在谈论处理器或磁盘缓存,我在谈论缓冲区读取/写入之前,内核在内部使用的缓冲区,然后再将其刷新到磁盘上)。

在此先感谢。

内核不会按照您的想法缓冲读取和写入操作......它维护一个“页面缓存”,用于保存磁盘中的页面。你不能操纵它的大小(好吧,不是直接的)。内核将始终使用全部可用空闲内存作为页面缓存。

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

如果您想要控制内核在将页面刷新到磁盘之前将脏页面保留多久,请尝试搜索“linux dirty_ratio”。

特定的应用程序也完全可以通过使用O_DIRECT绕过页面缓存,它可以使用它fsyncsync_file_rangeposix_fadviseposix_madvise在行使一定的控制。 (O_DIRECTsync_file_range是Linux专用的;其余的是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中,尽管您可以使用完整的初始化脚本,并将其放入RPM或DEB中,以便大量分发到许多系统。

+0

那不是我正在寻找的东西,但也有帮助。 – jitihsk