我试图了解系统范围的分析器是如何工作的.我们以linux perf为例.对于某个分析时间,它可以提供:
我几乎可以肯定的是,报告只是对实际情况的估计.所以我认为有一些内核模块以一定的采样率启动软件中断.采样率越低,分析器开销越低.中断可以读取存储性能计数器的模型特定寄存器.
下一部分是将计数器与机器上运行的软件相关联.这是我不理解的部分.
那么探查器从何处获取数据?
您是否可以查询任务计划程序以查明中断他时正在运行的内容?这不会影响调度程序的执行(例如,不是继续中断的函数,而是只调度另一个,使得分析器结果不准确).task_struct对象列表是否可用?
optimization performance profiling operating-system linux-kernel
L3-misses我使用以下命令在简单的基准测试中提取导致用户级别的回溯evince:
sudo perf record -d --call-graph dwarf -c 10000 -e mem_load_uops_retired.l3_miss:uppp /opt/evince-3.28.4/bin/evince
Run Code Online (Sandbox Code Playgroud)
很明显,采样周期相当大(连续采样之间有 10000 个事件)。对于这个实验, 的输出perf script有一些与此类似的样本:
EvJobScheduler 27529 26441.375932: 10000 mem_load_uops_retired.l3_miss:uppp: 7fffcd5d8ec0 5080022 N/A|SNP N/A|TLB N/A|LCK N/A
7ffff17bec7f bits_image_fetch_separable_convolution_affine+0x2df (inlined)
7ffff17bec7f bits_image_fetch_separable_convolution_affine_pad_x8r8g8b8+0x2df (/usr/lib/x86_64-linux-gnu/libpixman-1.so.0.34.0)
7ffff17d1fd1 general_composite_rect+0x301 (/usr/lib/x86_64-linux-gnu/libpixman-1.so.0.34.0)
ffffffffffffffff [unknown] ([unknown])
Run Code Online (Sandbox Code Playgroud)
在回溯的底部,有一个名为 的符号[unknown],看起来没问题。但随后就呼叫了线路general_composite_rect()。这个回溯OK吗?
AFAIK,回溯中的第一个调用者应该是类似_start()或 的东西__GI___clone()。但回溯不是这种形式。怎么了?
有什么办法可以解决这个问题吗?截断的(部分)回溯可靠吗?
call-graph ×1
linux ×1
linux-kernel ×1
optimization ×1
perf ×1
performance ×1
profiling ×1
trace ×1