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

白日梦AI提供专注于AI视频生成的多样化功能,包括文生视频、动态画面和形象生成等,帮助用户快速上手,创造专业级内容。

Project Cover

有言AI

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

Project Cover

Kimi

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

Project Cover

讯飞绘镜

讯飞绘镜是一个支持从创意到完整视频创作的智能平台,用户可以快速生成视频素材并创作独特的音乐视频和故事。平台提供多样化的主题和精选作品,帮助用户探索创意灵感。

Project Cover

讯飞文书

讯飞文书依托讯飞星火大模型,为文书写作者提供从素材筹备到稿件撰写及审稿的全程支持。通过录音智记和以稿写稿等功能,满足事务性工作的高频需求,帮助撰稿人节省精力,提高效率,优化工作与生活。

Project Cover

阿里绘蛙

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

Project Cover

AIWritePaper论文写作

AIWritePaper论文写作是一站式AI论文写作辅助工具,简化了选题、文献检索至论文撰写的整个过程。通过简单设定,平台可快速生成高质量论文大纲和全文,配合图表、参考文献等一应俱全,同时提供开题报告和答辩PPT等增值服务,保障数据安全,有效提升写作效率和论文质量。

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