perf性能分析工具使用分享

💡 原文中文,约10200字,阅读约需25分钟。
📝

内容提要

本文介绍了Linux内核自带的系统性能优化工具perf的功能和使用方法,包括打印消耗CPU时间较多的用户程序调用栈、生成火焰图、查看硬件和软件事件等。文章还介绍了perf的安装和基本使用方法,以及使用perf record和perf report进行性能分析和优化。最后,介绍了使用perf生成火焰图的方法和步骤。

🔎

延伸解读

perf采样原理与事件选择

perf基于tick中断采样,通过高频采样推断程序耗时分布。文章指出,采样频率足够高、时间足够长时,采样点落在热点函数的概率与其耗时成正比。此外,perf支持多种事件触发采样,如硬件事件(cache命中)、软件事件(进程切换)和tracepoint事件,不同事件可帮助定位不同维度的性能问题,如缓存失效分布或内核行为细节。

perf stat关键指标解读

perf stat提供程序运行概览,其中task-clock高说明CPU计算密集而非IO等待;context-switches频繁则反映进程或内核态/用户态切换开销大;cpu-migrations表示CPU迁移次数,过多迁移可能影响性能;cycles和instructions可计算IPC,IPC偏低意味着CPU未充分利用。这些指标有助于快速判断程序瓶颈类型。

火焰图生成与解读要点

生成火焰图需先用perf script解析perf.data,再用stackcollapse-perf.pl折叠符号,最后用flamegraph.pl生成SVG。火焰图x轴表示采样次数,宽度越大表示CPU耗时越多;y轴表示调用栈,顶层函数若出现平顶,则可能存在性能问题。优化时应聚焦高占比的热点代码,避免在低占比代码上过度优化。

perf report分析技巧与调优案例

perf report可显示函数级采样结果,通过--symbol-filter可筛选关注函数,--call-graph可查看调用关系。文章案例中,dev_ui占用较高CPU且调用libQt5库,提示调用库代码可能存在问题;_int_malloc频繁出现说明动态内存申请过多;__clock_gettime频繁调用则可能因计时需求。针对内核态频繁中断用户态的问题,可采用CPU绑核减少迁移。

❓

Q&A

perf工具的主要功能是什么?

perf工具可以打印消耗CPU时间较多的用户程序调用栈,并生成火焰图,分析硬件和软件事件,帮助优化程序性能。

如何在Ubuntu上安装perf工具?

可以使用命令:sudo apt-get install linux-tools-common linux-tools-$(uname -r) linux-cloud-tools-$(uname -r) linux-tools-generic linux-cloud-tools-generic进行安装。

perf如何进行性能分析?

使用perf record命令记录采样数据,随后使用perf report命令显示统计结果,以分析程序的性能瓶颈。

火焰图的x轴和y轴分别表示什么?

火焰图的x轴表示采样次数,y轴表示调用栈,宽度越大表示CPU耗时越多。

perf如何生成火焰图?

生成火焰图的步骤包括使用perf script解析数据、折叠符号并生成SVG图。

使用perf进行性能优化时应关注哪些部分?

应关注高占比的热点代码片段,以提高整体程序性能。

🏷️

标签

➡️

继续阅读