, ,

Podman 性能:有根和无根

我经常从转向 Podman 的用户那里听到的抱怨之一是关于性能问题。我一直觉得这很令人困惑,因为 Podman 团队在提高性能方面投入了大量时间和精力,我们非常自信我们的速度与 Docker 大致相当。事实上,一份学术论文发现 Podman 在 HPC 应用方面比 Docker 更快。经过一番调查,原因似乎是人们不仅从 Docker 迁移到 Podman,而且是从 root Docker 迁移到无根 Podman。由于我接下来将解释的原因,这有点像拿苹果和橘子作比较。

Podman 的无根功能是安全性方面的一项重大进步,我们对此非常自豪。能够避免与 root 用户进行任何交互,是容器安全模型的一个巨大改进。然而,无根容器存在一些固有的限制。在没有 root 权限的情况下,容器的某些关键元素——即网络和存储——必须在用户空间而不是内核空间中完成。对于存储,我们必须使用 FUSE 文件系统 (fuse-overlayfs);对于网络,则需要一个手动重新组装和转发数据包到容器的工具 (slirp4netns)。这两者共同可能导致容器中特定操作的性能大幅下降:任何访问网络或磁盘的操作都会受到影响。根据经验,我发现在运行 `podman build` 时,对于某些类型的构建(从网络大量拉取或解压缩大型存档),无根运行比有根运行性能下降 20%。因此,尽管 Podman 团队对 Podman 与 Docker 的性能非常有信心,但这仅限于比较 root Podman 和 root Docker,或无根 Podman 和无根 Docker。将无根 Podman 与 root Docker 进行比较是不公平的。这比较的是无根容器缺乏内核对网络和存储的支持,而不是比较工具本身。

在无根模式下运行所导致的性能下降,在一定程度上是安全性的必要权衡;然而,这并不意味着没有解决办法。在较新的内核(5.11 或更高版本)上,已取消对 fuse-overlayfs 的要求:内核现在允许 Podman 作为非 root 用户原生使用 overlayfs 文件系统,从而消除了 FUSE 文件系统的开销。您可以在之前的博客中了解有关这一重大进展的更多信息。对于网络,我们正在增加对 pasta 的支持,这是一种有望提高性能的替代网络工具。也可以通过使用 --net=host 选项完全禁用网络隔离以获得原生网络性能,但这会在一定程度上降低容器化的安全优势。总而言之,这些更改应能大大减少无根容器的性能开销。

目前,存在一种混合替代方案,即 `podman run –userns=auto`,它允许 root Podman 创建一个容器,同时拥有 root 容器的所有性能优势(内核原生的 overlayfs 和桥接网络)以及无根容器的运行时安全优势(容器无法访问主机上的 root 用户)。

展望未来,Podman 团队将在可预见的将来专注于性能,因为我们致力于改进 Podman 以适应边缘系统和汽车应用。对于无根容器领域尤其如此。我们已经在容器启动时间方面取得了一些重大改进,未来还会推出更多改进。通过这些改进,我们计划进一步缩小 root 和无根容器之间的差距。然而,即使有了这些改进,无根容器仍然是用户为了提高安全性而牺牲部分性能的一种刻意权衡。

发表评论

订阅

输入您的电子邮件地址以接收来自本网站的电子邮件更新。

返回

您的消息已发送

警告
警告
警告。

分类


搜索