perf.dataperf 是否能够生成除偏移量之外还包含符号信息的独立文件?
默认情况下,perf report似乎根据文件可用来重建符号信息。
假设我们有一个hello.cpp文件/tmp/perftest:
#include <cstdio>
int store = 0;
int add_to_store(int x) {
store += x;
}
int main() {
for (int i = 0; i < 1000000; ++i) {
add_to_store(i);
}
printf("%d\n", store);
}
Run Code Online (Sandbox Code Playgroud)
如果你编译它(禁用优化)并运行它,你会得到一些数字
$ g++ -O0 hello.cpp
$ ./a.out
1783293664
Run Code Online (Sandbox Code Playgroud)
如果我们想记录它大部分时间都花在哪里......我们可以使用perf.
$ perf record ./a.out
1783293664
[ perf record: Woken up 1 times to write data ]
[ perf record: Captured and wrote 0.007 MB perf.data …Run Code Online (Sandbox Code Playgroud) 所以最近学习了perflinux中的命令。我决定进行一些实验,因此我创建了一个空的 C 程序并测量了运行所需的指令数:
echo 'int main(){}'>emptyprogram.c && gcc -O3 emptyprogram.c -o empty
perf stat ./empty
Run Code Online (Sandbox Code Playgroud)
这是输出:
Performance counter stats for './empty':
0.341833 task-clock (msec) # 0.678 CPUs utilized
0 context-switches # 0.000 K/sec
0 cpu-migrations # 0.000 K/sec
112 page-faults # 0.328 M/sec
1,187,561 cycles # 3.474 GHz
1,550,924 instructions # 1.31 insn per cycle
293,281 branches # 857.966 M/sec
4,942 branch-misses # 1.69% of all branches
0.000504121 seconds time elapsed
Run Code Online (Sandbox Code Playgroud)
为什么它使用这么多指令来运行一个实际上什么也不做的程序?我认为这可能是将程序加载到操作系统中所需的一些基准指令数,因此我寻找了用汇编语言编写的最小可执行文件,并且发现了一个在此处输出的 142 字节可执行文件"Hi World"(http://timelessname.txt)。 …
我正在使用有关已采取分支的性能记录收集有关英特尔的一些分析信息,并且我正在使用 -b 来利用 LBR。ARM 和 PowerPC 上有类似的支持吗?是的,我已经看到了这个: 英特尔的最后分支记录功能是英特尔处理器独有的吗?
我正在尝试学习如何在运行一些用 C 编写的基于 JNI 的共享库的 java 应用程序上使用 perf 动态跟踪。该库通过路径安装/opt/myapp/lib/libmyapp.so,然后使用选项运行-Djava.library.path=/opt/myapp/lib/。所以我运行以下命令:
root@mypc:~# perf probe -x /opt/myapp/lib/libmyapp.so --add Java_net_my_app_pollEvents0
Error: Failed to add events.
Run Code Online (Sandbox Code Playgroud)
没有任何关于错误原因的提示。如果库中不存在具有此类名称的全局函数,我将得到相应的错误描述:
root@mypc:~# perf probe -x /opt/myapp/lib/libmyapp.so --add Java_net_my_app_pollEvents1234567
Probe point 'Java_net_my_app_pollEvents1234567' not found.
Error: Failed to add events.
Run Code Online (Sandbox Code Playgroud)
任何人都可以提示如何解决这个问题吗?我尝试添加一个malloc函数探针,它工作得很好:
root@mypc:~# perf probe -x /lib/x86_64-linux-gnu/libc-2.27.so --add malloc
Added new event:
probe_libc:malloc (on malloc in /lib/x86_64-linux-gnu/libc-2.27.so)
You can now use it in all perf tools, such as:
perf record -e probe_libc:malloc -aR sleep 1
Run Code Online (Sandbox Code Playgroud) 我想知道如何在 Mac 上获取性能监控计数器测量值。在 Linux 中,我们可以使用“perf stat”命令来获取测量结果。使用 Mac 就更难了。具体来说,我想知道如何获得从命令行运行的程序的分支错误预测数量和执行的分支数量,最好不重新编译程序。我已经做了一些谷歌搜索,但我需要的是一个解决方案;如果你能告诉我如何打开终端,输入一些命令(也许使用你下载的一些工具),并获得错误预测的数量,比如 /bin/ls,那就太好了。
我正在寻找 AMD 特定的性能计数器,它可以在TLB发生未命中时对页面遍历所消耗的周期进行计数。我知道英特尔有这样的指标。
但是AMD上存在这种情况吗?我查看了http://developer.amd.com/wordpress/media/2013/12/56255_OSRR-1.pdf,但没有找到任何接近我需要的内容。
我还查看了perf源代码https://elixir.bootlin.com/linux/latest/source/arch/x86/events/amd/core.c#L248它似乎也没有。
也许它有不同的名字?有什么建议么?
我正在尝试使用 来分析给定进程中的多个线程perf。尽管下面的代码确实显示,即使ispid的参数(这应该导致对整个进程进行分析?),硬件计数器值仅对应于执行线程(与跨线程内的性能计数器求和)过程),但不被计算在内。perf_event_open0inf_loop
perf_event_open我的问题是:如何分析进程中的所有线程与仅分析如下执行的线程?是否perf_event_attr需要设置一些其他配置来启用进程范围的分析?
static long perf_event_open(struct perf_event_attr *hw_event, pid_t pid,
int cpu, int group_fd, unsigned long flags)
{
int ret;
ret = syscall(__NR_perf_event_open, hw_event, pid, cpu,
group_fd, flags);
return ret;
}
static int fd;
void setup()
{
struct perf_event_attr pe;
memset(&pe, 0, sizeof(pe));
pe.type = PERF_TYPE_HARDWARE;
pe.size = sizeof(pe);
pe.config = PERF_COUNT_HW_INSTRUCTIONS;
pe.disabled = 1;
pe.exclude_kernel = 1;
pe.exclude_hv = 1;
pid_t pid = 0;
int cpu = -1;
fd …Run Code Online (Sandbox Code Playgroud) 我有一个在 Linux 内核 4.18 和 Intel CPU 的多线程框架上运行的程序。我跑去perf record -p pid -g -e cycles:u --call-graph lbr -F 99 -- sleep 20收集堆栈跟踪并生成火焰图。
我的程序在低工作负载下运行,因此所花费的时间futex_wait是预期的。但栈顶是一个内核函数native_write_msr。根据内核中的native_write_msr 做什么?和https://elixir.bootlin.com/linux/v4.18/source/arch/x86/include/asm/msr.h#L103,该函数用于性能计数器。我已禁用 中的跟踪点native_write_msr。
并 pidstat -p pid 1告诉我系统CPU使用率相当低。
05:44:34 PM UID PID %usr %system %guest %CPU CPU Command
05:44:35 PM 1001 67441 60.00 4.00 0.00 64.00 11 my_profram
05:44:36 PM 1001 67441 58.00 7.00 0.00 65.00 11 my_profram
05:44:37 PM 1001 67441 61.00 3.00 0.00 64.00 …Run Code Online (Sandbox Code Playgroud) 最近,我发现实际上 perf (或 pprof)可能会在反汇编视图指令时序中显示在实际上没有花费这个时间的行附近。真正的指令,实际上花了这个时间,就在它之前。我知道一个模糊的解释,这是由于 CPU 中的指令流水线造成的。不过,我想了解以下内容:
我正在尝试了解LLC-prefetch-missesSandy Bridge 性能事件的含义。
从linux内核源代码我看到了事件的定义:
\n[ C(OP_PREFETCH) ] = {\n [ C(RESULT_ACCESS) ] = SNB_DMND_PREFETCH|SNB_L3_ACCESS,\n [ C(RESULT_MISS) ] = SNB_DMND_PREFETCH|SNB_L3_MISS,\n},\nRun Code Online (Sandbox Code Playgroud)\n其中:\nSNB_DMND_PREFETCH = (SNB_PF_DATA_RD|SNB_PF_RFO)指向事件寄存器的位 4-5,而\nSNB_L3_MISS = (SNB_DRAM_ANY|SNB_NON_DRAM)指向事件寄存器的位 22-36。
阅读Intel\xc2\xae 64 and IA-32 Architectures Software Developer\xe2\x80\x99s Manual,第 3 卷,第 18.3.4.5 章,我发现:
\nSNB_DMND_PREFETCH代表事件寄存器的“Request_Type”字段和SNB_L3_MISS“Response_Type”字段MSR_OFFCORE_RSP_x
要求:
\n\n回复:
\n\n但是,我无法理解预取上下文中“响应”的含义。
\n此外,我在一些课程幻灯片中发现了这个定义:
\nPrefetch Hit: Prefetched line that was hit in …