尝试使用性能分析器。我已经安装了 linux 通用工具,但没有运气。这是我收到的消息:
r@r-K55A:~$ perf
WARNING: perf not found for kernel 3.16.0-45
You may need to install the following packages for this specific kernel:
linux-tools-3.16.0-45-generic
linux-cloud-tools-3.16.0-45-generic
You may also want to install one of the following packages to keep up to date:
linux-tools-generic
linux-cloud-tools-generic
Run Code Online (Sandbox Code Playgroud)
我尝试安装上述软件包,但出现以下错误:
Unable to locate package linux-tools-3.16.0-45-generic
E: Couldn't find any package by regex 'linux-tools-3.16.0-45-generic'
Run Code Online (Sandbox Code Playgroud)
我正在尝试在具有 PMU 支持的 aria10 fpga 板(带有 2 个 ARM Cortex A9 CPU)上分析我的用户空间程序。我正在运行 windriver linux 版本 9.x。我使用人们在互联网上建议的几乎所有 CONFIG_ 选项构建了我的内核。另外,我的 pgm 是使用 \xe2\x80\x93fno-omit-frame-pointer 和 \xe2\x80\x93g 选项编译的。
\n\n我看到的是 \xe2\x80\x98perf record\xe2\x80\x99 根本不生成任何样本。\xe2\x80\x98perf stat true\xe2\x80\x99 输出看起来是有效的(不知道从中可以得到什么)。有人有建议/想法为什么我没有看到生成任何样本吗?
\n\n~: perf record --call-graph dwarf -- my_app\n\n^C\n[ perf record: Woken up 1 times to write data ]\n[ perf record: Captured and wrote 0.003 MB perf.data ]\n\n~: perf report -g graph --no-children\nError:\nThe perf.data file has no samples!\n To display the perf.data header info, please use --header/--header-only options.\n\n~: perf …Run Code Online (Sandbox Code Playgroud) 我试图使用perf工具来分析我的C++代码.实现包含带有SSE/AVX/AVX2指令的代码.除了该代码使用-O3 -mavx2 -march=native标志编译.我相信__memset_avx2_unaligned_erms函数是一个libc实现memset.perf表明这个功能有相当大的开销.函数名称表示内存未对齐,但在代码中我使用GCC内置宏显式对齐内存__attribute__((aligned (x)))可能是此函数有明显开销的原因以及为什么虽然内存明确对齐但调用了未对齐版本?
对于分析,我们可以在 Linux 中使用 perf。但所有示例仅显示可执行文件。
在 CentOS 中,是否可以在正在运行的进程或守护程序上运行 perf 工具?
我使用以下perf命令对用户空间对 DRAM 的读取访问进行采样evince:
perf record -d --call-graph dwarf -c 100 -e mem_load_uops_retired.l3_miss:uppp /opt/evince-3.28.4/bin/evince
Run Code Online (Sandbox Code Playgroud)
可以看出,我使用该PEBS功能来提高采样的准确性。但是有一些非内存访问报告为内存访问。例如,这是一个由 报告的采样事件perf script:
evince 20589 16079.401401: 100 mem_load_uops_retired.l3_miss:uppp: 555555860750 5080022 N/A|SNP N/A|TLB N/A|LCK N/A
555555579939 ev_history_can_go_back+0x19 (/opt/evince-3.28.4/bin/evince)
5555555862ef ev_window_update_actions_sensitivity+0xa1f (/opt/evince-3.28.4/bin/evince)
55555558ce4f ev_window_page_changed_cb+0xf (/opt/evince-3.28.4/bin/evince)
7ffff574510c g_closure_invoke+0x19c (/usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.5600.4)
7ffff575805d signal_emit_unlocked_R+0xf4d (/usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.5600.4)
7ffff5760714 g_signal_emit_valist+0xa74 (/usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.5600.4)
7ffff576112e g_signal_emit+0x8e (/usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.5600.4)
7ffff7140d76 emit_value_changed+0xf6 (inlined)
7ffff7140d76 adjustment_set_value+0xf6 (inlined)
7ffff7140d76 gtk_adjustment_set_value_internal+0xf6 (/usr/lib/x86_64-linux-gnu/libgtk-3.so.0.2200.30)
7ffff574510c g_closure_invoke+0x19c (/usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.5600.4)
7ffff5757de7 signal_emit_unlocked_R+0xcd7 (/usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.5600.4)
7ffff575fc7f g_signal_emitv+0x27f (/usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.5600.4)
7ffff7153519 gtk_binding_entry_activate+0x289 (/usr/lib/x86_64-linux-gnu/libgtk-3.so.0.2200.30)
7ffff71539ef binding_activate+0x5f (/usr/lib/x86_64-linux-gnu/libgtk-3.so.0.2200.30) …Run Code Online (Sandbox Code Playgroud) 我需要有关 perf 中可用的以下块(磁盘 I/O)事件的信息。您能告诉我在哪里可以获得有关每个活动的详细信息吗?
block:block_bio_backmerge
block:block_bio_bounce
block:block_bio_complete
block:block_bio_frontmerge
block:block_bio_queue
block:block_bio_remap
block:block_dirty_buffer
block:block_getrq
block:block_plug
block:block_rq_complete
block:block_rq_insert
block:block_rq_issue
block:block_rq_remap
block:block_rq_requeue
block:block_sleeprq
block:block_split
block:block_touch_buffer
block:block_unplug
Run Code Online (Sandbox Code Playgroud)
请在这件事上给予我帮助。
我有一个 C++ 测试程序,可以让 CPU 保持忙碌:
\n#include <cstdint>\n#include <iostream>\n\n// Linear-feedback shift register\nuint64_t lfsr1(uint64_t max_ix)\n{\n uint64_t start_state = 0xACE1u; /* Any nonzero start state will work. */\n uint64_t lfsr = start_state;\n uint64_t bit; /* Must be 16-bit to allow bit<<15 later in the code */\n\n for (uint64_t ix = 0; ix < max_ix; ++ix)\n { /* taps: 16 14 13 11; feedback polynomial: x^16 + x^14 + x^13 + x^11 + 1 */\n bit = ((lfsr >> 0) ^ (lfsr >> …Run Code Online (Sandbox Code Playgroud) 我的perf报告显示了 AT&T 语法中的所有内容:
...\n0,18 \xe2\x94\x82 pop %rax \n0,14 \xe2\x94\x82 \xe2\x86\x90 retq \n0,18 \xe2\x94\x82a9: vmovsd -0x8(%rdi,%rsi,8),%xmm0 \n0,12 \xe2\x94\x82af: pop %rax \n \xe2\x94\x82 \xe2\x86\x90 retq \n \xe2\x94\x82b1: vxorpd %xmm2,%xmm2,%xmm2 \n0,02 \xe2\x94\x82 vxorpd %xmm3,%xmm3,%xmm3 \n \xe2\x94\x82b9: vmovsd 0x8(%rdi,%rax,8),%xmm4 \n0,82 \xe2\x94\x82 vmulsd %xmm1,%xmm1,%xmm1 \n0,16 \xe2\x94\x82 vsubsd %xmm3,%xmm1,%xmm1 \n0,96 \xe2\x94\x82 vsubsd %xmm2,%xmm4,%xmm3 \n0,57 \xe2\x94\x82 vmulsd %xmm3,%xmm0,%xmm0 \n5,34 \xe2\x94\x82 vdivsd %xmm1,%xmm0,%xmm0 \n0,55 \xe2\x94\x82 vaddsd %xmm0,%xmm2,%xmm0 \n...\nRun Code Online (Sandbox Code Playgroud)\n但对我来说读这个很难,我更熟悉英特尔语法。
\n有没有办法让 perf 以 Intel 语法输出它?我尝试在谷歌上搜索手册,但没有找到任何标志来启用此模式
\n我想跟踪我的程序以了解程序的内存分配。这个想法是每当调用 malloc 时,它都会打印出带有 allocate 的调用堆栈size。这是我用来创建事件的命令:
perf probe -x /lib64/libc.so.6 'malloc allocated=-8(%bp):u64'
Run Code Online (Sandbox Code Playgroud)
但perf report要告诉我allocated这件事的记忆是不正确的。我怎样才能解决这个问题。
我认为这个问题偏移到size(-8(%bp))是不正确的。但我不知道 asm 所以我无法理解 libc 二进制文件。
更新:使用简单的程序,例如:
for (int i=0; i<10; i++)
malloc(i);
Run Code Online (Sandbox Code Playgroud)
然后我可以看到如果我用 编译的话结果是正确的O0。我编译的结果O3不正确。并用我的大程序(数十万行代码)进行编译,O0但它不能给我正确的结果。
我在这里发布了一个类似上下文的问题
在解决了一些问题后,我降低了抖动。
我将描述我的场景。
我的内核启动参数如下所示:
nmi_watchdog=0 intel_idle.max_cstate=0 processr.max_cstate=0 nohz_full=7-11 isolcpus=7-11 mce=off rcu_nocbs=7-11 nosoftlockup cpuidle.off=1 powersave=off nonmi_ipi nnwatchdog
我有一个内核模块,它负责以给定的时间间隔发送一些数据包(这里我每 1 毫秒发送一次)。
因此,我执行了以下命令来获取性能统计信息
sudo ./perf stat -a -d -I 1000 --cpu=8 taskset -c 9 ./test.sh
下面,我发布了我得到的输出的摘录。从上面的命令,我试图分析我的 CPU Core 8 的事件。
因此,通过这种方式,这些组件不应相互干扰。
5.002780500 1000.296809 cpu-clock (msec) # 1.000 CPUs utilized
5.002780500 0 context-switches # 0.000 K/sec
5.002780500 0 cpu-migrations # 0.000 K/sec
5.002780500 0 page-faults # 0.000 …Run Code Online (Sandbox Code Playgroud) 我试图了解perf记录的-c和-F选项实际上是做什么的,但是我无法解释我所看到的。我正在运行以下命令:
perf record -a -F <frequency> sleep 1
Run Code Online (Sandbox Code Playgroud)
和
perf record -a -c <count> sleep 1
Run Code Online (Sandbox Code Playgroud)
尝试不同的频率和计数值。我得到的结果 如下
在第一个表中,我设置频率,在第二个表中,设置计数。频率和计数如何影响事件数量?我认为事件的数量与频率和计数无关,但显然并非如此。性能实际上是做什么的?
我有一个特定的软件,它表现出的行为是未命中率如下所示:
L1-dcache-misses < L2-misses< L3-misses
Run Code Online (Sandbox Code Playgroud)
怎么会这样呢?
未命中率是通过perf查看重新填充计数器除以每个缓存的访问总数来计算的。