Rootless 与 UserNS Remap 的性能差异测试方法

解读

国内云原生面试中,**“Rootless Docker”“UserNS Remap”**常被混为一谈,但二者实现路径不同:

  • Rootless 模式全程以非特权用户运行 dockerd,依赖 slirp4netnsfuse-overlayfsrootlesskit 等用户态组件,存在系统调用截获网络栈转换开销。
  • UserNS Remap 仍以特权 dockerd 运行,仅通过 /etc/subuid 把容器内 uid 0 映射到宿主机高阶 uid,内核路径基本不变,理论上更接近原生性能。
    面试官想确认候选人能否:
  1. 设计可复现贴近生产的基准;
  2. 排除宿主机背景噪声;
  3. 给出量化结论调优建议
  4. 熟悉国内主流内核(5.4/5.10)与发行版(CentOS 7.9、AlibabaCloud Linux 3、Ubuntu 20.04)的已知缺陷。

知识点

  • Rootless 模式启动链:systemd --user → dockerd-rootless.sh → rootlesskit → slirp4netns → containerd → runc。
  • UserNS Remap 内核路径:dockerd → containerd → runc → /proc/self/uid_map 完成 id-mapping,不经过 slirp4netns
  • 性能干扰因子
    slirp4netns 用户态网络,每包两次拷贝
    fuse-overlayfs 比内核 overlayfs 多一次 FUSE 往返
    seccomp、selinux、audit 在 Rootless 下默认策略更严;
    CentOS 7 默认内核 3.10,UserNS 支持不完整,需升级到 5.4+ 才能公平比较。
  • 国内监管要求:等保 2.0 要求容器运行时开启 auditcis 1.2.0 规则,测试时需同步打开以贴近真实场景。

答案

测试目标:量化 Rootless 与 UserNS Remap 在 CPU、内存、网络、存储、启动延迟五维度的差异,给出百分比比值P99 置信区间

环境准备

  1. 同一台物理机(Intel 8269CY 2.5 GHz,32 C,128 GB,NVMe),关闭 Turbo、NUMA balancing、irqbalance
  2. 双系统盘,**分别安装 AlibabaCloud Linux 3(内核 5.10)**与 CentOS 7.9(内核 5.4,elrepo),grub2 切换,排除发行版干扰;
  3. Docker 版本统一 24.0.2cgroup v2 统一开启
  4. 使用 tuned-adm throughput-performancecpufreq-set performance 锁定频率。

测试工具与用例

  • CPU/内存:使用 sysbench cpu/oltp_read_write,容器内 8 线程,运行 300 s,取 ops/sP99 延迟
  • 网络
    – 同宿主机 veth pair 场景:使用 netserver/netperf,测试 TCP_RR、TCP_CRR、UDP_RR,报文大小 1 B/1 K/16 K;
    – 跨宿主机 10 Gbps 网络,使用 qperf,排除 slirp4netns 本身带宽上限(~3 Gbps)影响;
  • 存储
    fio 4 K 随机读写,iodepth 32,numjobs 8,测试 overlayfs vs fuse-overlayfs
    – 额外测试 Docker build 上下文 1 GB,多阶段构建耗时
  • 启动延迟:使用 crictl pull + crictl run 100 次,取 P50/P99
  • 监控
    perf stat -e cache-misses,cycles,instructions 采集 CPU 微架构事件;
    sar -n DEV 1 采集软中断;
    slirp4netns 自带 --metrics-port 导出用户态网络延迟直方图。

结果判读

  • Rootless TCP_RR P99 延迟高于 UserNS Remap 15 % 以上,且 perf 显示 slirp4netns 进程占用 25 % CPU,即可判定网络栈为瓶颈;
  • fuse-overlayfs 4 K 写延迟高 30 %fio 显示 usr_cpu 翻倍,则存储为瓶颈;
  • sysbench 差异 < 5 %,说明 CPU/内存 基本无损;
  • 最终输出 Markdown 报告,给出 “Rootless 适合 Dev/测试,UserNS Remap 适合生产高并发” 的结论,并附 tuned 调优参数systemd 切片示例。

拓展思考

  1. 国内混合云场景:部分金融客户使用 麒麟 V10(内核 4.19),Rootless 模式因 缺少 overlayfs in UserNS 补丁,强制回退到 fuse-overlayfs,性能下降 40 % 以上,此时应直接放弃 Rootless,改用 UserNS Remap + 自定义 seccomp 满足等保。
  2. K8s 集成:Rootless 模式在 kubelet 1.28 仍属实验特性,CNI 插件需支持 userns,否则 portmap 失败;面试可补充“在 ACK 托管版中,目前仅支持 UserNS Remap 的节点池”。
  3. 未来趋势内核 6.2+ 的 overlayfs idmapped mounts 可让 Rootless 直接使用内核 overlayfs,fuse-overlayfs 将成为历史;建议候选人关注 moby/moby #42333alibaba/cloud-kernel 的 backport 计划,提前验证 idmapped mounts + slirp4netns 的组合性能,为明年双 11 大促做技术储备