#io-uring #userspace #linux #low-level #syscalls #async #rustix

no-std rustix-uring

Rust 的低级 io_uring 用户空间接口

3 个不稳定版本

0.2.0 2023 年 12 月 12 日
0.1.1 2023 年 3 月 4 日
0.1.0 2023 年 3 月 3 日

#298 in 异步

Download history 42/week @ 2024-04-22 77/week @ 2024-04-29 23/week @ 2024-05-06 49/week @ 2024-05-13 49/week @ 2024-05-20 64/week @ 2024-05-27 48/week @ 2024-06-03 71/week @ 2024-06-10 308/week @ 2024-06-17 49/week @ 2024-06-24 12/week @ 2024-07-01 40/week @ 2024-07-08 40/week @ 2024-07-15 53/week @ 2024-07-22 40/week @ 2024-07-29 107/week @ 2024-08-05

每月 242 次下载
用于 nuclei

MIT/Apache

160KB
3K SLoC

Linux 的 io_uring API,使用 rustix

github actions crates license license docs.rs

这是 Rust 的 Linux io_uring 用户空间接口,它比用户空间边界 API 更高级,但比异步运行时更低级。

此库基于 io_uring crate 开发,并通过使用 rustix 来执行系统调用进行了修改。

用法

要使用 io-uring crate,首先将其添加到您的 Cargo.toml

[dependencies]
rustix-uring = "0.1"

接下来,我们可以开始使用 io-uring crate。以下是一个使用 Read 读取文件的快速介绍。

use rustix_uring::{opcode, types, IoUring};
use std::os::unix::io::AsRawFd;
use std::{fs, io};

fn main() -> io::Result<()> {
    let mut ring = IoUring::new(8)?;

    let fd = fs::File::open("README.md")?;
    let mut buf = vec![0; 1024];

    let read_e = opcode::Read::new(types::Fd(fd.as_raw_fd()), buf.as_mut_ptr(), buf.len() as _)
        .build()
        .user_data(0x42);

    // Note that the developer needs to ensure
    // that the entry pushed into submission queue is valid (e.g. fd, buffer).
    unsafe {
        ring.submission()
            .push(&read_e)
            .expect("submission queue is full");
    }

    ring.submit_and_wait(1)?;

    let cqe = ring.completion().next().expect("completion queue is empty");

    assert_eq!(cqe.user_data(), 0x42);
    assert!(cqe.result() >= 0, "read error: {}", cqe.result());

    Ok(())
}

请注意,opcode Read 只在内核 5.6 之后可用。如果您使用低于 5.6 的内核,此示例将失败。

测试和基准测试

您可以使用以下命令运行库的测试和基准测试。

$ cargo run --package io-uring-test
$ cargo bench --package io-uring-bench

许可证

此项目许可采用以下之一

任选其一。

贡献

除非您明确说明,否则您有意提交给 io-uring 的任何贡献,根据 Apache-2.0 许可证的定义,应按上述方式双重许可,不附加任何额外条款或条件。

依赖项

~1.5–9.5MB
~100K SLoC