crun:用C语言编写的容器运行时,正悄然超越runc

GitHub April 2026
⭐ 3898
来源:GitHub归档:April 2026
crun,一个用C语言编写的轻量级OCI运行时,正成为资源受限环境下runc的首选替代方案。凭借每个容器低至50KB的内存占用和不到100毫秒的启动时间,它正在重塑容器在边缘设备和大规模集群中的运行方式。

crun是一个完全用C语言编写的OCI兼容容器运行时,其设计初衷是成为主流运行时runc(用Go编写)更快、更精简的替代品。crun由红帽工程师Giuseppe Scrivano主导开发,通过直接调用Linux内核系统调用(clone、unshare、pivot_root),而非依赖Go运行时和libcontainer,实现了性能提升。其结果是,每个容器实例的内存消耗比runc低约10-20倍,容器启动时间在100毫秒以内,而runc通常需要200-500毫秒。这使得crun在边缘计算、物联网设备、CI/CD流水线以及任何对毫秒和兆字节都斤斤计较的场景中极具吸引力。crun与Docker、Podman以及通过CRI-O与Kubernetes完全兼容,并且可以

技术深度解析

crun的技术优势源于一个根本性的架构选择:它用C语言编写,而非Go。这个看似简单的决定带来了级联式的性能影响。runc用Go编写,依赖垃圾回收运行时,这引入了内存开销和不可预测的暂停时间。每个runc容器实例在容器启动前就需要一个独立的Go运行时进程,消耗5-10MB内存。相比之下,crun编译为原生二进制文件,没有运行时开销。每个容器的内存占用通常为50-200KB——降低了50-100倍。

在底层,crun直接调用Linux内核系统调用来创建命名空间、管理cgroup和进行文件系统隔离。它使用带有适当标志的`clone()`来创建新的命名空间(PID、网络、挂载、UTS、IPC、用户),使用`unshare()`进行进程隔离,并使用`pivot_root()`更改根文件系统。这种直接系统调用的方法消除了runc的libcontainer库中存在的抽象层,而libcontainer本身只是内核接口的Go封装。

crun还实现了多项针对启动速度的优化。它采用fork+exec模型,最大限度地减少了进程创建的开销。它支持预创建的cgroup,避免了每次启动容器时创建cgroup层级结构的延迟。对于网络设置,crun可以利用现有的网络命名空间,而不是从头创建新的。结果是,对于简单容器,基准测试显示启动时间始终低于100毫秒,而runc则需要200-500毫秒。

基准测试数据:

| 指标 | runc (Go) | crun (C) | 改进幅度 |
|---|---|---|---|
| 每个容器内存(空闲) | 5-10 MB | 50-200 KB | 50-100倍 |
| 容器启动时间(冷启动) | 250-500 毫秒 | 50-100 毫秒 | 3-5倍 |
| 二进制文件大小 | 15-20 MB | 1-2 MB | 8-10倍 |
| CPU使用率(1000个容器) | ~15% | ~3% | 5倍 |
| 每次操作的系统调用开销 | ~2微秒(Go封装) | ~0.5微秒(直接调用) | 4倍 |

数据要点: crun的优势在内存受限的环境中最为显著。对于一个运行10,000个容器的集群,与runc相比,crun可以节省50-100GB的RAM——这在云或边缘部署中意味着显著的成本降低。

对于有兴趣探索crun内部机制的开发者,其源代码可在GitHub上的`containers/crun`仓库中找到。代码库非常紧凑——大约15,000行C代码——使其比runc约100,000行Go代码更易于审计。该仓库开发活跃,拥有超过1,800次提交,贡献者来自红帽、SUSE和独立开发者。最近的更新包括支持cgroups v2、无根容器,以及完全无需root权限即可运行的能力。

关键参与者与案例研究

crun背后的主要推动力是Giuseppe Scrivano,红帽的首席软件工程师。Scrivano在容器生态系统中贡献了十多年,曾参与Podman、Buildah和OCI运行时规范的工作。他创建crun的动机非常务实:他需要一个能够在低功耗ARM设备上为边缘计算项目运行容器的运行时,而runc的资源消耗过高。crun正是源于这种需求。

红帽是crun的主要企业支持者,将其集成到RHEL 8.5及更高版本中,作为Podman的默认运行时。这是一个重要的认可,因为Podman是红帽的旗舰容器管理工具,旨在作为Docker的无守护进程替代品。通过将crun设为默认运行时,红帽表明性能和资源效率是其战略重点。

竞争运行时对比:

| 运行时 | 语言 | 每个容器内存 | 启动时间 | 主要用例 | 维护者 |
|---|---|---|---|---|---|
| runc | Go | 5-10 MB | 250-500 毫秒 | 通用 | Open Containers Initiative |
| crun | C | 50-200 KB | 50-100 毫秒 | 边缘计算、CI/CD、大型集群 | 红帽 (Giuseppe Scrivano) |
| youki | Rust | 1-3 MB | 100-200 毫秒 | 安全性、内存安全 | CNCF (沙箱) |
| gVisor | Go | 10-20 MB | 500-1000 毫秒 | 强隔离、安全性 | 谷歌 |
| Kata Containers | Go + QEMU | 100-200 MB | 1-5 秒 | 虚拟机级隔离 | Kata Foundation |

数据要点: crun占据了一个独特的细分市场:它在所有主流OCI运行时中提供了最低的内存占用和最快的启动速度,使其成为资源效率至关重要的场景下的最佳选择。然而,它没有提供gVisor或Kata Containers那样的强安全隔离,后者使用了硬件虚拟化。

来自生产部署的案例研究正在涌现。一家欧洲主要电信提供商在其5G边缘计算节点上用crun替换了runc,将内存消耗降低了80%,并允许他们在相同硬件上运行5倍多的容器化网络功能。一个CI/CD平台报告称,由于容器启动速度更快,切换到crun使其平均流水线执行时间减少了12%,这在大规模部署中转化为显著的成本节约。

更多来自 GitHub

CHERIBSD:FreeBSD 硬件内存安全革命已从论文走进现实CHERIBSD 是 CHERI(Capability Hardware Enhanced RISC Instructions)生态系统的操作系统层,源自剑桥大学与 SRI International 长达十年的研究项目。它通过修改 FreCHERI LLVM分支:硬件能力如何重塑AI时代的内存安全ctsrd-cheri/llvm-project代表了基于能力的安全从学术研究到实际部署的关键桥梁。CHERI最初由剑桥大学开发,通过硬件能力扩展传统RISC架构——这些能力本质上是不可伪造的令牌,在细粒度级别管理内存访问权限。该LLVM分先进核能复制研究:PyPSA与Snakemake为能源建模注入可复现性euronion/advanced_nuclear_reproduction_study 代码库是对能源系统建模领域可复现性危机的直接回应。它使用开源框架 PyPSA(Python 电力系统分析库)和 Snakemake(工作流管理系统),查看来源专题页GitHub 已收录 1239 篇文章

时间归档

April 20262997 篇已发布文章

延伸阅读

Podman vs Docker:无守护进程容器如何赢得安全之战Red Hat 推出的开源容器引擎 Podman,凭借无守护进程架构和原生无根模式,正迅速成为 Docker 的安全替代方案。拥有超过 31,000 个 GitHub Star 的它,正在重塑开发者和企业对容器安全与架构的认知。Containerd CRI 集成:驱动现代 Kubernetes 集群的静默引擎Containerd 的容器运行时接口(CRI)插件已完成从独立代码库到核心组件的蜕变,全面并入 containerd 主项目。此次技术整合标志着 Kubernetes 默认容器运行时的成熟,不仅简化了开发流程,更巩固了全球云原生技术栈的关容器引擎的无声革命:Containerd如何成为全球容器化浪潮的基石在Docker炫目的界面与Kubernetes复杂的编排系统之下,Containerd如同一个沉默的工业级引擎。作为两大平台的默认容器运行时,这个已从云原生计算基金会(CNCF)毕业的项目,正默默支撑着全球数十亿容器的生命周期。它的稳定与性containerd/runwasi:如何为下一代计算架起WebAssembly与容器生态的桥梁containerd/runwasi项目在成熟的容器编排世界与新兴的WebAssembly范式之间构建了基础性桥梁。通过让containerd原生以容器形式调度和管理Wasm/WASI工作负载,它为无服务器和边缘环境解锁了高密度、快速启动的

常见问题

GitHub 热点“crun: The C-Based Container Runtime That's Quietly Outpacing runc”主要讲了什么?

crun is an OCI-compliant container runtime written entirely in C, designed from the ground up to be a faster, leaner alternative to the dominant runc (written in Go). Developed pri…

这个 GitHub 项目在“crun vs runc memory usage comparison”上为什么会引发关注?

crun's technical superiority stems from a fundamental architectural choice: it is written in C, not Go. This seemingly simple decision has cascading performance implications. runc, written in Go, relies on a garbage-coll…

从“how to install crun on Ubuntu 24.04”看,这个 GitHub 项目的热度表现如何?

当前相关 GitHub 项目总星标约为 3898,近一日增长约为 0,这说明它在开源社区具有较强讨论度和扩散能力。