【问题标题】:Linux aio (not posix) examples?Linux aio(不是posix)的例子?
【发布时间】:2011-10-02 00:08:02
【问题描述】:

有没有人使用过 Linux aio 函数(io_*,不是 posix aio)?如果有人可以提供一些示例的链接(或在此处提供一些示例),那就太好了。另外,您对它们的使用有何一般看法/cmets?

我正在开发一个 I/O 库,有人建议我看看它们。众所周知,它们在某些情况下比 POSIX aio 表现更好,我想看看。

谢谢。

【问题讨论】:

  • 这是评论而不是答案,但除了在最极端的情况下,仅仅为了性能而选择复杂的非标准 API 可能是一个非常大的错误,尤其是当差异在最好的。如果您不喜欢 POSIX AIO(这是一个非常丑陋和痛苦的 API),更好的方法是创建专用的 IO 线程。
  • 是的。我的库中确实有用于 I/O 的专用线程。但是我和一个人进行了简短的交谈,他说当他使用 linux io_* 函数以随机顺序编写文件时,与“write”和“aio_write”相比,他看到了明显更好的性能。因此产生了好奇心。
  • 他试过pwrite吗?如果您将write 用于“随机顺序”,那么只需在每个write 之前进行额外的lseek 调用,就会在系统调用开销方面产生巨大的额外成本。您也可以尝试posix_fadvise 向内核提示您打算执行随机访问。
  • 他没有提到pwrite,所以我猜他没有,这就是为什么我很想尝试一下。几个小时以来我一直在研究,io_prep_pwrite 似乎是 aio 功能之一。
  • 在“Daniel McNiel's (OSDL) aiocp test”部分下找到了一个示例here

标签: c linux io linux-kernel


【解决方案1】:

更新:this shows 原生 linux io 接口示例

(This is an example 在 posix aio 接口上)。

关于这个问题的一些评论者:aio 库允许程序发出多个并行请求,内核可以按照最有效的查找和磁盘旋转顺序执行它们 - 即 io请求可能不会按照它们发出的顺序执行,这与在线程中发出同步请求不同。在 IO 密集型应用程序中,这可以显着提高 IO 性能,但对于大多数应用程序来说,它只会增加复杂性。

【讨论】:

  • 我不买。 所有 写入在写入磁盘之前先进入页面缓存。 (好吧,除非你使用O_DIRECT,但这不是我们要讨论的。)所以内核有足够的时间——通常是几秒钟——来积累写入并安排实际的磁盘访问以获得最佳性能。跨度>
  • 好吧,如果我允许以任何顺序执行 READ,我将获得所描述的性能优势——即如果我不关心我读东西的顺序,但只知道我需要阅读这 1000 种不同的东西,我可以让操作系统和磁盘确定我应该得到它的顺序。
  • 并且在写入时使用 O_DIRECT 我也可以获得同样的好处,如果我要实现一个需要在许多表中提交多个更新的数据库,我需要这个功能来获得最佳性能.
  • 感谢@soren,当您说内核可以以有效的顺序执行写入时,您是通过一些实验还是通过文档发现的?如果记录在案,您可以发布链接吗?
猜你喜欢
  • 2012-02-04
  • 2017-06-21
  • 2011-04-24
  • 2020-10-20
  • 2010-11-16
  • 2011-03-12
  • 2010-12-20
  • 1970-01-01
  • 2012-01-20
相关资源
最近更新 更多