标签: io-uring

为什么 liburing 写入性能低于预期?

问题总结

\n

我正在开发一个项目,需要在单个 Linux 服务器上以非常高的速度将数据流式传输到磁盘。使用以下命令的fio基准测试表明我应该能够使用 io_uring 获得所需的写入速度(> 40 GB/s)。

\n
fio --name=seqwrite --rw=write --direct=1 --ioengine=io_uring --bs=128k --numjobs=4 --size=100G --runtime=300 --directory=/mnt/md0/ --iodepth=128 --buffered=0 --numa_cpu_nodes=0 --sqthread_poll=1\xc2\xa0 --hipri=1\n
Run Code Online (Sandbox Code Playgroud)\n

但是,我无法使用自己的代码复制这种性能,因为我的代码使用了io_uring 的liburing帮助程序库。我目前的写入速度约为 9 GB/s。我怀疑 liburing 的额外开销可能是瓶颈,但在放弃更漂亮的 liburing 代码之前,我有几个关于我的方法的问题要问。

\n

我的方法

\n
    \n
  • 使用liburing
  • \n
  • 利用提交队列轮询功能
  • \n
  • 不使用 排队聚集/分散 io 请求writev(),而是排队请求以使用普通write()函数写入磁盘。(尝试收集/分散 IO 请求,但这似乎对我的写入速度没有重大影响。)
  • \n
  • 多线程,每个线程一个环
  • \n
\n

附加信息

\n
    \n
  • 运行此代码的简化版本(不使用线程)会产生类似的结果。
  • \n
  • 我的调试器显示我正在创建宏中指定的线程数NUM_JOBS。但是,它没有告诉我内核为 sq 轮询创建的线程。
  • \n
  • 当运行两个以上线程时我的性能会下降
  • \n
  • Linux服务器有96个CPU可供使用
  • \n
  • 数据正在写入 RAID0 …

c++ linux io-uring

15
推荐指数
1
解决办法
2023
查看次数

比较 Boost.Asio、libunifex、liburing 和 CppCoro

我正在尝试理解 C++ 中的异步模型。我正在研究 4 个旨在处理异步 I/O 的库:

  1. liburing(C版本C++版本):提供io_uring的接口。C++ 版本使用协程。
  2. libunifex:实现 C++ 发送者/接收者异步编程模型
  3. Boost.Asio:用于异步网络和低级 I/O 编程的库
  4. CppCoro:提供了大量通用原语来使用协程

这些库有大量的重叠。

执行上下文和io_uring

异步 I/O 的未来可能会在 Linux 机器上使用 io_uring。liburing 的存在是为了提供 io_uring 和io_service 的接口。然而,libunifex 还提供了io_uring_context。它们都明确使用io_uring,但用法与 Boost.Asio 的io_context和 CppCoro 的io_service类似。

liburing io_service、libunifex、io_uring_contextBoost.Asioio_context和 CppCoroio_service可以一起使用吗?如果我的代码包含所有这四个库,那么每个库都会有 1 个执行上下文吗?

功能:打开文件

本节包含 CppCoro 如何异步打开文件的示例。我相信这个模板类将在 Boost.Asio 中用于异步文件访问。libunifex 有一个 io_uring_text.cpp文档,其中包括对文件的异步写入。显然 liburing 是为了异步写入文件而存在的。

我应该只使用 io_uring 特定库进行文件访问吗? …

c++ asynchronous boost-asio executioncontext io-uring

13
推荐指数
1
解决办法
2662
查看次数

io_uring 究竟是什么?

最近我在不同的论坛上看到了这个。据我阅读一些论坛讨论可以看出,它与输入和输出有关。io_uring 究竟是什么?

io io-uring

5
推荐指数
1
解决办法
2021
查看次数

io-uring 实现与 AIO 有何不同?

显然,Linux 已经有了 Asyn-IO (AIO) API。我相信它不是完全异步的。那么 AIO 出了什么问题呢?io_uring 如何克服它?

PS:我尝试阅读https://kernel.dk/io_uring.pdf但无法完全理解,因为我与该语言脱节C

linux aio io-uring

1
推荐指数
1
解决办法
1444
查看次数

io_uring user_data 字段始终为零

我正在使用 io_uring,https://kernel.dk/io_uring.pdf,看看它是否可以用于异步文件 I/O 进行日志记录。这是一个简单的程序,用于打开文件、统计文件,然后从文件中读取前 4k。当文件存在并且可读时,该程序将成功运行完成。但完成队列条目中的 user_data 字段始终为零。io_uring 的文档说:

user_data 在操作码中是通用的,并且不受内核影响。当为此请求发布完成事件时,它会被简单地复制到完成事件 cqe。

由于完成未排序,因此需要 user_data 字段来将完成与提交进行匹配。如果该字段始终为零那么如何使用它?

#include <iostream>
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#include <sys/stat.h>
#include <liburing.h>
#include <stdlib.h>

int main() {
  struct io_uring ring;
  // see man io_uring_setup for what this does
  auto ret = io_uring_queue_init(64, &ring, 0);

  if (ret) {
    perror("Failed initialize uring.");
    exit(1);
  }

  std::cout << "I/O uring initialized successfully. " << std::endl;

  auto directory_fd = open("/tmp", O_RDONLY);
  if (directory_fd < 0) {
    perror("Failed to open …
Run Code Online (Sandbox Code Playgroud)

c linux io-uring

1
推荐指数
1
解决办法
570
查看次数

标签 统计

io-uring ×5

linux ×3

c++ ×2

aio ×1

asynchronous ×1

boost-asio ×1

c ×1

executioncontext ×1

io ×1