【问题标题】:Using linux capabilites to read discontinuous runs of blocks使用 linux 功能读取块的不连续运行
【发布时间】:2012-07-16 15:32:51
【问题描述】:

读取具有 dbms 样式访问模式的文件的最佳方法是什么?我的意思是:

  • 我事先知道需要获取的页面偏移量。
  • 有很长的连续页面。
  • 可能存在小的不连续性。
  • 可能存在较长的不连续性。
  • 所有偏移都是有序的(没有前后移动)。

此类偏移列表的示例: 1,2,3,4,5,6,7,8,1000,1001,1003,1004,1005,1010,1011,1012,31004,31005,31006。

我对使用哪种策略来获得最佳性能有点困惑。

  • 我应该依赖 Linux 页面管理器吗?如何?将循环通过 偏移并一次读取 1 个块好吗?
  • 使用 O_DIRECT 打开文件并管理我自己,即:交替长读取和搜索。在这种情况下我应该禁用预读吗?

【问题讨论】:

  • O_DIRECT 可能很难使用,因为您必须自己管理对齐方式。
  • 您可以使用 Linux aio 或 posix aio 接口,将所有请求排队。驱动程序应该能够找出完成读取的最佳方式。
  • 你试过 mmap 来看看效果吗?

标签: c++ c linux-kernel hard-drive


【解决方案1】:

我不知道它最终是否是“最好的”,但我可能会mmap() 文件,然后使用madvise() 尝试强制系统预先设置错误页面范围。显然,这还需要在您的偏移列表上进行一些计算以识别连续范围(好吧,它实际上并不需要它,但是如果有很多这样的调用,这将减少 madvise() 调用并获得一点效率范围)。提前到故障前多远取决于您在每个页面/范围上花费多少时间来进行您尝试进行的任何计算,因此需要进行一些测试/调整。您还可以使用madvise() 来暗示您在完成后不再需要范围,因此它可能会被撞到 to-be-freed-next 列表的前面。

【讨论】:

  • 好的,我会尝试 mmap,但这意味着完全依赖操作系统来进行正确的预读和缓冲。我希望我可以手动做一些更聪明的事情,因为我可以组织我的操作。类似于: read(fd,run1,..) lseek() read(fd, run2, ..) lseek 等。但这建议我禁用预读并自己决定什么是小的不连续性(我最好阅读)大的(我应该寻找的)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-29
  • 1970-01-01
  • 2014-05-22
  • 2018-02-14
  • 1970-01-01
  • 2017-06-10
  • 2022-10-25
相关资源
最近更新 更多