Project Icon

monoio

高性能线程每核异步运行时 支持多种IO模型

Monoio是高性能Rust异步运行时,采用线程每核模型,支持多种IO模型。针对网络IO密集型服务器优化,允许安全使用线程本地存储,无需实现Send和Sync。效率优于其他运行时,适合负载均衡器等服务器开发。

Monoio

一个基于线程每核心模型的 Rust 运行时,支持 io_uring/epoll/kqueue。

Crates.io MIT/Apache-2 licensed Build Status Codecov FOSSA 状态 中文说明

设计目标

Monoio 是一个纯粹的 io_uring/epoll/kqueue Rust 异步运行时。部分设计借鉴了 Tokio 和 Tokio-uring。然而,与 Tokio-uring 不同,Monoio 不依赖于其他运行时,因此更加高效。

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

正如您可能猜到的,这个运行时主要针对服务器,其操作主要受网络套接字的 I/O 限制,因此使用原生异步 I/O API 可以最大化服务器的吞吐量。为了使 Monoio 尽可能高效,我们启用了一些不稳定的 Rust 特性,并设计了全新的 IO 抽象,这可能会导致一些兼容性问题。我们的基准测试证明,对于我们的用例,Monoio 比其他 Rust 运行时具有更好的性能。

快速开始

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

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

🚧Windows 支持正在实验中。

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

/// 一个回显示例。
///
/// 运行示例并在另一个终端中执行 `nc 127.0.0.1 50002`。
/// 您的所有输入都将被回显。
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!("正在监听");
    loop {
        let incoming = listener.accept().await;
        match incoming {
            Ok((stream, addr)) => {
                println!("接受来自 {} 的连接", addr);
                monoio::spawn(echo(stream));
            }
            Err(e) => {
                println!("接受连接失败: {}", 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 {
        // 读取
        (res, buf) = stream.read(buf).await;
        if res? == 0 {
            return Ok(());
        }

        // 全部写入
        (res, buf) = stream.write_all(buf).await;
        res?;

        // 清空
        buf.clear();
    }
}

您可以在本仓库的 examples 目录中找到更多示例代码。

局限性

  1. 在 Linux 5.6 或更新版本上,Monoio 可以使用 uring 或 epoll 作为 io 驱动。在较低版本的 Linux 上,它只能在 epoll 模式下运行。在 macOS 上,可以使用 kqueue。目前不支持其他平台。
  2. Monoio 无法解决所有问题。如果工作负载非常不平衡,可能会导致性能下降,比 Tokio 更糟,因为 CPU 核心可能无法充分利用。

贡献者

感谢他们的贡献!

社区

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

相关项目

HTTP 框架和 RPC 框架正在开发中。

许可证

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

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

FOSSA 状态

项目侧边栏1项目侧边栏2
推荐项目
Project Cover

豆包MarsCode

豆包 MarsCode 是一款革命性的编程助手,通过AI技术提供代码补全、单测生成、代码解释和智能问答等功能,支持100+编程语言,与主流编辑器无缝集成,显著提升开发效率和代码质量。

Project Cover

AI写歌

Suno AI是一个革命性的AI音乐创作平台,能在短短30秒内帮助用户创作出一首完整的歌曲。无论是寻找创作灵感还是需要快速制作音乐,Suno AI都是音乐爱好者和专业人士的理想选择。

Project Cover

有言AI

有言平台提供一站式AIGC视频创作解决方案,通过智能技术简化视频制作流程。无论是企业宣传还是个人分享,有言都能帮助用户快速、轻松地制作出专业级别的视频内容。

Project Cover

Kimi

Kimi AI助手提供多语言对话支持,能够阅读和理解用户上传的文件内容,解析网页信息,并结合搜索结果为用户提供详尽的答案。无论是日常咨询还是专业问题,Kimi都能以友好、专业的方式提供帮助。

Project Cover

阿里绘蛙

绘蛙是阿里巴巴集团推出的革命性AI电商营销平台。利用尖端人工智能技术,为商家提供一键生成商品图和营销文案的服务,显著提升内容创作效率和营销效果。适用于淘宝、天猫等电商平台,让商品第一时间被种草。

Project Cover

吐司

探索Tensor.Art平台的独特AI模型,免费访问各种图像生成与AI训练工具,从Stable Diffusion等基础模型开始,轻松实现创新图像生成。体验前沿的AI技术,推动个人和企业的创新发展。

Project Cover

SubCat字幕猫

SubCat字幕猫APP是一款创新的视频播放器,它将改变您观看视频的方式!SubCat结合了先进的人工智能技术,为您提供即时视频字幕翻译,无论是本地视频还是网络流媒体,让您轻松享受各种语言的内容。

Project Cover

美间AI

美间AI创意设计平台,利用前沿AI技术,为设计师和营销人员提供一站式设计解决方案。从智能海报到3D效果图,再到文案生成,美间让创意设计更简单、更高效。

Project Cover

稿定AI

稿定设计 是一个多功能的在线设计和创意平台,提供广泛的设计工具和资源,以满足不同用户的需求。从专业的图形设计师到普通用户,无论是进行图片处理、智能抠图、H5页面制作还是视频剪辑,稿定设计都能提供简单、高效的解决方案。该平台以其用户友好的界面和强大的功能集合,帮助用户轻松实现创意设计。

投诉举报邮箱: service@vectorlightyear.com
@2024 懂AI·鲁ICP备2024100362号-6·鲁公网安备37021002001498号