我正在使用I / O密集型应用程序进行一些实验,并试图了解改变内核i / o缓冲区大小,不同电梯算法等的影响。
如何知道内核中i / o缓冲区的当前大小?内核是否在需要时使用多个缓冲区?如何更改此缓冲区的大小?是否存在存储此信息的配置文件?
(很明显,我不是在谈论处理器或磁盘缓存,我在谈论内核使用的缓冲区,它会在不时地将它们刷新到磁盘之前缓冲读/写)。
提前致谢。
答案 0 :(得分:9)
内核不会以您的思维方式缓冲读取和写入...它维护一个“页面缓存”,用于保存磁盘中的页面。你无法操纵它的大小(好吧,不管怎么说);内核将始终使用所有可用空闲内存用于页面缓存。
你需要解释你真正想做的事情。如果您想控制内核从磁盘预取多少数据,请尝试搜索“linux readahead”。 (提示:blockdev --setra XXX
)
如果你想控制内核在将它们刷新到磁盘之前保存多长时间,请尝试搜索“linux dirty_ratio”。
特定应用程序还可以使用O_DIRECT
完全绕过页面缓存,并且可以使用fsync
,sync_file_range
,posix_fadvise
和{{{}}对其进行一些控制{1}}。 (posix_madvise
和O_DIRECT
是特定于Linux的;其余是POSIX。)
如果您首先了解Linux VM子系统,尤其是页面缓存,您将能够提出更好的问题。
答案 1 :(得分:3)
我认为你的意思是磁盘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中,以便大量分发到许多系统。