揭秘libkperf核心功能:从性能计数到采样的全方位解析
前往项目官网免费下载:https://ar.openeuler.org/ar/
libkperf是一个轻量级Linux性能采集库,它能够让开发者以API的方式执行性能采集,包括PMU采样和符号解析。libkperf把采集数据内存化,使开发者能够在内存中直接处理采集数据,避免了读写perf.data带来的开销。
一、PMU计数:精准掌握系统性能指标
PMU计数是libkperf的核心功能之一,它能够帮助开发者精确地统计系统中各种硬件事件的发生次数。通过PMU计数,我们可以了解CPU的利用率、缓存命中率、内存访问情况等关键性能指标。
在libkperf中,PMU计数模式提供了丰富的预定义指标,涵盖了从DDR带宽到PCIe延迟的多个方面。例如,我们可以采集每个channel的ddrc的读带宽(PMU_DDR_READ_BW)、每个core的L3的miss数量(PMU_L3_MISS)以及pcie设备的rx方向上的读延时(PMU_PCIE_RX_MRD_LAT)等。这些指标为我们全面了解系统性能提供了有力的数据支持。
使用PMU计数功能非常简单,只需按照以下步骤进行操作:
- 打开PMU设备:通过调用
PmuOpen函数,输入pid、core id和事件等参数,即可打开PMU设备。 - 读取计数数据:使用相应的API接口读取PMU计数数据。对于Python开发者,可以使用
kperf.read(pd: int)接口;对于Go开发者,也有对应的读取函数。 - 关闭PMU设备:完成计数后,调用
PmuClose函数关闭PMU设备,释放资源。
二、多样化采样模式:深入剖析系统行为
除了PMU计数,libkperf还提供了多种采样模式,帮助开发者深入剖析系统行为,定位性能瓶颈。
1. PMU采样模式
PMU采样模式允许开发者以一定的频率对系统事件进行采样。采样频率可以通过/proc/sys/kernel/perf_event_max_sample_rate调整最大的采样频率。在采样过程中,我们可以设置采样间隔或采样频率,还可以启用共振防止抖动(JITTER)等功能。
2. SPE采样模式
libkperf提供SPE采样模式,类似于perf record的相关命令。SPE采样可以提供更详细的指令执行信息,对于深入分析程序的执行流程和性能瓶颈非常有帮助。
3. Blocked Sample采样模式
Blocked Sample是一种新增的采样模式,该模式下会同时采集进程处于on cpu和off cpu数据。通过配置blockedSample字段去进行使能,可以同时采集cycles和context-switches事件,换算off cpu的period数据。这种采样模式能够全面反映进程的运行状态,为分析进程的阻塞原因提供重要依据。
三、符号解析:让性能数据更具可读性
符号解析是libkperf的另一项重要功能,它能够将采集到的内存地址转换为对应的函数名和偏移量,使性能数据更具可读性。
在libkperf中,符号解析功能可以通过设置symbolMode参数来控制。例如,在Python API中,可以设置symbolMode=kperf.SymbolMode.RESOLVE_ELF来启用ELF文件的符号解析。对于不需要符号解析的场景,也可以不使用该参数。
为了提升符号解析速度,特别是在压测场景下,我们可以采取一些优化措施。例如,合理设置符号缓存大小、选择合适的符号解析策略等。具体的优化方法可以参考项目中的相关文档和示例。
四、多语言API支持:满足不同开发者需求
libkperf提供了多种编程语言的API支持,包括C/C++、Python和Go等,满足不同开发者的需求。
1. C/C++ API
C/C++ API是libkperf的基础,提供了最全面的功能支持。它定义了多种PMU模式,如COUNTING、SAMPLING和SPE_SAMPLING等,开发者可以根据实际需求选择合适的模式。
2. Python API
Python API为开发者提供了更加简洁易用的接口。通过Python API,开发者可以方便地实现PMU计数、采样和符号解析等功能。例如,使用kperf.enable(pd: int)接口开启某个pd的采样能力,使用kperf.disable(pd: int)接口关闭采样。
3. Go API
Go API也提供了类似的功能,支持COUNT、SAMPLE和SPE等采样模式。Go API的设计风格符合Go语言的特点,简洁高效,便于Go开发者集成和使用。
五、实际应用场景
libkperf的功能丰富,适用于多种性能分析场景。例如:
- 在工具
false_sharing中,通过SPE采样的data source信息定位伪共享问题。 - 在
pmu_hotspot工具中,实现IO和计算热点混合采样(Blocked Sample)。 - 通过
perf_data工具生成采样模式下的perf.data文件,以便后续分析。
六、总结
libkperf作为一个轻量级的Linux性能采集库,通过PMU计数、多样化采样模式和符号解析等核心功能,为开发者提供了全面的性能分析工具。其多语言API支持使得不同背景的开发者都能方便地使用libkperf进行性能分析和优化。无论是系统级性能优化还是应用程序性能调优,libkperf都能发挥重要作用,帮助开发者快速定位性能瓶颈,提升系统和应用的性能。
如果您想开始使用libkperf,可以通过以下命令克隆仓库:git clone https://gitcode.com/openeuler/libkperf,然后参考项目中的文档和示例进行学习和实践。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



