ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

LinuxKit 内核性能分析指南:使用 perf 工具进行容器系统性能剖析

LinuxKit 内核性能分析指南:使用 perf 工具进行容器系统性能剖析 操作系统云原生容器运行时【免费下载链接】linuxkitA toolkit for building secure, portable and lean operating systems for containers项目地址https://gitcode.com/gh_mirrors/li/linuxkit点击查看免费下载导读本文介绍如何在 LinuxKit 构建的最小化容器操作系统中使用 Linux 标准性能分析工具perf涵盖linuxkit/kernel-perf包的获取方式、与内核镜像版本的匹配机制、在 YAML 配置中的集成方法以及解锁完整性能数据所需的kptr_restrict调整技巧。读完本文你将能够独立在 LinuxKit 系统中完成 perf 的部署、容器内访问与基本性能剖析并理解其与内核构建体系的对应关系。perf 工具与 LinuxKit 内核的匹配机制perf是 Linux 标准的性能分析工具用于访问硬件性能计数器PMU 事件、trace 事件以及内核其他内部数据是排查 CPU 热点、锁竞争、调度延迟等问题的利器。它的一个核心特性是perf 用户态程序必须与内核版本精确匹配——perf 二进制依赖内核的 ABI、tracepoint 格式与符号表版本不一致时要么报错、要么产生错误的解析结果。针对这一约束LinuxKit 为每个受支持的内核版本配套构建了对应的linuxkit/kernel-perf包其镜像标签与linuxkit/kernel内核包保持一致的版本-哈希格式例如linuxkit/kernel-perf:6.12.59-hash。从 kernel/Makefile 中的构建目标可以看出TOOLSbcc perf定义了两个随内核一起构建的工具包buildtool-%目标会读取对应内核系列的build-args文件例如 kernel/6.12.x/build-args 中的KERNEL_VERSION6.12.59并按$(KERNEL_VERSION)-$(SERIES_HASH)的格式打标签——这正是保证perf 包与内核镜像一一对应的机制来源。perf 包的实际构建过程定义在 kernel/common/Dockerfile.perf 中其构建流程为从linuxkit/kernel:${KERNEL_VERSION}-${PKG_HASH}镜像中提取内核源码linux.tar.xz与内核头文件kernel-headers.tar在 Alpine 构建环境安装binutils-dev、elfutils-dev、libelf-static、zlib-static等静态链接依赖单独 clone 并构建libtraceevent固定到libtraceevent-1.8.2提交为 perf 提供 trace event 解析支持执行make -C tools/perf EXTRA_CFLAGS... LDFLAGS-static V1编译内核自带的tools/perf源码strip后拷贝到 scratch 镜像的/usr/bin/perf。从 kernel/common/build-perf.yml 可以看到构建入口image: kernel-perf、dockerfile: common/Dockerfile.perf即 perf 包与内核包共用同一套系列哈希series_hash计算逻辑进一步保证了标签的一致性。两种集成方式init 段注入与自定义包多阶段拷贝官方文档给出了两种将linuxkit/kernel-perf引入系统的方式方式一加入 init 段推荐在 LinuxKit YAML 配置的init段追加 perf 包kernel: image: linuxkit/kernel:6.12.59 init: - linuxkit/init:1c3e4933ceabd7418b961d66d5d884bf0044ac64 - linuxkit/runc:9442aa234715e751a16144f1d4ae3fd1a00fd492 - linuxkit/containerd:eb5daf20704109ea58abb38d2b808e0c3a7e3717 - linuxkit/ca-certificates:256f1950df59f2f209e9f0b81374177409eb11de - linuxkit/kernel-perf:6.12.59-hash加入init段后/usr/bin/perf会出现在系统根文件系统中实际位于 PID 1 容器的 rootfs随后有两种访问路径bind mount 进容器在服务容器中通过binds挂载例如- /usr/bin/perf:/usr/bin/perf但这种方式需要修改 YAML 中的 binds 配置通过 /proc/1/root 访问在getty或ssh容器内直接使用/proc/1/root/usr/bin/perf。文档作者倾向于不额外添加 bind mount避免改动配置而是直接在ssh或getty容器中创建符号链接ln -s /proc/1/root/usr/bin/perf /usr/bin/perf这条命令将 PID 1 容器 rootfs 中的 perf 软链到当前容器/usr/bin之后即可直接执行perf。方式二作为自定义包的多阶段构建阶段如果已有自定义包例如 pkg/ 下的某个包可以在其 Dockerfile 中将linuxkit/kernel-perf作为中间阶段再把/usr/bin/perf拷贝到最终阶段FROM linuxkit/kernel-perf:6.12.59-hash AS perf FROM alpine:3.x COPY --fromperf /usr/bin/perf /usr/bin/perf这种方式适合需要把 perf 固化进业务镜像的场景但代价是包的构建者必须自行维护与内核版本的对应关系容易因标签漂移导致 perf 与内核不匹配。为什么方式一更优init段中的镜像标签通常直接在 YAML 中定义而 LinuxKit 的 linuxkit.yml 就是内核镜像与 init 包共同声明的地方内核版本升级时 perf 标签可以同步更新天然保证匹配而自定义包方式中标签被写死在 Dockerfile与 YAML 中的内核版本脱钩需要人工同步。解锁完整性能数据处理 kptr_restrict 限制LinuxKit 默认在onboot段运行sysctl服务见 linuxkit.yml 中的linuxkit/sysctl配置其配置内容位于 pkg/sysctl/etc/sysctl.d默认会启用内核指针地址限制kptr_restrict。这会导致 perf 输出的符号地址被置为全 0无法解析内核函数名严重影响内核态采样分析。两种解决办法移除 sysctl 容器从 YAML 的onboot段删除linuxkit/sysctl但会连带放弃其他默认 sysctl 调优在运行时关闭指针限制推荐改动最小echo 0 /proc/sys/kernel/kptr_restrictkptr_restrict0允许所有用户读取内核符号地址perf 才能正确显示类似do_syscall_64这样的内核符号。需要说明的是kptr_restrict是一个安全相关的内核参数在生产环境开启 perf 内核态分析前应评估是否接受内核地址暴露的风险kptr_restrict2时即使 root 也无法查看内核地址。使用 perf 进行性能剖析的实践路径完成部署与 kptr 解锁后即可像标准 Linux 一样使用 perf典型操作包括# 查看内核与硬件性能事件支持 perf list # 记录系统级 CPU 采样默认 10 秒 perf record -a -g sleep 10 # 生成并查看调用图报告 perf report # 实时查看 top 热点 perf topLinuxKit 内核配置保证了 perf 所需的内核侧能力处于启用状态。以 kernel/6.12.x/config-x86_64 为例CONFIG_PERF_EVENTSyperf 事件子系统核心开关CONFIG_KALLSYMSy内核符号表结合CONFIG_KALLSYMS_BASE_RELATIVE用于地址解析CONFIG_HW_PERF_EVENTSy及CONFIG_PERF_EVENTS_INTEL_UNCOREy、CONFIG_PERF_EVENTS_INTEL_RAPLy、CONFIG_PERF_EVENTS_AMD_UNCOREy等硬件性能计数器与 uncore/RAPL 事件支持CONFIG_DEBUG_INFOy内核调试信息可用于perf annotate等深度分析。由于 LinuxKit 是精简系统perf record产生的数据文件默认落在当前目录建议输出到可写卷或通过linuxkit run的挂载卷持久化再在宿主机上用同版本 perf 做离线分析。包内容说明与已知限制LinuxKit 的kernel-perf包目前只包含perf二进制本体不包括详细的内嵌帮助文本perf --help输出较简略附加的分析脚本如perf script依赖的 Python/perl 辅助脚本、tools/perf/scripts下的示例脚本。文档中提到如果社区有需求可以将其补充进 LinuxKit 包这意味着当前版本如果需要完整帮助信息应参照 kernel/common/Dockerfile.perf 的构建方式自行扩展。构建与维护提示对于需要自行构建 perf 包例如内核打了自定义补丁的场景可参考 kernel/Makefile 中的工具构建目标# 查看当前支持的架构、内核版本与工具列表 make -C kernel list # 构建指定内核版本的 perf 工具包 make -C kernel buildtool-6.12.59PARTperf其中PART是 Makefile 中定义的版本与工具名分隔符RELEASESEP : PARTbuildtool-版本PARTperf会调用 kernel/common/build-perf.yml 完成构建。注意工具包标签与内核包共享series_hash哈希计算见 kernel/Makefile 中series_hash函数涉及的文件包括 kernel/common/Dockerfile.perf、kernel/common/build-perf.yml 及各内核系列的build-args文件。总结在 LinuxKit 中使用 perf 的关键路径可以概括为三条选对包用与内核镜像同标签的linuxkit/kernel-perf:版本-哈希放对位置优先加入init段再通过 bind mount 或/proc/1/root软链在 getty/ssh 容器内使用解除限制移除或绕过sysctl服务默认启用的kptr_restrict才能获得完整的内核符号解析。这套流程让 perf 这个标准工具在最小化的 LinuxKit 系统中同样可用为容器化场景下的内核态与用户态性能分析提供了可靠基础。赞分享操作系统云原生容器运行时【免费下载链接】linuxkitA toolkit for building secure, portable and lean operating systems for containers项目地址https://gitcode.com/gh_mirrors/li/linuxkit点击查看免费下载相关推荐Fira Code 编程连字字体使用指南3 步安装让代码符号读得更省力Fira Code 编程连字字体使用指南3 步安装让代码符号读得更省力 写代码时 、 、 : 这类符号各占一两列格子眼睛要反复把它们拼成一个逻辑操作系统云原生容器运行时libphonenumber性能分析使用工具进行性能剖析libphonenumber性能分析使用工具进行性能剖析 引言为什么需要性能剖析 在现代应用开发中电话号码处理是一个看似简单但实则复杂的任务。Googl后端移动开发5分钟上手HMSPush非华为手机接收QQ、抖音推送的完整教程5分钟上手HMSPush非华为手机接收QQ、抖音推送的完整教程 同样是晚上十点朋友的华为手机叮一声弹出QQ消息你低头一看自己的手机却安安静静。不是没移动开发即时通讯上一篇开源项目教程OpenBackRestore —— iStoreOS备份与恢复神器下一篇零成本搞定财务自由用本地LLMs自动化个人金融数据分析全指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表