24 个版本

0.2.4 2024 年 8 月 20 日
0.2.4-beta.02024 年 6 月 27 日
0.2.3 2024 年 3 月 20 日
0.2.1 2023 年 12 月 27 日
0.0.1 2021 年 11 月 16 日

#26 in 异步

Download history 395/week @ 2024-05-04 1243/week @ 2024-05-11 376/week @ 2024-05-18 1041/week @ 2024-05-25 447/week @ 2024-06-01 394/week @ 2024-06-08 475/week @ 2024-06-15 311/week @ 2024-06-22 973/week @ 2024-06-29 1160/week @ 2024-07-06 1050/week @ 2024-07-13 548/week @ 2024-07-20 852/week @ 2024-07-27 1101/week @ 2024-08-03 1028/week @ 2024-08-10 1364/week @ 2024-08-17

4,474 每月下载量
用于 29 个 crates (28 直接)

MIT/Apache

775KB
17K SLoC

Monoio

带有 io_uring/epoll/kqueue 的线程每核心 Rust 运行时。

Crates.io MIT/Apache-2 许可证 构建状态 Codecov FOSSA 状态 中文说明

设计目标

Monoio 是一个纯 io_uring/epoll/kqueue Rust 异步运行时。其设计部分借鉴了 Tokio 和 Tokio-uring。然而,与 Tokio-uring 不同,Monoio 不在另一个运行时之上运行,这使得它更加高效。

此外,Monoio的设计考虑到了线程每核心模型。用户无需担心任务被SendSync处理,因为线程局部存储可以安全使用。换句话说,数据在await点不会逃离线程,这与Tokio等窃取工作运行时不同。这是因为对于某些用例,特别是针对本运行时的用例,没有必要在线程之间调度任务。例如,如果我们编写类似于NGINX的负载均衡器,我们会以线程每核心的方式编写它。线程局部数据不需要在线程之间共享,因此SyncSend根本不需要实现。

正如你可能猜到的,这个运行时主要针对服务器,在网络套接字上的操作是I/O密集型的,因此使用本机异步I/O API最大化了服务器的吞吐量。为了使Monoio尽可能高效,我们启用了一些不稳定的Rust功能,并设计了一个全新的I/O抽象,这不幸地可能引起一些兼容性问题。我们的基准测试证明,对于我们的用例,Monoio比其他Rust运行时性能更好。

快速开始

要使用monoio,您需要rust 1.75。如果您已经安装了它,请确保它是最新版本。

此外,如果您想使用io_uring,您必须确保您的内核支持它(5.6+)。并且,memlock已配置为适当的数字。如果您的内核版本不符合要求,您可以使用旧驱动程序启动,目前支持Linux和macOS(参考此处)。

🚧实验性的Windows支持正在路上。

以下是如何使用Monoio的基本示例。

/// A echo example.
///
/// Run the example and `nc 127.0.0.1 50002` in another shell.
/// All your input will be echoed out.
use monoio::io::{AsyncReadRent, AsyncWriteRentExt};
use monoio::net::{TcpListener, TcpStream};

#[monoio::main]
async fn main() {
    let listener = TcpListener::bind("127.0.0.1:50002").unwrap();
    println!("listening");
    loop {
        let incoming = listener.accept().await;
        match incoming {
            Ok((stream, addr)) => {
                println!("accepted a connection from {}", addr);
                monoio::spawn(echo(stream));
            }
            Err(e) => {
                println!("accepted connection failed: {}", e);
                return;
            }
        }
    }
}

async fn echo(mut stream: TcpStream) -> std::io::Result<()> {
    let mut buf: Vec<u8> = Vec::with_capacity(8 * 1024);
    let mut res;
    loop {
        // read
        (res, buf) = stream.read(buf).await;
        if res? == 0 {
            return Ok(());
        }

        // write all
        (res, buf) = stream.write_all(buf).await;
        res?;

        // clear
        buf.clear();
    }
}

您可以在本存储库的examples中找到更多示例代码。

限制

  1. 在Linux 5.6或更高版本上,Monoio可以使用uring或epoll作为I/O驱动程序。在Linux的较低版本上,它只能以epoll模式运行。在macOS上,可以使用kqueue。其他平台目前不支持。
  2. Monoio不能解决所有问题。如果工作负载非常不平衡,它可能比Tokio引起性能下降,因为CPU核心可能没有得到充分利用。

贡献者

感谢他们的贡献!

社区

Monoio是CloudWeGo的子项目。我们致力于构建一个云原生生态系统。

相关项目

HTTP框架和RPC框架正在路上。

许可证

Monoio采用MIT许可证或Apache许可证。

在开发过程中,我们参考了Tokio、Mio、Tokio-uring和其他相关项目。我们想感谢这些项目的作者。

FOSSA Status

依赖项

~0.8–15MB
~134K SLoC