24 个版本
新 0.2.4 | 2024 年 8 月 20 日 |
---|---|
0.2.4-beta.0 | 2024 年 6 月 27 日 |
0.2.3 | 2024 年 3 月 20 日 |
0.2.1 | 2023 年 12 月 27 日 |
0.0.1 |
|
#26 in 异步
4,474 每月下载量
用于 29 个 crates (28 直接)
775KB
17K SLoC
Monoio
带有 io_uring/epoll/kqueue 的线程每核心 Rust 运行时。
设计目标
Monoio 是一个纯 io_uring/epoll/kqueue Rust 异步运行时。其设计部分借鉴了 Tokio 和 Tokio-uring。然而,与 Tokio-uring 不同,Monoio 不在另一个运行时之上运行,这使得它更加高效。
此外,Monoio的设计考虑到了线程每核心模型。用户无需担心任务被Send
或Sync
处理,因为线程局部存储可以安全使用。换句话说,数据在await点不会逃离线程,这与Tokio等窃取工作运行时不同。这是因为对于某些用例,特别是针对本运行时的用例,没有必要在线程之间调度任务。例如,如果我们编写类似于NGINX的负载均衡器,我们会以线程每核心的方式编写它。线程局部数据不需要在线程之间共享,因此Sync
和Send
根本不需要实现。
正如你可能猜到的,这个运行时主要针对服务器,在网络套接字上的操作是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
中找到更多示例代码。
限制
- 在Linux 5.6或更高版本上,Monoio可以使用uring或epoll作为I/O驱动程序。在Linux的较低版本上,它只能以epoll模式运行。在macOS上,可以使用kqueue。其他平台目前不支持。
- Monoio不能解决所有问题。如果工作负载非常不平衡,它可能比Tokio引起性能下降,因为CPU核心可能没有得到充分利用。
贡献者
感谢他们的贡献!
社区
Monoio是CloudWeGo的子项目。我们致力于构建一个云原生生态系统。
相关项目
- local-sync:线程局部通道。
- monoio-tls:Monoio的TLS包装器。
- monoio-codec:Monoio的编解码器实用工具。
HTTP框架和RPC框架正在路上。
许可证
Monoio采用MIT许可证或Apache许可证。
在开发过程中,我们参考了Tokio、Mio、Tokio-uring和其他相关项目。我们想感谢这些项目的作者。
依赖项
~0.8–15MB
~134K SLoC