我正在开发一个项目,需要在单个 Linux 服务器上以非常高的速度将数据流式传输到磁盘。使用以下命令的fio基准测试表明我应该能够使用 io_uring 获得所需的写入速度(> 40 GB/s)。
\nfio --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 代码之前,我有几个关于我的方法的问题要问。
\nwritev()
,而是排队请求以使用普通write()
函数写入磁盘。(尝试收集/分散 IO 请求,但这似乎对我的写入速度没有重大影响。)NUM_JOBS
。但是,它没有告诉我内核为 sq 轮询创建的线程。我正在尝试理解 C++ 中的异步模型。我正在研究 4 个旨在处理异步 I/O 的库:
这些库有大量的重叠。
异步 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_context
Boost.Asioio_context
和 CppCoroio_service
可以一起使用吗?如果我的代码包含所有这四个库,那么每个库都会有 1 个执行上下文吗?
本节包含 CppCoro 如何异步打开文件的示例。我相信这个模板类将在 Boost.Asio 中用于异步文件访问。libunifex 有一个 io_uring_text.cpp文档,其中包括对文件的异步写入。显然 liburing 是为了异步写入文件而存在的。
我应该只使用 io_uring 特定库进行文件访问吗? …
最近我在不同的论坛上看到了这个。据我阅读一些论坛讨论可以看出,它与输入和输出有关。io_uring 究竟是什么?
显然,Linux 已经有了 Asyn-IO (AIO) API。我相信它不是完全异步的。那么 AIO 出了什么问题呢?io_uring 如何克服它?
PS:我尝试阅读https://kernel.dk/io_uring.pdf但无法完全理解,因为我与该语言脱节C
。
我正在使用 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)