问题标签 [aio]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1099 浏览

c++ - Linux 系统调用 aio_write() 失败,错误代码为 22 (EINVAL)

我有一个使用 linux aio_write 和 aio_read 的测试实用程序。这个测试实用程序包装了我的静态库并对其进行测试。这个库是多线程的黑盒。

到目前为止,它运行良好。但是现在我们对这个黑盒做了很大的改变,这会导致测试实用程序在提交第一个 IO 时立即失败。此 IO 返回 errno 22 == EINVAL。

根据 aio_write 手册页,如果以下字段之一无效,则会发出此错误 --> aio_offset, aio_reqprio, aio_nbytes。我在 gdb 中运行它并测试它们的值,只要与struct aiocb *输入参数中的所有其他值一样。我的结论是输入的参数都是有效的。

我怀疑线程在黑盒内的工作方式发生了一些变化。这就是我怀疑导致此问题的原因(我找不到任何其他解释)。

我真正想了解的是:哪些情况会导致 aio_write() 返回 EINVAL 错误代码???

只是为了澄清一下,当我将黑盒替换为旧版本时,使用相同的测试实用程序它工作正常......(我还在这里测试了输入参数,因为它们与错误版本的输入参数匹配)。

0 投票
2 回答
208 浏览

c - 填充文件 ASCII 值

我想创建一个填充 0 或其他字母的文件。这是我的功能

这是我的主要内容

所以我的输出应该是用零值填充的文件,但我的文件充满了垃圾

为什么?怎么了?

这是代码:

sukurti - 如果该文件不存在则创建新文件并填充 - 填充创建的文件

编辑:我知道我写到文件结束了

0 投票
1 回答
1897 浏览

c - io_submit() 阻塞直到前一个操作完成

我是通过libaio使用Linux 内核 AIO的,在上一个读取操作完成之前,我必须提交下一个读取操作。问题是阻塞了一段时间,正如我可以从间隔中推断的那样,它等待前一个操作完成。io_submit()

我知道我可以用一个 将多个操作排入队列io_submit(),但这对我来说不是一个选择,因为当已经是提交第一个读取操作的时间时,我不知道下一个读取操作会如何。

它只对我有用,还是对每个人都有效?在第二种情况下,请问我是否正在寻找可行的东西,或者我必须回退到线程模型?

0 投票
1 回答
406 浏览

linux - 我可以依靠 Linux close() 不阻塞文件 I/O 吗?

我正在使用 Linux aio ( io_submit()/ io_getevents()) 进行文件 I/O。由于某些操作没有 aio 等效项 ( open(), fsync(), fallocate()),因此我使用了一个可能会阻塞而不影响主线程的工作线程。我的问题是,我应该添加close()到这个列表中吗?

所有文件都O_DIRECT在 XFS 上打开,但我对这个问题的一般答案以及关于我选择的文件系统和打开模式的具体答案都很感兴趣。

请注意,使用工作线程close()并非易事,因为close()通常在清理路径中调用,这不是启动工作线程请求并等待它的好地方。所以我希望这close()在这种情况下是非阻塞的。

对于这个问题,“阻塞”是指等待 I/O 操作,或者等待某个只有在 I/O 操作完成时才释放的锁,但不包括页面错误服务。

0 投票
1 回答
240 浏览

java - 如果内核不支持 AIO,java AsynchronousFileChannel 是如何工作的

我有 2 个问题

  1. 如果我的操作系统不支持 AIO(低于 linux 2.6 等),AsynchronousFileChannel 将如何工作。

  2. 如何将 sth 附加到 AsynchronousFileChannel,据我所知 AsynchronousFileChannel 只支持 write(ByteBuffer, long position, A attachment, CompletionHandler handler) 和 write(ByteBuffer src, long position) 都需要一个位置参数。我应该自己计算位置吗?

0 投票
1 回答
212 浏览

c - aio_write 的错误

我正在重写 awrite以便aio_write我可以处理超时(我不想打扰select)。我从手册页中不明白的一件事是如何aio_write失败。

因为write我最感兴趣的是部分写入和EINTR. 可以aio_writeaio_error准确地说)返回EINTR或进行部分写入吗?

0 投票
1 回答
298 浏览

c++ - libaio的vector读写功能可以直接用在设备上吗?

关于与直接设备一起使用的 libaio 文档说,读写偏移量必须是扇区对齐的,例如典型 SSD/HDD 的 512 字节的倍数。网络上的一些可用信息还表明,用作源和目标的用户空间缓冲区也需要对齐。

使用直接设备时,向量读写函数的对齐限制是什么?我假设操作的磁盘端仍然需要扇区对齐(毕竟它是在与幕后的块设备通信)。我的分散收集列表可以将小块散布到用户空间中的未对齐目标吗?

我正在研究 debian Jessie,并且已经验证了 libaio 中对矢量 I/O 的支持。

0 投票
1 回答
443 浏览

arrays - io_submit 等待所有 oracle dbwriter I/O

作为背景,自 80 年代以来,我一直在调整数据库平台。所以,我过去处理过很多异步 I/O 问题。这个是新的,很奇怪。

首先,我在 RHEL 7.1 64 位 (3.10.0-229) 上使用带有 ASM 的 Oracle 12c。我一直在使用两个 EMC CX4-960 阵列,总共 72 个 SSD。我总共进行了约 105K 读取/秒,65K 写入/秒。(是的,这是一个非常强大的存储后端!)磁盘写入延迟为 2-3 毫秒。当 oracle dbwriter 刷新缓冲区(通常是大批量和异步)时,以下 strace 片段显示 io_submit() 和 io_getevents() 在几毫秒内完成,然后需要几毫秒才能完成所有写入,然后我们移动到下一批。(我在 io_submit() 行中删除了已提交块的详细信息:

到目前为止,一切都很好。然后我切换到我正在测试的两个 Tegile t3600 阵列。这些家伙甚至更快,并且可以以更低的延迟为我提供更多的 IOPS。问题是我很快遇到了 50% 或更高的 Oracle“空闲缓冲区等待”。dbwriters 无法跟上,迫使前台写入和各种坏事。令人惊讶的是,dbwriter 无法使用如此快速的存储刷新足够的缓冲区。但 strace 显示了原因。请注意,iostat 显示平均磁盘写入延迟约为 0.7 毫秒。

因此,出于某种原因,具有 517 个块的 io_submit() 需要 505 毫秒才能返回。为什么?

任何想法为什么会发生这种情况?似乎该数组以某种方式告诉操作系统以串行方式发出写入。FWIW,我什至在阵列控制器中启用了写回写缓存。所以它似乎是操作系统本身的东西

0 投票
1 回答
297 浏览

linux - 在 Linux 上使用 libaio 发送 FUA 请求

我正在尝试使用 libaio 访问块设备(例如 /dev/sdb)。我工作正常,但我想知道如何使用 libaio 的 API 执行 FUA(强制单元访问)。

我必须说我在该主题上找到的文档很差,希望你们中的一个能够帮助我。

0 投票
1 回答
671 浏览

c - Unix 上 C 中的 AIO - aio_fsync 用法

我无法理解这个函数aio_fsync的作用。我已经阅读了手册页,甚至在谷歌上搜索过,但找不到可以理解的定义。你能用简单的方式解释它,最好用一个例子吗?