下一站 - Ihcblog!

远方的风景与脚下的路 | 子站点:ihc.im

0%

This article also has an English version.

本文将介绍我写的一个 Rust 调用 Golang FFI 框架的设计与实现,从设计和实现者的角度设计多种方案并给出选择和原因,以及介绍一些实现细节。

项目已开源于 Github:https://github.com/ihciah/rust2go

相比 Golang,Rust 程序没有 GC,并且有更强的编译检查,基于 LLVM 获得了最强的编译优化,所以拥有更好的性能和安全性。

在字节跳动内部,为了推动成本优化,我参与了 Rust RPC 框架开发,并带头实现了服务发现、metrics、log、动态配置等多个业务必要的 Rust SDK,以及提供了编译与运行镜像、crates 内部源和公网镜像(rsproxy.cn)等。在这些基建之上,多个核心业务迁移至 Rust 并取得了较大的性能收益:CPU 占用降低 30% 以上,部分延迟敏感业务 P99 显著降低。但是,这些业务很多是不需要积极维护的,例如代理、缓存类,有较复杂且积极迭代的业务逻辑的服务则较难迁移 Rust。

理论上我们可以将所有 Golang 程序使用 Rust 重写以获得更好的性能,但是实际操作中仍存在较大困难:一是重写全部 Golang 依赖组件不一定现实,二是一口气完成全部重写较为困难。如果提供一种从 Rust 高效调用 Golang 的手段,能够让业务可以循序渐进地完成 Rust 重构,那么这两个问题都可以解决。

本文涉及内容较多,整体叙述脉络:首先讨论整体方案的选型并给出一个极简 PoC;之后从这个极简 PoC 入手,扩展并细化该方案以支持必要的特性;最后会从框架实现角度介绍一些值得讨论的实现细节。

阅读全文 »

This article also has an English version.

一个 HTTP Server 内部包括很多部分:协议实现(h1、h2、压缩等)、连接状态管理(keepalive)、请求分发、中间件、业务逻辑等。用户可以全部自行实现,但其实除了业务逻辑之外的部分都是较为通用的能力。我们将这些通用能力与用户的业务逻辑解耦,即 HTTP 框架。

由于 Rust 生态中 hyper 已经提供了较为完备的 HTTP 协议实现,基于 hyper 实现 HTTP 框架就只需要提供包括路由、共享状态、中间件等能力。

本文从 HTTP 框架的设计角度,以新版本 Axum 作为例子,分析 Rust 下 HTTP 框架如何提供合理抽象与类型约束。基于 Rust 强大的类型系统,我们可以写出高效且正确的代码。

阅读全文 »

This article also has an English version.

本系列文章主要记录我在尝试用 Rust 实现一个 Hypervisor 的过程。目录:

  1. 用 Rust 实现极简 VMM - 基础
  2. 用 Rust 实现极简 VMM - 模式切换
  3. 用 Rust 实现极简 VMM - 运行真实的 Linux Kernel
  4. 用 Rust 实现极简 VMM - 实现 Virtio 设备

本文是系列的第三篇,会做一些准备工作,并实际跑起来一个真正的 Linux。

阅读全文 »

This article also has an English version.

本系列文章主要记录我在尝试用 Rust 实现一个 Hypervisor 的过程。

为什么写这个系列?几个月前在我业余探索 KVM 的过程中我遇到了一些困难,而互联网上很多文章都没能很好地解释清楚,并且也没有一篇文章能够从零到一地构建一个 VMM 并讲清楚每个 Magic Number 的含义和原因。希望我的分享可以一定程度上让初学者少走一些弯路。当然,我也免不了会有一些错误理解,欢迎各位指正。

目录:

  1. 用 Rust 实现极简 VMM - 基础
  2. 用 Rust 实现极简 VMM - 模式切换
  3. 用 Rust 实现极简 VMM - 运行真实的 Linux Kernel
  4. 用 Rust 实现极简 VMM - 实现 Virtio 设备

本文是系列的第一篇,主要做一些科普,并能跑起来一段实际的代码。

阅读全文 »

This article also has an English version.

本系列文章主要介绍如何设计和实现一个基于 io-uring 的 Thread-per-core 模型的 Runtime。

我们的 Runtime 最终产品 Monoio 现已开源,你可以在 github.com/bytedance/monoio 找到它。

  1. Rust Runtime 设计与实现-科普篇
  2. Rust Runtime 设计与实现-设计篇-Part1
  3. Rust Runtime 设计与实现-设计篇-Part2
  4. Rust Runtime 设计与实现-组件篇
  5. Rust Runtime 设计与实现-IO兼容篇

本文是系列的第五篇。本来写四篇已经结束的,最近增加了 epoll 支持(!73),干脆写一下这块的设计吧。

阅读全文 »

This article also has an English version.

本系列文章主要介绍如何设计和实现一个基于 io-uring 的 Thread-per-core 模型的 Runtime。

我们的 Runtime 最终产品 Monoio 现已开源,你可以在 github.com/bytedance/monoio 找到它。

  1. Rust Runtime 设计与实现-科普篇
  2. Rust Runtime 设计与实现-设计篇-Part1
  3. Rust Runtime 设计与实现-设计篇-Part2
  4. Rust Runtime 设计与实现-组件篇
  5. Rust Runtime 设计与实现-IO兼容篇

本文是系列的第四篇,前面该讲的设计基本讲完了,这里主要说说 channel 等组件。

阅读全文 »

This article also has an English version.

本系列文章主要介绍如何设计和实现一个基于 io-uring 的 Thread-per-core 模型的 Runtime。

我们的 Runtime 最终产品 Monoio 现已开源,你可以在 github.com/bytedance/monoio 找到它。

  1. Rust Runtime 设计与实现-科普篇
  2. Rust Runtime 设计与实现-设计篇-Part1
  3. Rust Runtime 设计与实现-设计篇-Part2
  4. Rust Runtime 设计与实现-组件篇
  5. Rust Runtime 设计与实现-IO兼容篇

本文是系列的第三篇,继续讲一些 Runtime 上的设计取舍。

阅读全文 »

This article also has an English version.

本系列文章主要介绍如何设计和实现一个基于 io-uring 的 Thread-per-core 模型的 Runtime。

我们的 Runtime 最终产品 Monoio 现已开源,你可以在 github.com/bytedance/monoio 找到它。

  1. Rust Runtime 设计与实现-科普篇
  2. Rust Runtime 设计与实现-设计篇-Part1
  3. Rust Runtime 设计与实现-设计篇-Part2
  4. Rust Runtime 设计与实现-组件篇
  5. Rust Runtime 设计与实现-IO兼容篇

本文是系列的第二篇,开始以 Monoio 为例讲一些 Runtime 上的设计取舍,同时会参考和对比 Tokio 和 Glommio 的设计。

阅读全文 »