ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

rkt 性能基准测试与剖析指南:用 rkt-monitor 量化 v1.4.0 容器资源开销

rkt 性能基准测试与剖析指南:用 rkt-monitor 量化 v1.4.0 容器资源开销 容器运行时云原生网络【免费下载链接】rkt[Project ended] rkt is a pod-native container engine for Linux. It is composable, secure, and built on standards.项目地址https://gitcode.com/gh_mirrors/rk/rkt点击查看免费下载rkt 是一个面向 Linux 的 pod 原生容器引擎其官方仓库在Documentation/performance/目录下提供了性能基准测试工具rkt-monitor的使用方法以及 rkt v1.4.0 在四种典型负载下的实测数据。本文以 Documentation/performance/rkt-1-4-0-benchmarks.md 为核心结合 Documentation/performance/README.md 与 tests/rkt-monitor 的源码实现完整讲解如何构建负载、运行基准、读懂输出并借助 rkt 内置的--cpuprofile/--memprofile隐藏全局参数对 rkt 自身进行 Go 性能剖析。读完本文你将能够在自己的机器上复现 rkt 资源开销测量并对 rkt 进程进行 pprof 级性能分析。rkt-monitorrkt 的资源监控基准工具rkt-monitor 是 rkt 仓库自带的基准测试工具作用是运行一个 rkt 容器负载并跟踪 rkt 及其全部子进程的内存与 CPU 占用。其核心思路来自 tests/rkt-monitor/README.md通过exec方式启动 rkt附带一个 ACI 或 pod manifest 作为工作负载每秒读取一次/proc记录 rkt 及所有子孙进程的 CPU、RSS 等指标到达指定时长后调用rkt stop终止容器、rkt gc回收资源并把统计结果打印出来。从 tests/rkt-monitor/main.go 的源码可以看出rkt-monitor 对每次实验执行的操作序列为构造rkt run --debug [--stage1-path…] workload --insecure-optionsimage --netdefault-restricted命令 → 启动后等待输出中的APP-STARTED!标记确认容器就绪 → 循环采样直到超时 →rkt stop containerId→rkt gc --grace-period0→ 汇总并打印平均值与峰值。运行基准测试的前置条件依据 Documentation/performance/README.md运行基准需要同时具备三样东西一个构建好的 rkt-monitor 可执行文件一个测试工作负载单个 ACI或由多个 ACI pod manifest 组成的 podrkt 位于当前PATH中rkt-monitor 会直接调用名为rkt的二进制除非通过-p显式指定目录。另外还有两个隐含前提需要 root 权限。tests/rkt-monitor/main.go 在启动时检查os.Getuid() ! 0非 root 会直接退出并提示need to be root to run rkt images由于 rkt-monitor 通过--insecure-optionsimage运行 ACItests/rkt-monitor/main.go请确保你了解该参数关闭了镜像签名校验的安全含义。构建 rkt-monitor按文档说明进入tests/rkt-monitor目录执行其中的build脚本即可生成rkt-monitor二进制该目录同时提供多个build-*脚本例如 tests/rkt-monitor/README.md 中展示的./tests/rkt-monitor/build-stresser.sh all用于把各类压力负载打包成 ACI。构建负载 ACI 与 pod manifest所有构建脚本都依赖acbuild工具需位于当前PATH。构建完成后会产生两种结果之一单个 ACI如log-stresser.aci、mem-stresser.aci、cpu-stresser.aci可直接作为 rkt-monitor 的入参一个目录 pod manifest目录内含多个 ACI 和一个 pod manifest如文档中使用的too-many-apps.podmanifest。这种场景必须先导入把目录中的 ACI 逐一导入 rkt 的内容寻址存储CAS命令如下rkt fetch --insecure-optionsimage newDirectory/*导入完成后即可将 pod manifest 交给 rkt-monitor 使用。启动一次基准sudo ./rkt-monitor workloadworkload可以是 ACI 文件路径也可以是 pod manifest 文件路径。rkt-monitor 会通过 JSON 解码自动识别 pod manifest 并切换运行模式tests/rkt-monitor/main.go。rkt-monitor 命令行选项详解rkt-monitor 官方帮助 与 tests/rkt-monitor/main.go 中的 flags 定义完全对应汇总如下选项简写默认值说明--duration-d10s基准运行时长使用 Go 的time.ParseDuration格式如30s、1m-d 30s即运行 30 秒--repetitions-r1基准实验重复次数每次独立执行一轮启动→采样→停止→GC--verbose-vfalse每秒打印各进程当前的瞬时资源占用--show-output-ofalse透传显示 rkt 的 stdout / stderr便于观察容器内部输出--to-file-ffalse把采样结果写入文件默认落在/tmp生成 CSV--output-dir-w/tmp指定结果写入目录配合-f使用--rkt-dir-p指定包含rkt二进制的目录为空时使用PATH中的 rkt--stage1-path-s指定要使用的 stage1 镜像路径为空时默认使用 coreos stage1即stage1-coreos.aci注意 Documentation/performance/README.md 中提到的-f行为是保存到带rkt_benchmark前缀的临时目录文件而从 tests/rkt-monitor/main.go 的实现看实际会生成两个 CSV日期_stage1类型_负载名_rkt_benchmark_interval.csv逐秒采样明细表头Time, PID name, PID number, RSS, CPU与日期_stage1类型_负载名_rkt_benchmark_summary.csv汇总表头Load1, Load5, Load15, StartTime, StopTime。-p和-s两个选项对复现同一台机器、不同 stage1的对比实验尤其有用。测量原理源码级解读理解 rkt-monitor 的输出之前有必要弄清楚它的采样机制来自 tests/rkt-monitor/main.go进程树遍历getUsage(pid)tests/rkt-monitor/main.go从 rkt 主进程 PID 出发通过proc.Children()递归收集全部子孙进程并利用pidMap缓存已创建的process.Process对象指标采集getProcStatustests/rkt-monitor/main.go对每个进程调用p.Percent(0)CPU 百分比和p.MemoryInfo()其中 RSS 作为内存指标采样节奏主循环每秒time.Sleep(time.Second)采样一次tests/rkt-monitor/main.go平均值与峰值结束后对每个进程的采样历史求 CPU / RSS 平均并取 RSS 最大值作为peak Memtests/rkt-monitor/main.go单位格式化formatSizetests/rkt-monitor/main.go按 1024 进制输出gB / mB / kB / B启动/停止计时以exec发出到 stdout 出现APP-STARTED!之间的时间作为container start time以发出rkt stop到收到停止确认之间的时间作为container stop time。因此每条名称(PID): seconds alive: N avg CPU: X% avg Mem: Y peak Mem: Z的含义是该进程存活期间的平均 CPU 占用、平均 RSS 与峰值 RSS。seconds alive等于被采样到的秒数略小于总时长首秒用于确认容器启动。测试负载与它们的行为特征仓库在 tests/rkt-monitor 下提供了四种压力负载的源码分别模拟不同的资源消耗模式log-stresser无限循环打印时间戳字符串持续制造日志输出主要考验日志链路rkt 日志转发与 stage1 中 systemd-journald的吞吐与 CPU 开销mem-stresser无限循环向一个[]uint64切片追加数据持续增长内存占用考验内存分配与内核回收压力cpu-stresser无限循环累加10 亿次整数求和制造接近满核的纯 CPU 计算压力sleeper空转/休眠用于测量几乎无事可做时 rkt 与 stage1 的基线开销too-many-apps.podmanifest包含大量 worker 应用的 pod manifest用于考察多应用 pod场景下 rkt 与 systemd 的管理开销worker-binary进程两两重复仅 PID 不同。v1.4.0 基准测试结果以下数据来自 Documentation/performance/rkt-1-4-0-benchmarks.md是在一台运行 NixOS 的个人笔记本上测得。测试环境derekproton ~ cat /proc/cpuinfo | grep model name model name : Intel(R) Core(TM) i7-6500U CPU 2.50GHz model name : Intel(R) Core(TM) i7-6500U CPU 2.50GHz model name : Intel(R) Core(TM) i7-6500U CPU 2.50GHz model name : Intel(R) Core(TM) i7-6500U CPU 2.50GHz derekproton ~ uname -a Linux proton 4.4.6 #1-NixOS SMP Wed Mar 16 15:43:17 UTC 2016 x86_64 GNU/Linux即双核四线程的 Intel i7-6500U、内核 4.4.6、x86_64。这些数字与硬件、内核版本、stage1 实现强相关只能作为量级参考必须在自己的环境中复测。log-stresser.aci日志压力derekproton ~/go/src/github.com/rkt/rkt/tests/rkt-monitor sudo ./rkt-monitor log-stresser.aci rkt(18493): seconds alive: 10 avg CPU: 28.314541% avg Mem: 2 mB peak Mem: 2 mB systemd(18515): seconds alive: 9 avg CPU: 0.000000% avg Mem: 4 mB peak Mem: 4 mB systemd-journal(18517): seconds alive: 9 avg CPU: 88.397098% avg Mem: 7 mB peak Mem: 7 mB worker(18521): seconds alive: 9 avg CPU: 7.330367% avg Mem: 5 mB peak Mem: 6 mB load average: Load1: 0.390000 Load5: 0.120000 Load15: 0.080000 container start time: 250721ns container stop time: 17332926nsmem-stresser.aci内存压力derekproton ~/go/src/github.com/rkt/rkt/tests/rkt-monitor sudo ./rkt-monitor mem-stresser.aci worker(18634): seconds alive: 9 avg CPU: 98.550401% avg Mem: 318 mB peak Mem: 555 mB rkt(18599): seconds alive: 10 avg CPU: 3.583814% avg Mem: 2 mB peak Mem: 2 mB systemd(18628): seconds alive: 9 avg CPU: 0.000000% avg Mem: 4 mB peak Mem: 4 mB systemd-journal(18630): seconds alive: 9 avg CPU: 0.000000% avg Mem: 6 mB peak Mem: 6 mB load average: Load1: 0.310000 Load5: 0.150000 Load15: 0.090000 container start time: 259746ns container stop time: 17593446nscpu-stresser.aciCPU 压力derekproton ~/go/src/github.com/rkt/rkt/tests/rkt-monitor sudo ./rkt-monitor cpu-stresser.aci rkt(18706): seconds alive: 10 avg CPU: 3.587050% avg Mem: 2 mB peak Mem: 2 mB systemd(18736): seconds alive: 9 avg CPU: 0.000000% avg Mem: 4 mB peak Mem: 4 mB systemd-journal(18740): seconds alive: 9 avg CPU: 0.000000% avg Mem: 6 mB peak Mem: 6 mB worker(18744): seconds alive: 9 avg CPU: 88.937493% avg Mem: 808 kB peak Mem: 808 kB load average: Load1: 0.310000 Load5: 0.130000 Load15: 0.080000 container start time: 296570ns container stop time: 16124700nstoo-many-apps.podmanifest多应用 pod-d 30sderekproton ~/go/src/github.com/rkt/rkt/tests/rkt-monitor sudo ./rkt-monitor too-many-apps.podmanifest -d 30s # Identical (aside from PID) worker-binary lines removed rkt(17227): seconds alive: 20 avg CPU: 9.595387% avg Mem: 3 mB peak Mem: 20 mB systemd(17253): seconds alive: 17 avg CPU: 0.329028% avg Mem: 16 mB peak Mem: 16 mB systemd-journal(17255): seconds alive: 17 avg CPU: 0.000000% avg Mem: 6 mB peak Mem: 6 mB worker-binary(17883): seconds alive: 17 avg CPU: 0.000000% avg Mem: 840 kB peak Mem: 840 kB load average: Load1: 0.480000 Load5: 0.350000 Load15: 0.300000 container start time: 528476ns container stop time: 4522346ns结果解读结合源码与各场景特征可以从这些数据中提炼出几条可验证的结论rkt 宿主进程自身开销极低在 mem / cpu 压力下rkt 进程平均 CPU 仅约3.5%、平均内存2 mB、峰值2 mB日志场景 rkt 平均 CPU 升至28%可以推断这是 rkt 作为日志转发/管道环节承担高频日志 I/O 所致日志链路的主要开销在 systemd-journaldlog-stresser 场景下systemd-journal平均 CPU 高达88.4%而 mem / cpu 场景下其 CPU 为0%说明 journald 是日志热路径的瓶颈所在worker 进程按预期吃满资源mem-stresser 的 worker 平均 CPU98.5%、平均内存318 mB、峰值555 mBcpu-stresser 的 worker 平均 CPU88.9%、内存仅808 kB——符合累加整数程序内存占用极小的特征多应用 pod 会放大 stage1 管理开销too-many-apps 场景中 rkt 平均 CPU9.6%、峰值内存20 mB远超单应用场景的2 mBsystemd 平均内存也升至16 mB可见应用数量直接影响 rkt 与 stage1 systemd 的资源占用容器生命周期耗时量级三个单应用场景的container start time均在250–300 µs级别rkt run到应用确认启动container stop time在16–18 ms级别多应用 pod 的启动时间约为528 µs停止时间反而更短约4.5 ms体现了批量化进程管理的差异。需要再次强调以上数值是特定硬件、特定内核4.4.6、特定 stage1coreos下的快照不能泛化为 rkt 的普适性能指标复现时请使用-r做多次重复、-v观察瞬时波动并用-f落盘 CSV 便于进一步分析。性能剖析rkt 内置的 --cpuprofile 与 --memprofile除了宏观的资源基准rkt 还内置了两个隐藏的全局参数用于对 rkt 进程本身做 Go 性能剖析--cpuprofile$FILE把 CPU profile 写入指定文件--memprofile$FILE把内存堆profile 写入指定文件。这两个参数在 rkt/rkt.go 中注册为cmdRkt.PersistentFlags()并通过MarkHidden隐藏因此不会出现在rkt help的常规输出中但功能完整可用。其底层实现位于 rkt/rkt.gostartProfile()在命令执行前被调用若指定了 CPU profile则创建文件并调用pprof.StartCPUProfile(cpufile)若指定了内存 profile仅创建文件、暂不写入stopProfile()在命令结束时被调用调用pprof.StopCPUProfile()结束 CPU 采样并通过pprof.WriteHeapProfile(memfile)把堆 profile 写入内存文件。需要特别留意的是内存 profile 只在 rkt 退出前才会被写入因此在 rkt 运行期间查看该文件会是空的——这是 Documentation/performance/README.md 明确指出的限制。剖析示例对 gc 命令做性能剖析Documentation/performance/README.md 给出的完整示例使用一个快速结束的子命令gc$ sudo /usr/bin/rkt --cpuprofile/tmp/cpu.profile --memprofile/tmp/mem.profile gc --grace-period0 $ go tool pprof /usr/bin/rkt /tmp/cpu.profile $ go tool pprof /usr/bin/rkt /tmp/mem.profilego tool pprof会进入交互式界面可用top、web、list 函数名等指令查看热点函数与调用栈。对于 CPU profilepprof.StartCPUProfile自命令启动即开始采样能覆盖整个命令生命周期内的 CPU 热点对于内存 profile由于 heap profile 在退出前才落盘得到的是命令结束时堆的分配快照适合分析峰值内存分配路径。由于 rkt 的每个子命令run、gc、stop、fetch等都会经过 rkt/rkt.go 的runWrapper其中统一调用startProfile()与stopProfile()因此任意子命令都可以带上这两个 flag 进行剖析——例如用rkt --cpuprofile/tmp/run.profile run image剖析一次完整容器启动的 CPU 热点。更系统的 Go 程序性能剖析方法采样原理、pprof 交互命令、火焰图生成等可参考 Go 官方博客的《Profiling Go Programs》一文。总结rkt-monitor是 rkt 官方的资源基准工具通过逐秒采样 rkt 及其子孙进程的 CPU / RSS量化容器运行时与 stage1 的实际开销支持-d、-r、-v、-f、-p、-s、-o等参数入口源码在 tests/rkt-monitor/main.gov1.4.0 实测数据显示单应用场景下 rkt 宿主进程开销极小内存约 2 mB日志场景瓶颈集中在 systemd-journald多应用 pod 会显著抬高 rkt 与 systemd 的管理开销启动耗时约数百微秒、停止约十几毫秒但均受硬件与 stage1 影响需自行复测性能剖析rkt 内置隐藏全局参数--cpuprofile/--memprofilerkt/rkt.go配合go tool pprof即可定位 rkt 自身各子命令的热点函数注意内存 profile 仅在退出前落盘。如果希望在自己的机器上复现本文数据建议按顺序构建 rkt 与 rkt-monitor → 用 acbuild 生成负载 ACIpod 场景先rkt fetch导入→sudo ./rkt-monitor workload -r 3 -d 30s -v→ 对感兴趣的阶段追加--cpuprofile/--memprofile深入剖析。赞分享容器运行时云原生网络【免费下载链接】rkt[Project ended] rkt is a pod-native container engine for Linux. It is composable, secure, and built on standards.项目地址https://gitcode.com/gh_mirrors/rk/rkt点击查看免费下载相关推荐用 rkt-monitor 实测 Pod 级资源开销rkt 性能基准工具的原理与实操用 rkt monitor 实测 Pod 级资源开销rkt 性能基准工具的原理与实操 rkt monitor 是 rkt 仓库内置的一个小型 Go 基准测试工容器运行时云原生网络如何精准掌握招聘发布时间Boss Show Time插件的7个实用技巧如何精准掌握招聘发布时间Boss Show Time插件的7个实用技巧 还在为错过最佳投递时机而烦恼吗Boss Show Time是一款专为求职者设计的智能前端服务器安全审计如何用searchall快速发现隐藏的敏感信息服务器安全审计如何用searchall快速发现隐藏的敏感信息 在数字安全日益重要的今天每个服务器管理员都面临着一个共同的挑战如何确保系统中没有泄露的敏感网络安全应用安全渗透测试上一篇Burn用 Rust 统一训练与推理的下一代张量库与深度学习框架下一篇终极tmux配置指南Urlscan和PathPicker高效集成应用创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表