我经常听到用户在迁移到 Podman 时抱怨性能问题。我一直对此感到困惑,因为 Podman 团队一直在努力改进我们的性能,我们很有信心我们的速度与 Docker 相当。事实上,一篇学术论文 发现 Podman 在 HPC 应用方面比 Docker 更快。经过一番调查,原因似乎是人们不仅仅是从 Docker 迁移到 Podman,而是从 root Docker 迁移到 rootless Podman。这在某种程度上是苹果和橘子的比较,原因我在下面解释。
Podman 的 rootless 功能是 一项重大进步,它提高了安全性,我们对此感到非常自豪。避免与 root 用户进行任何交互的能力极大地改善了容器的安全模型。然而,rootless 容器存在一些固有的局限性。没有 root 权限,容器的某些关键元素(即网络和存储)必须在用户空间而不是内核空间完成。对于存储,我们必须使用 FUSE 文件系统 (fuse-overlayfs);对于网络,我们必须使用手动重新组装并将数据包转发到容器的工具 (slirp4netns)。这些工具一起会导致容器中特定操作的性能大幅下降:任何访问网络或磁盘的操作都会受到影响。据我观察,在没有 root 权限的情况下运行 `podman build` 时,某些类型的构建(从网络中进行大型拉取或解压缩大型存档)的性能下降了 20%,而使用 root 权限则没有下降。因此,尽管 Podman 团队对 Podman 与 Docker 的性能非常有信心,但这仅是在比较 root Podman 和 root Docker 或 rootless Podman 和 rootless Docker 时。将 rootless Podman 与 root Docker 进行比较是不公平的。这比较的是 rootless 容器缺乏对网络和存储的内核支持,而不是比较工具本身。
在某种程度上,在 rootless 环境下运行中发现的这种性能下降是安全性的必要权衡;然而,这并不意味着没有解决方法。在更新的内核(5.11 或更高版本)中,对 fuse-overlayfs 的要求已被移除:内核现在允许 Podman 作为非 root 用户本机使用 overlayfs 文件系统,从而消除了 FUSE 文件系统的性能损失。您可以在 之前的博客 中阅读更多关于这项重大进步的信息。对于网络,我们正在添加对 pasta 的支持,这是一种替代的网络工具,承诺提供更好的性能。也可以通过使用 `--net=host` 选项完全禁用网络隔离,从而获得本机网络性能,但这在一定程度上降低了容器化的安全优势。这些更改将极大地减少 rootless 容器的性能损失。
目前,`podman run –userns=auto` 形式的混合替代方案确实存在,它允许 root Podman 创建一个容器,该容器具有 root 的所有性能优势(内核本机 overlayfs 和桥接网络)和 rootless 的运行时安全优势(容器无法访问主机的 root 用户)。
展望未来,Podman 团队将在可预见的未来专注于性能,因为我们希望改进 Podman 以用于边缘系统和汽车应用。这对 rootless 容器空间尤其重要。我们已经在容器启动时间方面取得了一些重大改进,并且还有更多改进正在进行中。通过这些改进,我们计划进一步缩小 root 和 rootless 之间的差距。然而,即使有了这些改进,rootless 仍然是用户为了更高的安全性而做出的有意的权衡,它会导致性能略有下降。
发表评论