下一站 - Ihcblog!

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

0%

This article also has an English version.

本篇将介绍我在 Rust 中构建可靠的上下文传递组件的一些思考、设计与实现。我实现的 certain-map 已经开源(一年多以前开源的,近期做了更多改进,本文后续会介绍),欢迎使用!

项目地址:https://github.com/ihciah/certain-map

它解决了什么问题:

  1. 在跨组件传递上下文时,它可以借助编译器保证字段的存在性(即当某组件对 Context 中某字段存在读依赖时,前置组件必须写入过该字段,否则无法通过编译)
  2. 通用组件实现依赖的上下文可被定义为泛型参数并加以约束,这使组件实现更为通用,不耦合 Context 具体类型

注:虽然项目名字看起来是一种 map 实现,但其实这是一个基于过程宏生成的 struct。之所以命名为 certain-map 是因为其设计初衷是为了替换 TypeMap,并保证字段的存在性。

阅读全文 »

This article also has an English version.

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

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

本文是系列的第四篇,会从零实现 Virtio Queue,并使用 TAP 作为 backend 实现 virtio-net 设备;为了把这些组件更好地组装起来,还会做一些组件,类似 Bus、EventLoop。

下一篇可能会支持 PCI 设备和 VF 设备直通(如果我有时间的话)。

之前的三篇文章都完成于 2022 年下半年,本章节以及对应的实验代码一直以草稿的形式闲置,直到最近(现在是 2024 年)我想要将这个坑填上,于是抽了几个周末较为细致地补充了一些代码,并完成本文。

阅读全文 »

This article also has an English version.

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

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

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

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

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

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

我在 2024 年的 RustChinaConf 上分享了这个议题,如果你感兴趣,欢迎浏览视频回放或 PPT(视频链接PPT 链接)。

阅读全文 »

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 等组件。

阅读全文 »