yqzhang/Nerve

Basic PMU profiling by PID

Closed this issue · 3 comments

Given a list of PIDs and a list of PMU events, profile their values in the past time interval.

Put this here before we forget, the libpfm does not work well initializing the file descriptors for zombie processes.

I tested the code on the server, and it seems the function always fails after 3 iterations. Here is the dump from gdb.

Program received signal SIGSEGV, Segmentation fault.
__GI___libc_free (mem=0x15) at malloc.c:2970
2970    malloc.c: No such file or directory.
(gdb) bt
#0  __GI___libc_free (mem=0x15) at malloc.c:2970
#1  0x00007ffff7ad88aa in pfm_perf_terminate (this=0x7ffff7dd07e0) at pfmlib_perf_event_pmu.c:793
#2  0x00007ffff7ad46c6 in pfm_terminate () at pfmlib_common.c:795
#3  0x00000000004037b8 in get_pmu_sample (process_info_list=0x7fffffff0640, events=0x6061a0, sample_interval=1000000) at pmu_sample.c:186
#4  0x0000000000401395 in main (argc=1, argv=0x7fffffffe768) at main.c:101

There is an issue with multi-threaded / multi-processed workloads, that the inherit flag can only work when the new threads or processes are invoked during profiling. For example, if a fork() happens at time t_0, we are not able to get the PMU profiling of the child process at a later time t_1 due to the fact that we are creating new fds every sample interval.

However, it seems perf stat works fine in this case, so maybe we can look into their implementation.