Podman 的性能可能受到多种因素的影响,例如:
指定的 Podman 命令行选项和配置
OCI 运行时环境
主机文件系统
容器镜像
更改这些因素中的任何一项,都可能对您系统上 Podman 的性能产生明显影响,也可能不会产生任何影响。
某些性能优化技巧(例如更换存储驱动程序)需要用户执行 podman system reset 命令,这将清除用户的所有容器及容器镜像。与其在个人主目录中测试不同方案,不如创建一个临时用户,操作完成后即可删除该用户。
交互式地:
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 会测量并显示基准测试信息。
Podman 在运行容器时会使用 OCI 运行时。最快的 OCI 运行时可能是 crun。
检查你是否正在使用 crun
$ podman info --format={{.Host.OCIRuntime.Name}}
crun要对 OCI 运行时进行基准测试,请创建一个测试用户账户,并使用 --runtime 指定 OCI 运行时路径。
以下存储驱动程序按从快到慢的顺序列出:
原生 overlayfs
fuse-overlayfs
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 时,网络流量通常通过网络驱动程序 pasta 传输。这会带来性能损失。
可通过以下方式避免使用 pasta:
使用套接字激活机制来监听网络套接字。通过激活套接字进行的通信不会经过pasta,因此其性能特征与主机上的常规网络相同。套接字激活服务可通过不同方式启动和停止:
当首个客户端连接时,让 systemd 启动该服务。在一段时间的闲置后,让服务自行终止。采用按需服务模式,可释放计算资源。
显式启动服务(systemctl --user enable foobar.service)。若首个客户端连接时服务已运行,则不会因容器启动而产生延迟。有关Podman中套接字激活支持的更多信息,请参阅套接字激活教程。
以root身份手动配置网络。创建桥接接口和虚拟以太网对(VETH)。注意:相较于其他方法,此配置不提供任何网络隔离。在被授予CAP_NET_ADMIN或CAP_NET_RAW权限的容器中,进程可直接打开面向主机的数据包或原始套接字,从而能够发送任意帧(包括精心构造的以太网和IP数据包),并通过ARP欺骗接收非本容器目标的数据包。更多信息请参阅
一个发布在Podman邮件列表上的例子
《Podman-Rootless-Networking.pdf》中的“DIY 网络”部分分
使用 --network=host 选项。不会创建网络命名空间。容器将使用主机的网络。注意:使用 --network=host 选项会使容器获得对本地系统服务(如 D-bus)的完全访问权限,因此被视为不安全。
附注:Pasta 比网络驱动程序 slirp4netns 更快。自 Podman 5.0.0 起,Pasta 已成为默认网络驱动程序。
从 Podman 5.1.0 开始,可通过以下命令查看默认网络驱动程序:
$ podman info -f '{{.Host.RootlessNetworkCmd}}'
pastaPodman 支持对以下容器镜像格式进行延迟拉取:
zstd:chunked
eStargz
zstd:chunked 的性能优于 eStargz。。
参见朱塞佩·斯克里瓦诺(Giuseppe Scrivano)和丹·沃尔什(Dan Walsh)撰写的文章《通过部分拉取更快地拉取容器镜像》。
当文件系统支持reflink时,容器镜像的延迟拉取可以更高效地运行。XFS和BTRFS文件系统支持reflink。
podman run 命令的 --log-driver 选项用于指定容器的日志驱动程序。
若无需日志记录,可考虑使用 --log-driver=none 禁用日志功能。
容器构建的第一步通常是从软件包仓库下载元数据,并对这些数据进行后处理。
为加快容器构建速度,您可以在主机上准备一个包含软件包元数据的目录,然后通过覆盖挂载将该目录提供给容器构建使用。
在此示例中,容器基于 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加快容器镜像构建速度》一文提供了更多详细信息。