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

linux - linux IOSTAT双重计数AIO写操作?

作为调试 IO 生成器的一部分,我在 x64 硬件上运行的 RH 6.4 下遇到了一组奇怪的结果(在多个系统上验证):

-- 应用程序使用 linux 异步 IO(即非 posix)访问原始磁盘分区(/dev/sdb1,O_DIRECT),并以 root 身份运行

-- 应用程序报告 100 io/s 和 60% 的写入。

-- 应用程序的 strace 向 io_submit() 和 io_getevents() 报告每秒 100 次调用,反映每秒 100 次 AIO 操作

-- 'dstat --aio' 显示每秒 100 次操作

-- iostat 按预期报告每秒 40 次读取,但每秒写入 120 次,是预期的两倍

-- 使用同步 IO 的早期实现不显示“双倍”写入

这种行为是已知的错误吗?

0 投票
1 回答
906 浏览

c++ - linux-aio 可以进行类似 sendfile() 的操作吗?

我想通过 linux-aio 将数据从一个文件描述符发送到另一个文件描述符,而无需缓冲,也无需将数据传入和传出用户空间。linux-aio 可以实现这样的 sendfile64() 功能吗?

我查看了一些 linux-aio 示例(在 C/C++ 中)和简单的文件复制程序。所有这些示例都在读取 -> 缓冲区 -> 写入。

问候,菲利普

0 投票
0 回答
297 浏览

c - Linux aio_write 在 btrfs 中非常慢,几乎降低了 60% 的速度。有人知道原因吗?

这是我的代码:

当我在 ext4 文件系统中运行时,我得到了这个结果“总(900008200)时间(12.63s)”

在 btr 文件系统中,结果是“总(900008200)时间(27.42s)”

0 投票
1 回答
1032 浏览

java - Netty 4.0.0.CR9 中的 AIO

我目前正在将我的 Netty 服务器移植到版本 4 (4.0.0.CR9)。

虽然到目前为止一切正常,但我还想尝试新的 java7 nio2 实现的性能优势。但似乎 AioEventLoopGroup 等所需的类不在 netty-all 或使用 netty 包下载的其他包中。

是否已从 Netty 中删除了 NIO2 支持?

0 投票
2 回答
10343 浏览

mysql - 文件 ./ib_logfile101:“aio write”返回操作系统错误 122

我正在尝试在 Ubuntu 12.04 桌面上安装 MySQL 5.6.14:

我得到:

这可能是什么?怎么解决?

0 投票
1 回答
1179 浏览

linux - Linux 异步(io_submit)写入与正常(缓冲)写入

由于无论如何写入都是立即的(复制到内核缓冲区并返回),使用 io_submit 进行写入有什么好处?

事实上,它 (aio/io_submit) 看起来更糟,因为您必须在堆上分配写缓冲区并且不能使用基于堆栈的缓冲区。

我的问题只是关于写入,而不是读取。

编辑:我说的是相对较小的写入(最多几 KB),而不是 MB 或 GB,因此缓冲区复制应该不是大问题。

0 投票
1 回答
896 浏览

linux - Linux splice() + 内核 AIO 写入磁盘时

使用内核 AIO 和O_DIRECT|O_SYNC,不会复制到内核缓冲区中,并且当数据实际刷新到磁盘时可以获得细粒度的通知。但是,它需要将数据保存在用户空间缓冲区中io_prep_pwrite()

使用splice(),可以将数据从内核空间缓冲区(管道)直接移动到磁盘,而无需到处复制。但是,splice()在数据排队后立即返回,并且不等待实际写入磁盘。

目标是将数据从套接字移动到磁盘而不复制它,同时确认它已被清除。如何结合以前的两种方法?

通过与 结合splice()O_SYNC我希望splice()阻止并且必须使用多个线程来掩盖延迟。或者,可以使用异步io_prep_fsync()/ io_prep_fdsync(),但这会等待所有数据被刷新,而不是等待特定的写入。两者都不完美。

需要的是splice()与内核 AIO 的组合,允许零复制和异步写入确认,这样单个事件驱动的线程可以将数据从套接字移动到磁盘并在需要时获得确认,但这似乎不是支持的。有没有好的解决方法/替代方法?

0 投票
1 回答
591 浏览

c - 当我尝试编写简单文本时,aio_write() 不起作用

我正在尝试将一个简单的东西写入一个似乎 AIO 不起作用的文件。可能是什么问题?我知道有多余的标题是不必要的。

0 投票
3 回答
4023 浏览

c++ - Linux AIO:扩展性差

我正在编写一个使用 Linux 异步 I/O 系统调用的库,并且想知道为什么该io_submit函数在 ext4 文件系统上表现出较差的扩展性。如果可能,我该怎么做才能io_submit不阻塞大 IO 请求大小?我已经做了以下事情(如此所述):

  • 使用O_DIRECT.
  • 将 IO 缓冲区对齐到 512 字节边界。
  • 将缓冲区大小设置为页面大小的倍数。

为了观察内核花费了多长时间,我运行了一个测试,其中我使用andio_submit创建了一个 1 Gb 的测试文件,并反复删除系统缓存 ( ) 并读取越来越大的文件部分。在每次迭代中,我打印了等待读取请求完成所花费的时间和所花费的时间。我在运行 Arch Linux 的 x86-64 系统上运行了以下实验,内核版本为 3.11。该机器具有 SSD 和 Core i7 CPU。第一张图绘制了阅读的页数与等待完成所花费的时间。第二个图表显示等待读取请求完成所花费的时间。时间以秒为单位。dd/dev/urandomsync; echo 1 > /proc/sys/vm/drop_cachesio_submitio_submit

在此处输入图像描述

在此处输入图像描述

为了比较,我创建了一个类似的测试,它通过pread. 结果如下:

在此处输入图像描述

似乎异步 IO 按预期工作,请求大小约为 20,000 个页面。之后,io_submit块。这些观察导致以下问题:

  • 为什么不是io_submit常量的执行时间?
  • 是什么导致了这种不良的缩放行为?
  • 我是否需要将 ext4 文件系统上的所有读取请求拆分为多个请求,每个请求的大小小于 20,000 页?
  • 20000这个“神奇”值从何而来?如果我在另一个 Linux 系统上运行我的程序,我如何才能确定要使用的最大 IO 请求大小而不会遇到不良的扩展行为?

用于测试异步 IO 的代码如下。如果您认为它们相关,我可以添加其他来源列表,但我尝试仅发布我认为可能相关的详细信息。

0 投票
1 回答
970 浏览

c - Linux 内核异步 AIO:我是否需要复制 struct iovec 以供以后处理?

我在我的驱动程序中添加了对 AIO 的支持(内核态中的 .aio_read 、 .aio_write 调用,用户态中的 libaio )并查看了各种来源(假设在调用 aio_complete 之前,该内存将保持不变),或者我需要对 iovector 数据结构进行深度复制。

以 \drivers\usb\gadget\inode.c 的实现为例,他们似乎只是复制了 ep_aio_rwtail 函数中的指针,该函数具有:

但是当我尝试做类似的事情时,经常会发生 iovector 中的数据在我处理它时已经“损坏”。

例如,在我记录的 aio_read/write 调用中

但是当我在内核线程中做真正的工作时(在附加到用户空间 mm 之后),我记录了以下内容:

这是一个非常简单的测试用例,我只在我的用户应用程序中提交 1 个异步命令。

让事情变得更有趣:我在 3.13 内核上大约 80% 的时间都有损坏。

但我以前从未在 3.9 内核上见过它(但在升级到 3.13 之前我只使用了一小段时间,现在又恢复为理智的 cnheck 并尝试了十几次)。(使用 3.9 内核运行的示例有两次

这会敲响警钟吗?

(另一种可能性是我自己当然会破坏这些地址/长度,但奇怪的是我从来没有在 3.9 上遇到过这个)

编辑:在查看 linux aio 的 3.13 代码后回答我自己的问题(与正在运行的 3.9 相比发生了显着变化),在 fs\aio.c 中,您有:

static ssize_t aio_run_iocb(struct kiocb *req, unsigned opcode, char __user *buf, bool compat) { ... struct iovec inline_vec, *iovec = &inline_vec; ... ret = rw_op(req, iovec, nr_segs, req->ki_pos); ... }

所以这个iovec结构只是在栈上,一旦aio_read/write函数退出就会丢失。

并且小工具框架在 \drivers\usb\gadget\inode.c 中包含一个错误(至少对于 3.13)...