linux - block 层中重复的 LBA 请求

标签 linux asynchronous io linux-kernel aio

我正在使用 blktrace 来了解 block 层行为 多线程IO负载高IO负载。我可以观察一些 block 层中重复的 LBA 请求。例如我只有一个 在我的原始工作负载中向 LBA 47568 写入请求。然而,blktrace 显示 121 个写入 LBA 47568 的请求!!!下面是一部分 blkparse 日志,仅过滤 I 事件(IO 插入请求 队列)。我试图理解为什么会发生这种现象以及如何发生 我可以消除它吗?我选择了 noop IO 调度程序并值 2 /sys/block/sdX/nomerge 以避免 IO 合并。我非常感谢你的帮助 提前。

  8 240  0     7539     0.073300123 32282  I  WS 47576 + 8 [a]
  8 240  5     4462     0.073303974 32281  I  WS 47568 + 8 [a]
  8 240 11     4462     0.073306337 32283  I  WS 47584 + 8 [a]
  8 240  6     4462     0.073307970 32284  I  WS 47592 + 8 [a]
  8 240 10     4462     0.073309010 32285  I  WS 47600 + 8 [a]
  8 240  5     4466     0.073311526 32281  I  WS 47568 + 8 [a]
  8 240  5     4469     0.073316215   175  I  WS 47568 + 8 [kworker/5:1]
  8 240  7     4462     0.073352932 32286  I  WS 47608 + 8 [a]
  8 240  7     4466     0.073354061 32286  I  WS 47568 + 8 [a]
  8 240  8     4468     0.073358935 32280  I  WS 47624 + 8 [a]
  8 240  4     4468     0.073360550 32279  I  WS 47616 + 8 [a]
  8 240  8     4472     0.073362145 32280  I  WS 47568 + 8 [a]
  8 240  5     4473     0.073362711 32281  I  WS 47632 + 8 [a]
  8 240  5     4477     0.073364177 32281  I  WS 47568 + 8 [a]
  8 240  0     7545     0.073407427 32282  I  WS 47640 + 8 [a]
  8 240  0     7549     0.073409589 32282  I  WS 47568 + 8 [a]

最佳答案

好吧,我来回答我的问题了。事实证明,工作负载中的未完成 IO 数量大于通用设备驱动程序队列大小(/sys/block/sdX/device/queue_depth)。因此,有些请求在该队列已满时无法插入,从而导致这种现象。

关于linux - block 层中重复的 LBA 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15303747/

相关文章:

c# - Elasticsearch NEST索引和索引

java - 文件指针的偏移对于多种编程语言是否可靠?

更改 C 中 fopen() 的默认搜索目录

c++ - 用于 PowerPC 架构的交叉编译 Boost 库

c - 如何用 C 编写一个显示网页的程序?

c++ - 我们如何在 linux 中使用 c 或 c++ 调用系统函数,如 pwd 或 ls -l 而无需使用 system() 或 exec() 函数?

silverlight - 在 Silverlight 中串行处理多个异步 HTTP 请求

c - 线程局部变量和 fs 段

Python AsyncJsonWebSocketConsumer 问题

c++ - 0x50E2DF58 处的未处理异常 (msvcp120d.dll)