问题标签 [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.
alignment - open:直接 I/O 中的参数无效
我试图通过内核 AIO API进行AIO练习。这是一些代码:
但我的open()
电话仍然失败:
我已经搜索了那个错误。他们中的一些人说您必须在直接 I/O 的情况下进行对齐。通过使用命令:
我得到的block size
是 4096。但是为什么 open() 调用仍然失败?
linux - lio_listio:如何等待所有请求完成?
在我的 C++ 程序中,我使用该lio_listio
调用一次发送许多(最多几百个)写请求。之后,我做了一些计算,当我完成后,我需要等待所有未完成的请求完成,然后才能提交下一批请求。我怎样才能做到这一点?
现在,我只是aio_suspend
循环调用,每次调用一个请求,但这看起来很难看。看起来我应该使用struct sigevent *sevp
参数来lio_listio
. 我目前的猜测是我应该做这样的事情:
- 在主线程中,创建一个互斥锁并在调用
lio_listio
. - 在对 的调用中
lio_listio
,指定解锁此互斥锁的通知函数/信号处理程序。
这应该给我想要的行为,但它会可靠地工作吗?是否允许从信号处理程序上下文中操作互斥锁?我读到 pthread 互斥锁可以提供错误检测,并且如果您尝试从同一个线程再次锁定它们或从不同的线程解锁它们,则此解决方案依赖于死锁。
示例代码,使用信号处理程序:
示例代码,使用通知功能 - 可能效率较低,因为创建了一个额外的线程:
c - aio_write 是否总是写入整个缓冲区?
我知道write
即使没有写入整个缓冲区(如果被信号中断),POSIX 函数也可以成功返回。您必须检查短写并恢复它们。
但是aio_write
有同样的问题吗?我不认为它会发生,但文档中没有提到它,我找不到任何说明它不会发生的东西。
linux - 块层中的重复 LBA 请求
我正在使用 blktrace 来了解具有高 IO 负载的多线程 IO 工作负载中的块层行为。我可以在块层中观察到一些重复的 LBA 请求。例如,在我的原始工作负载中,我只有一个对 LBA 47568 的写入请求。但是,blktrace 显示 121 个请求写入 LBA 47568 !!! 下面是 blkparse 日志的一部分,它只过滤 I 事件(IO 插入到请求队列中)。我试图了解为什么会发生这种现象以及如何消除这种现象。我在 /sys/block/sdX/nomerge 中选择了 noop IO 调度程序和值 2 以避免 IO 合并。我提前感谢您的帮助。
c++ - 使用带有 O_DIRECT 标志的 libaio 读取文件
我正在使用异步 libaio 读取文件。下面的代码显示了我是如何做到这一点的。代码工作正常,但现在我想切换到 O_DIRECT 模式以避免文件缓存。当我将第 25 行更改为 fd = open("./testfile", O_RDONLY|O_DIRECT); 程序停止正常工作。(io_getevents 不返回任何数据)。您能帮我调整程序,使其在 O_DIRECT 标志下也能正常工作吗?
提前致谢
操作系统:Ubuntu 12.10 3.5.0-26-generic)
linux - Linux open(path, O_NONBLOCK | O_RDONLY | O_DIRECT) 块预先在文件中
我想在我的程序中读取异步磁盘。
服务器上有很多硬盘,如果一个硬盘很慢,则程序阻塞。我想使呼叫异步。
如果我打电话:
打开(路径,O_NONBLOCK | O_RDONLY | O_DIRECT)
然后预读,然后预读最多使用 8000 微秒,但会阻止我的程序。
是否可以在没有线程池的情况下启用异步磁盘读取?
linux - 我在 RedHat 中的 SIGEV_THREAD 的 aio_read 完成例程中收到“资源暂时不可用”
这是我的设计;
1)初始化AIO控制块;
2)然后触发异步读取操作;
3)这是我的完成例程;
4)在AIO完成例程中,我在空闲时间反复收到“资源暂时不可用”,但是当对方发送一些东西时,我可以读取正确的数据。我认为Linux内核中存在错误。如果套接字中没有数据,则不应使用“资源暂时不可用”错误调用 AIO 完成例程。无谓地浪费时间。。
提前致谢
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内核:
非常感谢您的帮助!顺便提一句。我将无法在几个小时之前检查该帖子。
linux - io_submit 和带有 O_ASYNC 的文件有什么区别
我正在阅读这篇关于异步磁盘文件 I/O 的教程,但是它并没有让事情变得清晰,它实际上让我更加困惑。
有两种不同的异步。根据教程的 I/O 模型:
异步阻塞 I/O,您使用.打开文件
O_ASYNC
,然后使用epoll
// 。poll
select
使用 glibc 的 AIO 的异步 IO
由于 glibc 使用线程池实现 AIO,所以我在这个问题中用“AIO”指的是内核 AIO,即io_submit
至少从概念上看,似乎没有太大区别——io_submit
可以让你发出多个 I/O 请求,而另一方面,read
与O_ASYNC
你一起使用可以只发出一个带有文件位置的请求。
本指南还提到使用epoll
作为 Linux AIO 的替代方案:
民意调查。Linux对用作异步 I/O 机制的支持有限。
epoll
对于以缓冲模式打开的文件(即没有O_DIRECT
)的读取,如果文件以 方式打开O_NONBLOCK
,则读取将返回 EAGAIN 直到相关部分在内存中。对缓冲文件的写入通常是立即的,因为它们是通过另一个写回线程写出的。但是,这些机制并没有提供直接 I/O 提供的对 I/O 的控制级别。
epoll
用作 AIO 替代品有什么问题?或者换句话说,我们需要[新界面]io_submit
解决的问题是什么?
c - 执行异步 I/O 操作时退出
aio_read()
程序可能首先使用or发出异步 I/O 操作,aio_write()
然后调用exit()
以终止自身。
我的问题是,exit()
调用会等到异步 i/o 完成还是程序将直接终止?