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

无标题Telemt is a fresh open-source implementation of Telegram's MTProxy protocol, written entirely in Rust and leveraging theFATE:重塑金融与医疗数据隐私的开源联邦学习框架FATE(Federated AI Technology Enabler)已成为联邦学习领域的领先开源框架,在GitHub上拥有超过6000颗星和活跃的社区。该框架由微众银行(一家中国数字银行)开发,旨在解决数据效用与隐私之间的根本矛盾。FFATE 分支 zjzdy/fate:联邦学习机器中的幽灵?zjzdy/fate 仓库是 FederatedAI FATE 项目的直接分支,FATE 是一个面向金融、医疗等隐私敏感行业的开源联邦学习框架。理论上,它继承了 FATE 的强大能力:支持同态加密(HE)、安全多方计算(MPC),以及无需原查看来源专题页GitHub 已收录 2635 篇文章

时间归档

April 20263042 篇已发布文章

延伸阅读

无形之手:OCI运行时规范如何塑造云基础设施的未来开放容器倡议(OCI)运行时规范是整个容器生态系统的无声引擎。这篇深度分析揭示了这一标准如何在runc、Kata和gVisor等运行时之间强制执行一致性,直接影响Kubernetes的行为、安全边界以及云基础设施的未来走向。Docker/OCI:塑造容器基础设施未来的隐形桥梁Docker/OCI 仓库远不止是一个工具库——它是连接 Docker 生态与开放容器倡议(OCI)标准的架构枢纽。本篇深度分析揭示了这一参考实现如何塑造容器运行时开发、兼容性测试以及更广泛的基础设施格局。Apptainer:一场静默的革命,如何让容器成为高性能计算的脊梁容器运行时 Singularity 正式更名为 Apptainer 并移交 Linux 基金会管理。AINews 深入探究这款无需特权、无守护进程的容器如何成为高性能计算的中流砥柱,揭示其在 HPC 工作负载上超越 Docker 的技术优势Podman vs Docker:无守护进程容器如何赢得安全之战Red Hat 推出的开源容器引擎 Podman,凭借无守护进程架构和原生无根模式,正迅速成为 Docker 的安全替代方案。拥有超过 31,000 个 GitHub Star 的它,正在重塑开发者和企业对容器安全与架构的认知。

常见问题

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,这说明它在开源社区具有较强讨论度和扩散能力。