【问题标题】: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 完全绕过页面缓存,并且可以使用fsyncsync_file_rangeposix_fadviseposix_madvise 对其进行一些控制。 (O_DIRECTsync_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 中,以便大规模分发到许多系统。

      【讨论】:

      • 这不是我想要的,但这也有帮助。
      猜你喜欢
      • 2014-09-20
      • 1970-01-01
      • 2019-10-26
      • 2011-12-18
      • 1970-01-01
      • 1970-01-01
      • 2011-03-03
      • 2015-10-26
      • 1970-01-01
      相关资源
      最近更新 更多