我正在使用I / O密集型应用程序进行一些实验,并试图了解改变内核I / O缓冲区大小,不同电梯algorithm等的影响。
我如何知道内核中I / O缓冲区的当前大小? 内核是否需要使用多个缓冲区? 我怎样才能改变这个缓冲区的大小? 有没有一个configuration文件存储这个信息?
(要清楚的是,我不是在谈论处理器或磁盘caching,我正在谈论缓冲区读取/写入之前,内部在内部使用的缓冲区之前,不时刷新到磁盘)。
提前致谢。
内核不会按照您的想法缓冲读取和写入操作……它维护一个“页面缓存”,用于保存磁盘中的页面。 你不能操纵它的大小(好吧,不是直接的)。 内核将始终使用所有可用的空闲内存作为页面缓存。
你需要解释你真的想要做什么。 如果要控制内核从磁盘预取多少数据,请尝试搜索“linux readahead”。 (提示: blockdev --setra XXX
)
如果你想控制内核在刷新到磁盘之前保存脏页面的时间,可以尝试搜索“linux dirty_ratio”。
特定的应用程序也可以使用O_DIRECT
完全绕过页面缓存,并且可以使用fsync
, sync_file_range
, posix_fadvise
和posix_madvise
对它进行一些控制。 ( O_DIRECT
和sync_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中,以便大量分发到许多系统。