Podman 性能指南

Unknown SummaryPodman 的性能可能受到多种因素的影响,例如:指定的 Podman 命令行选项和配置;OCI 运行时环境;主机文件系统;容器镜像;更改这些因素中的任何一项,都可能对您系统上 Podman 的性能产生明显影响,也可能不会产生任何影响。

Podman 的性能可能受到多种因素的影响,例如:

  • 指定的 Podman 命令行选项和配置

  • OCI 运行时环境

  • 主机文件系统

  • 容器镜像

更改这些因素中的任何一项,都可能对您系统上 Podman 的性能产生明显影响,也可能不会产生任何影响。

使用单独的用户账户进行基准测试

某些性能优化技巧(例如更换存储驱动程序)需要用户执行  podman system reset 命令,这将清除用户的所有容器及容器镜像。与其在个人主目录中测试不同方案,不如创建一个临时用户,操作完成后即可删除该用户。

示例:指定存储驱动程序 vfs 并在 Alpine 容器中运行 /bin/true

交互式地:

sudo useradd testuser
sudo machinectl shell testuser@
podman pull docker.io/library/alpine
/usr/bin/time -v podman --storage-driver=vfs run --rm docker.io/library/alpine /bin/true
exit

非交互式地:

sudo useradd testuser
systemd-run --machine=testuser@ --quiet --user --collect --pipe --wait \
   podman --storage-driver=vfs pull docker.io/library/alpine
systemd-run --machine=testuser@ --quiet --user --collect --pipe --wait \
   /usr/bin/time -v podman --storage-driver=vfs run --rm docker.io/library/alpine /bin/true

命令 /usr/bin/time -v 会测量并显示基准测试信息。

性能考量

使用快速的 OCI 运行时

Podman 在运行容器时会使用 OCI 运行时。最快的 OCI 运行时可能是 crun。

检查你是否正在使用 crun

$ podman info --format={{.Host.OCIRuntime.Name}}
crun

要对 OCI 运行时进行基准测试,请创建一个测试用户账户,并使用 --runtime 指定 OCI 运行时路径。

选择存储驱动程序

以下存储驱动程序按从快到慢的顺序列出:

  1. 原生 overlayfs

  2. fuse-overlayfs

  3. vfs

在这个速度排名中,有一个值得注意的例外情况。当所有以下条件都满足时,使用原生 overlayfs 创建容器所需的时间会明显比使用 fuse-overlayfs 更长:

  • 使用无 root 权限的 Podman

  • 使用了修改后的 UID/GID 映射

  • 使用了原生 overlayfs

  • 尚未使用指定的容器镜像和 UID/GID 映射创建任何容器

运行时速度不受影响。仅 podman create 命令以及 podman run 和 podman build 命令中的容器创建阶段会受到影响。更多详情请参阅 GitHub 评论。修改 UID/GID 映射的命令行选项包括 --userns、--uidmap 和 --gidmap 等。其中 --userns auto 选项受此性能损失影响尤为显著,因为每次调用可能使用不同的 UID/GID 映射方案。而其他 --userns、--uidmap 和 --gidmap 的使用场景中,性能损失仅为首次执行命令时产生的单次开销。

在 Linux 内核版本 >= 5.13 的系统上,Podman 版本 >= 3.1 可供非特权用户使用原生 overlayfs。若未使用 SELinux,则 Linux 内核版本 5.11 或更高版本即可满足需求。RHEL >= 8.5 已包含原生 overlayfs 支持,详见发行说明。

显示当前存储驱动程序:

$ podman info -f {{.Store.GraphDriverName}}
overlay
$ podman info -f '{{index .Store.GraphStatus "Native Overlay Diff"}}'
true

存储驱动程序

podman info -f {{.Store.GraphDriverName}}的结果

podman info -f '{{index .Store.GraphStatus "Native Overlay Diff"}}的结果

native overlayfs

overlay

true

fuse-overlayfs

overlay

false

VFS

vfs

false

在更改存储驱动程序之前,必须运行 podman system reset 命令。该命令将清除用户的所有容器和容器镜像。有关如何在独立测试账户中对存储驱动程序进行基准测试,请参阅上文“使用独立用户账户进行基准测试”中的示例。

使用命令行选项指定存储驱动程序

存储驱动程序

Podman 命令

native overlayfs

podman --storage-driver=overlay run ...

fuse-overlayfs

podman --storage-driver=overlay --storage-opt overlay.mount_program=/usr/bin/fuse-overlayfs run ...

VFS

podman --storage-driver=vfs run ...

配置默认存储驱动程序

默认存储驱动程序可在 /etc/containers/storage.conf 中配置,用户也可通过 ~/.config/containers/storage.conf 进行覆盖设置。

配置原生 overlayfs 的方法:

[storage]
driver = "overlay"

配置 fuse-overlayfs 的方法:

[storage]
driver = "overlay"
[storage.options.overlay]
mount_program = "/usr/bin/fuse-overlayfs"

配置 VFS 的方法:

[storage]
driver = "vfs"

有关所有可用的配置设置,请参阅 storage.conf。

无 root 权限的 Podman 的网络性能

使用无 root 权限的 Podman 时,网络流量通常通过网络驱动程序 pasta 传输。这会带来性能损失。

可通过以下方式避免使用 pasta:

  • 使用套接字激活机制来监听网络套接字。通过激活套接字进行的通信不会经过pasta,因此其性能特征与主机上的常规网络相同。套接字激活服务可通过不同方式启动和停止:

    • 当首个客户端连接时,让 systemd 启动该服务。在一段时间的闲置后,让服务自行终止。采用按需服务模式,可释放计算资源。

    • 显式启动服务(systemctl --user enable foobar.service)。若首个客户端连接时服务已运行,则不会因容器启动而产生延迟。有关Podman中套接字激活支持的更多信息,请参阅套接字激活教程。

  • 以root身份手动配置网络。创建桥接接口和虚拟以太网对(VETH)。注意:相较于其他方法,此配置不提供任何网络隔离。在被授予CAP_NET_ADMIN或CAP_NET_RAW权限的容器中,进程可直接打开面向主机的数据包或原始套接字,从而能够发送任意帧(包括精心构造的以太网和IP数据包),并通过ARP欺骗接收非本容器目标的数据包。更多信息请参阅

  • 使用 --network=host 选项。不会创建网络命名空间。容器将使用主机的网络。注意:使用 --network=host 选项会使容器获得对本地系统服务(如 D-bus)的完全访问权限,因此被视为不安全。

附注:Pasta 比网络驱动程序 slirp4netns 更快。自 Podman 5.0.0 起,Pasta 已成为默认网络驱动程序。

从 Podman 5.1.0 开始,可通过以下命令查看默认网络驱动程序:

$ podman info -f '{{.Host.RootlessNetworkCmd}}'
pasta

容器镜像的延迟拉取

Podman 支持对以下容器镜像格式进行延迟拉取:

  • zstd:chunked

  • eStargz

zstd:chunked 的性能优于 eStargz。。

参见朱塞佩·斯克里瓦诺(Giuseppe Scrivano)和丹·沃尔什(Dan Walsh)撰写的文章《通过部分拉取更快地拉取容器镜像》。

选择主机文件系统

当文件系统支持reflink时,容器镜像的延迟拉取可以更高效地运行。XFS和BTRFS文件系统支持reflink。

选项 --log-driver

podman run 命令的 --log-driver 选项用于指定容器的日志驱动程序。

若无需日志记录,可考虑使用 --log-driver=none 禁用日志功能。

构建容器镜像时重用包仓库缓存

容器构建的第一步通常是从软件包仓库下载元数据,并对这些数据进行后处理。

为加快容器构建速度,您可以在主机上准备一个包含软件包元数据的目录,然后通过覆盖挂载将该目录提供给容器构建使用。

示例:通过重用DNF元数据缓存来加快podman build的速度

在此示例中,容器基于 Fedora 36 构建。

首先在主机上创建一个空目录,例如 $HOME/dnf_cache_f36。

$ mkdir $HOME/dnf_cache_f36

用最新的dnf元数据缓存填充该目录。

$ podman run --rm -v $HOME/dnf_cache_f36:/var/cache/dnf:Z registry.fedoraproject.org/fedora:36 dnf makecache

创建一个新目录,例如 $HOME/ctr 以及一个文件 $HOME/ctr/Containerfile,其内容如下:

FROM registry.fedoraproject.org/fedora:36
RUN dnf -y update && dnf -y install cowsay && dnf clean all

要使用准备好的元数据缓存构建Containerfile,请提供目录 $HOME/dnf_cache_f36 作为覆盖挂载(卷选项 :O)

$ podman build -v $HOME/dnf_cache_f36:/var/cache/dnf:O -t cowsay $HOME/ctr

丹·沃尔什(Dan Walsh)撰写的《使用Buildah加快容器镜像构建速度》一文提供了更多详细信息。

  

学习本无底,前进莫徬徨。 —— 报摘
0 不喜欢
说说我的看法 -
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
其他应用
公众号