I/O 调度中的前端合并是什么以及如何调整此参数?

I/O 调度中的前端合并是什么以及如何调整此参数?

我的 Linux 使用最后期限I/O 调度算法。其中一个参数是front_merges下的参数/sys/block/sda/queue/iosched/front_merges。默认情况下,它设置为 1,这意味着很可能会发生前端合并。如果不希望发生前端合并,可以将其设置为 0 以获得性能提升。

  1. 前端合并到底是什么?有人能描述一下吗?
  2. 我如何知道或测试我的系统上是否发生前端合并?

答案1

内核文档说得最好:

有时,请求会进入与队列中已有请求相邻的 io 调度程序。它要么适合该请求的后面,要么适合前面。这被称为后合并候选或前合并候选。由于文件通常的布局方式,后合并比前合并更常见。对于某些工作负载,您甚至可能知道花时间尝试前合并请求是浪费时间。将 front_merges 设置为 0 会禁用此功能。由于缓存的 last_merge 提示,前合并可能仍会发生,但由于这基本上是 0 成本,因此我们将其保留为启用状态。我们只是在调用 io 调度程序合并函数时禁用 rbtree 前扇区查找。

前端合并不常见的原因是,写入器通常不会以相反的顺序将块写入磁盘。

考虑一个对包含两个块的新文件进行简单顺序写入的进程。它首先写入块 0,然后写入块 1。当块 1 到达队列时,它位于块 0 的后面,因此内核会进行反向合并,然后同时将两个块发送到物理磁盘。这是典型情况。

为了获得前端合并,该过程首先必须写入块 1,然后向后查找并写入块 0。这不是典型的情况,但对于某些工作负载确实会发生这种情况(例如数据库)。

我不认为这里的性能变化会那么显著,即使 I/O 很高。您可以在实际工作量上以两种方式进行测试。如果您没有执行磁盘密集型操作,那么这并不重要。

答案2

红帽说:

front_merges:如果您知道您的工作负载永远不会生成前端合并,则可以将此可调参数设置为 0。除非您已经测量了此检查的开销,否则建议将其保留为默认设置 (1)。

因此建议保留默认设置。我可以告诉你,我在调优过程中通常不会修改此设置,但这取决于你的工作量。

看:Linux - 实际硬件 RAID 控制器调整(scsi 和 cciss)

最好的方法是采用科学的方法对您的数据、系统和环境进行测试。


您可以使用iostat -x命令并跟踪输出中的rrqm/swrqm/s字段来监控合并活动。这些列中任何非零值都表示连续请求在传送到底层存储之前已合并。这也表明工作负载是连续的。

如果您没有在这些列中看到活动,则修改截止期限 front_merge 可调参数将不会给您带来好处。

您在问题中没有提供任何有关服务器类型或存储子系统的真实细节。如果您使用任何类型的带缓存的硬件 RAID 或某些文件系统,它们都会影响此可调参数。

相关内容