问题标签 [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 回答
2846 浏览

alignment - open:直接 I/O 中的参数无效

我试图通过内核 AIO API进行AIO练习。这是一些代码:

但我的open()电话仍然失败:

我已经搜索了那个错误。他们中的一些人说您必须在直接 I/O 的情况下进行对齐。通过使用命令:

我得到的block size是 4096。但是为什么 open() 调用仍然失败?

0 投票
1 回答
1138 浏览

linux - lio_listio:如何等待所有请求完成?

在我的 C++ 程序中,我使用该lio_listio调用一次发送许多(最多几百个)写请求。之后,我做了一些计算,当我完成后,我需要等待所有未完成的请求完成,然后才能提交下一批请求。我怎样才能做到这一点?

现在,我只是aio_suspend循环调用,每次调用一个请求,但这看起来很难看。看起来我应该使用struct sigevent *sevp参数来lio_listio. 我目前的猜测是我应该做这样的事情:

  • 在主线程中,创建一个互斥锁并在调用lio_listio.
  • 在对 的调用中lio_listio,指定解锁此互斥锁的通知函数/信号处理程序。

这应该给我想要的行为,但它会可靠地工作吗?是否允许从信号处理程序上下文中操作互斥锁?我读到 pthread 互斥锁可以提供错误检测,并且如果您尝试从同一个线程再次锁定它们或从不同的线程解锁它们,则此解决方案依赖于死锁。

示例代码,使用信号处理程序:

示例代码,使用通知功能 - 可能效率较低,因为创建了一个额外的线程:

0 投票
2 回答
394 浏览

c - aio_write 是否总是写入整个缓冲区?

我知道write即使没有写入整个缓冲区(如果被信号中断),POSIX 函数也可以成功返回。您必须检查短写并恢复它们。

但是aio_write有同样的问题吗?我不认为它会发生,但文档中没有提到它,我找不到任何说明它不会发生的东西。

0 投票
1 回答
268 浏览

linux - 块层中的重复 LBA 请求

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

0 投票
3 回答
2964 浏览

c++ - 使用带有 O_DIRECT 标志的 libaio 读取文件

我正在使用异步 lib​​aio 读取文件。下面的代码显示了我是如何做到这一点的。代码工作正常,但现在我想切换到 O_DIRECT 模式以避免文件缓存。当我将第 25 行更改为 fd = open("./testfile", O_RDONLY|O_DIRECT); 程序停止正常工作。(io_getevents 不返回任何数据)。您能帮我调整程序,使其在 O_DIRECT 标志下也能正常工作吗?

提前致谢

操作系统:Ubuntu 12.10 3.5.0-26-generic)

0 投票
1 回答
4095 浏览

linux - Linux open(path, O_NONBLOCK | O_RDONLY | O_DIRECT) 块预先在文件中

我想在我的程序中读取异步磁盘。

服务器上有很多硬盘,如果一个硬盘很慢,则程序阻塞。我想使呼叫异步。

如果我打电话:

打开(路径,O_NONBLOCK | O_RDONLY | O_DIRECT)

然后预读,然后预读最多使用 8000 微秒,但会阻止我的程序。

是否可以在没有线程池的情况下启用异步磁盘读取?

0 投票
0 回答
2713 浏览

linux - 我在 RedHat 中的 SIGEV_THREAD 的 aio_read 完成例程中收到“资源暂时不可用”

这是我的设计;

1)初始化AIO控制块;

2)然后触发异步读取操作;

3)这是我的完成例程;

4)在AIO完成例程中,我在空闲时间反复收到“资源暂时不可用”,但是当对方发送一些东西时,我可以读取正确的数据。我认为Linux内核中存在错误。如果套接字中没有数据,则不应使用“资源暂时不可用”错误调用 AIO 完成例程。无谓地浪费时间。。

提前致谢

0 投票
1 回答
637 浏览

c++ - io_getevents 在比 timout 更短的时间内返回的作业数量少于请求的数量

我正在阅读 SSD,请求 20 个异步作业。io_getevents 返回值 7 表示它已超时。超时设置为 10 秒,如下所示。通话经过的时间实际上是 4.89e-05 秒,例如,还剩下几乎所有 10 秒。问:有人遇到过这样的事情吗?如果你这样做了,那么你找到解决方案了吗?

以下是部分代码:

当 ec 返回 7, ts.tv_sec = 10,ts.tv_nsec = 0

Linux内核:

非常感谢您的帮助!顺便提一句。我将无法在几个小时之前检查该帖子。

0 投票
1 回答
2014 浏览

linux - io_submit 和带有 O_ASYNC 的文件有什么区别

我正在阅读这篇关于异步磁盘文件 I/O 的教程,但是它并没有让事情变得清晰,它实际上让我更加困惑。

有两种不同的异步。根据教程的 I/O 模型:

  1. 异步阻塞 I/O,您使用.打开文件O_ASYNC,然后使用epoll// 。pollselect

  2. 使用 glibc 的 AIO 的异步 IO

由于 glibc 使用线程池实现 AIO,所以我在这个问题中用“AIO”指的是内核 AIO,即io_submit

至少从概念上看,似乎没有太大区别——io_submit可以让你发出多个 I/O 请求,而另一方面,readO_ASYNC你一起使用可以只发出一个带有文件位置的请求。

本指南还提到使用epoll作为 Linux AIO 的替代方案:

民意调查。Linux对用作异步 I/O 机制的支持有限。epoll对于以缓冲模式打开的文件(即没有O_DIRECT)的读取,如果文件以 方式打开O_NONBLOCK,则读取将返回 EAGAIN 直到相关部分在内存中。对缓冲文件的写入通常是立即的,因为它们是通过另一个写回线程写出的。但是,这些机制并没有提供直接 I/O 提供的对 I/O 的控制级别。

epoll用作 AIO 替代品有什么问题?或者换句话说,我们需要[新界面]io_submit解决的问题是什么?

0 投票
1 回答
357 浏览

c - 执行异步 I/O 操作时退出

aio_read()程序可能首先使用or发出异步 I/O 操作,aio_write()然后调用exit()以终止自身。

我的问题是,exit()调用会等到异步 i/o 完成还是程序将直接终止?