hi,
while playing with perf daemon support I realized I need
the build id data in mmap events, so we don't need to care
about removed/updated binaries during long perf runs.

This RFC patchset adds new mmap3 events that copies mmap2
event and adds build id in it. It makes mmap3 the default
mmap event for synthesizing kernel/modules/tasks and adds
some tooling enhancements to enable the workflow below.

Note that the build id retrieval code is stolen from bpf
code, where it's been used (together with file offsets)
to replace IPs in user space stack traces. It's now added
under lib directory.


On recording server:

  - on the recording server we can run record with -B option to
    skip build id scan:

    # perf record -B
    ^C[ perf record: Woken up 1 times to write data ]
    [ perf record: Captured and wrote 4.462 MB perf.data ]

    # find ~/.debug
    find: ‘/root/.debug’: No such file or directory

    # perf report
    ...
      97.93%  swapper          [kernel.kallsyms]           [k] native_safe_halt
       0.18%  sshd             [kernel.kallsyms]           [k] avtab_search_node
       0.14%  swapper          [kernel.kallsyms]           [k] __do_softirq
       0.05%  swapper          [kernel.kallsyms]           [k] 
_raw_spin_unlock_irqrestore
       0.03%  swapper          [kernel.kallsyms]           [k] 
finish_task_switch

  - display used/hit build ids:

    # perf buildid-list | head -5
    439fe9bdeaed66af2bb8b8de5e650d5ecc3d8d46 [kernel.kallsyms]
    23b87f5b0560481043257e82be670bc97786a171 
/lib/modules/5.9.0-0.rc3.1.mmap3.fc34.x86_64/kernel/net/ipv4/netfilter/ip_tables.ko.xz
    d2b3be372bcdd4ebc15e479d2ff803657de0fd1e 
/lib/modules/5.9.0-0.rc3.1.mmap3.fc34.x86_64/kernel/drivers/block/virtio_blk.ko.xz
    1466a71bcd0ff5c975ee79b72752137c0143d225 
/lib/modules/5.9.0-0.rc3.1.mmap3.fc34.x86_64/kernel/fs/xfs/xfs.ko.xz
    ad60d10b38c93bd8738d5aa594e240f01bb328cd /usr/lib/systemd/systemd

  - store build id binaries into build id cache:

    # perf buildid-list --store | head -5
    OK   439fe9bdeaed66af2bb8b8de5e650d5ecc3d8d46 [kernel.kallsyms]
    OK   23b87f5b0560481043257e82be670bc97786a171 
/lib/modules/5.9.0-0.rc3.1.mmap3.fc34.x86_64/kernel/net/ipv4/netfilter/ip_tables.ko.xz
    OK   d2b3be372bcdd4ebc15e479d2ff803657de0fd1e 
/lib/modules/5.9.0-0.rc3.1.mmap3.fc34.x86_64/kernel/drivers/block/virtio_blk.ko.xz
    OK   1466a71bcd0ff5c975ee79b72752137c0143d225 
/lib/modules/5.9.0-0.rc3.1.mmap3.fc34.x86_64/kernel/fs/xfs/xfs.ko.xz
    OK   ad60d10b38c93bd8738d5aa594e240f01bb328cd /usr/lib/systemd/systemd

    # find ~/.debug | head -5
    /root/.debug
    /root/.debug/[kernel.kallsyms]
    /root/.debug/[kernel.kallsyms]/439fe9bdeaed66af2bb8b8de5e650d5ecc3d8d46
    
/root/.debug/[kernel.kallsyms]/439fe9bdeaed66af2bb8b8de5e650d5ecc3d8d46/kallsyms
    
/root/.debug/[kernel.kallsyms]/439fe9bdeaed66af2bb8b8de5e650d5ecc3d8d46/probes

  - run debuginfod daemon to provide binaries to another server (below)

    # debuginfod -F /


On another server:

  - copy perf.data from 'record' server and run:

    $ find ~/.debug/
    find: ‘/home/jolsa/.debug/’: No such file or directory

    $ perf buildid-list | head -5
    No kallsyms or vmlinux with build-id 
439fe9bdeaed66af2bb8b8de5e650d5ecc3d8d46 was found
    439fe9bdeaed66af2bb8b8de5e650d5ecc3d8d46 [kernel.kallsyms]
    23b87f5b0560481043257e82be670bc97786a171 
/lib/modules/5.9.0-0.rc3.1.mmap3.fc34.x86_64/kernel/net/ipv4/netfilter/ip_tables.ko.xz
    d2b3be372bcdd4ebc15e479d2ff803657de0fd1e 
/lib/modules/5.9.0-0.rc3.1.mmap3.fc34.x86_64/kernel/drivers/block/virtio_blk.ko.xz
    1466a71bcd0ff5c975ee79b72752137c0143d225 
/lib/modules/5.9.0-0.rc3.1.mmap3.fc34.x86_64/kernel/fs/xfs/xfs.ko.xz
    ad60d10b38c93bd8738d5aa594e240f01bb328cd /usr/lib/systemd/systemd

  - report does not show anything (kernel build id does not match):

    $ perf report --stdio
    ...
      97.93%  swapper          [kernel.kallsyms]           [k] 
0xffffffffa8b859be
       0.14%  swapper          [kernel.kallsyms]           [k] 
0xffffffffa8e00074
       0.11%  sshd             [kernel.kallsyms]           [k] 
0xffffffffa855b283
       0.05%  swapper          [kernel.kallsyms]           [k] 
0xffffffffa8b85d31
       0.03%  swapper          [kernel.kallsyms]           [k] 
0xffffffffa810a220

  - store does not work, existing binaries have different build ids:

    $ perf report --store | head -5
    No kallsyms or vmlinux with build-id 
439fe9bdeaed66af2bb8b8de5e650d5ecc3d8d46 was found
    FAIL 439fe9bdeaed66af2bb8b8de5e650d5ecc3d8d46 [kernel.kallsyms]
    FAIL 23b87f5b0560481043257e82be670bc97786a171 
/lib/modules/5.9.0-0.rc3.1.mmap3.fc34.x86_64/kernel/net/ipv4/netfilter/ip_tables.ko.xz
    FAIL d2b3be372bcdd4ebc15e479d2ff803657de0fd1e 
/lib/modules/5.9.0-0.rc3.1.mmap3.fc34.x86_64/kernel/drivers/block/virtio_blk.ko.xz
    FAIL 1466a71bcd0ff5c975ee79b72752137c0143d225 
/lib/modules/5.9.0-0.rc3.1.mmap3.fc34.x86_64/kernel/fs/xfs/xfs.ko.xz
    FAIL ad60d10b38c93bd8738d5aa594e240f01bb328cd /usr/lib/systemd/systemd

  - instruct debuginfo client to download them (modules retrieval does not work 
yet for some reason):

    $ DEBUGINFOD_URLS=http://192.168.122.174:8002 perf report --store  | head -5
    No kallsyms or vmlinux with build-id 
439fe9bdeaed66af2bb8b8de5e650d5ecc3d8d46 was found
    OK   439fe9bdeaed66af2bb8b8de5e650d5ecc3d8d46 [kernel.kallsyms]
    FAIL 23b87f5b0560481043257e82be670bc97786a171 
/lib/modules/5.9.0-0.rc3.1.mmap3.fc34.x86_64/kernel/net/ipv4/netfilter/ip_tables.ko.xz
    FAIL d2b3be372bcdd4ebc15e479d2ff803657de0fd1e 
/lib/modules/5.9.0-0.rc3.1.mmap3.fc34.x86_64/kernel/drivers/block/virtio_blk.ko.xz
    FAIL 1466a71bcd0ff5c975ee79b72752137c0143d225 
/lib/modules/5.9.0-0.rc3.1.mmap3.fc34.x86_64/kernel/fs/xfs/xfs.ko.xz
    OK   ad60d10b38c93bd8738d5aa594e240f01bb328cd /usr/lib/systemd/systemd

  - and report works:

    $ perf report --stdio
    ...
      97.93%  swapper          [kernel.kallsyms]           [k] native_safe_halt
       0.18%  sshd             [kernel.kallsyms]           [k] avtab_search_node
       0.14%  swapper          [kernel.kallsyms]           [k] __do_softirq
       0.05%  swapper          [kernel.kallsyms]           [k] 
_raw_spin_unlock_irqrestore
       0.03%  swapper          [kernel.kallsyms]           [k] 
finish_task_switch

  - because we have the data in build id cache:

    $ find ~/.debug | head -10
    .../.debug
    .../.debug/home
    .../.debug/home/jolsa
    .../.debug/home/jolsa/.cache
    .../.debug/home/jolsa/.cache/debuginfod_client
    
.../.debug/home/jolsa/.cache/debuginfod_client/439fe9bdeaed66af2bb8b8de5e650d5ecc3d8d46
    
.../.debug/home/jolsa/.cache/debuginfod_client/439fe9bdeaed66af2bb8b8de5e650d5ecc3d8d46/executable
    
.../.debug/home/jolsa/.cache/debuginfod_client/439fe9bdeaed66af2bb8b8de5e650d5ecc3d8d46/executable/439fe9bdeaed66af2bb8b8de5e650d5ecc3d8d46
    
.../.debug/home/jolsa/.cache/debuginfod_client/439fe9bdeaed66af2bb8b8de5e650d5ecc3d8d46/executable/439fe9bdeaed66af2bb8b8de5e650d5ecc3d8d46/elf
    
.../.debug/home/jolsa/.cache/debuginfod_client/439fe9bdeaed66af2bb8b8de5e650d5ecc3d8d46/executable/439fe9bdeaed66af2bb8b8de5e650d5ecc3d8d46/probes


The code still needs some polishing, but I'd like to hear some
opinions on the usage workflow, so it could get adjusted early
on ;-)

For example: should we make -B default now? what about users
that expect build id cache populated? And perhaps some .perfconfig
setup possibility for debuginfod server.

Available also in:
  git://git.kernel.org/pub/scm/linux/kernel/git/jolsa/perf.git
  perf/mmap3

thanks,
jirka


Cc: Alexei Starovoitov <a...@kernel.org>
---
Jiri Olsa (26):
      bpf: Move stack_map_get_build_id into lib
      perf: Introduce mmap3 version of mmap event
      tools headers uapi: Sync tools/include/uapi/linux/perf_event.h
      perf tools: Add filename__decompress function
      perf tools: Add build_id__is_defined function
      perf tools: Add support to read build id from compressed elf
      perf tools: Add check for existing link in buildid dir
      perf tools: Use struct extra_kernel_map in 
machine__process_kernel_mmap_event
      perf tools: Try load vmlinux from buildid database
      perf tools: Enable mmap3 map event when supported
      perf tools: Add mmap3 support
      perf tools: Set build id for kernel dso objects
      perf tools: Plug in mmap3 event
      perf tools: Add mmap3 events to --show-mmap-events option
      perf tools: Synthesize proc tasks with mmap3
      perf tools: Synthesize modules with mmap3
      perf tools: Synthesize kernel with mmap3
      perf tests: Add mmap3 support for perf record test
      perf tools: Add buildid-list support for mmap3
      perf tools: Add build_id_cache__add function
      perf tools: Add machine__for_each_dso function
      perf tools: Use machine__for_each_dso in perf_session__cache_build_ids
      perf tools: Add __perf_session__cache_build_ids function
      perf tools: Add buildid-list --store option
      perf tools: Move debuginfo download code into get_debuginfo
      perf tools: Add report --store option

 include/linux/buildid.h                        |  11 +++++++
 include/uapi/linux/perf_event.h                |  27 +++++++++++++++-
 kernel/bpf/stackmap.c                          | 143 
+++--------------------------------------------------------------------------------
 kernel/events/core.c                           |  38 +++++++++++++++++-----
 lib/Makefile                                   |   3 +-
 lib/buildid.c                                  | 136 
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 tools/include/uapi/linux/perf_event.h          |  27 +++++++++++++++-
 tools/lib/perf/include/perf/event.h            |  18 +++++++++++
 tools/perf/Documentation/perf-buildid-list.txt |  12 +++++++
 tools/perf/Documentation/perf-report.txt       |   3 ++
 tools/perf/builtin-annotate.c                  |   1 +
 tools/perf/builtin-buildid-list.c              | 179 
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
 tools/perf/builtin-c2c.c                       |   1 +
 tools/perf/builtin-diff.c                      |   1 +
 tools/perf/builtin-inject.c                    |  38 ++++++++++++++++++++++
 tools/perf/builtin-kmem.c                      |   1 +
 tools/perf/builtin-mem.c                       |   1 +
 tools/perf/builtin-record.c                    |  14 +++++++++
 tools/perf/builtin-report.c                    |  19 +++++++++++
 tools/perf/builtin-script.c                    |  34 ++++++++++++++++++++
 tools/perf/builtin-trace.c                     |   1 +
 tools/perf/tests/perf-record.c                 |   7 ++++-
 tools/perf/util/build-id.c                     | 179 
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----------------------------------
 tools/perf/util/build-id.h                     |   8 +++++
 tools/perf/util/data-convert-bt.c              |   1 +
 tools/perf/util/dso.c                          |  31 +++++++++++-------
 tools/perf/util/dso.h                          |   2 ++
 tools/perf/util/event.c                        |  32 +++++++++++++++++++
 tools/perf/util/event.h                        |   5 +++
 tools/perf/util/evsel.c                        |   9 +++++-
 tools/perf/util/evsel.h                        |   1 +
 tools/perf/util/machine.c                      | 155 
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------------------
 tools/perf/util/machine.h                      |   6 ++++
 tools/perf/util/map.c                          |   8 +++--
 tools/perf/util/map.h                          |   2 +-
 tools/perf/util/mmap.c                         |   2 +-
 tools/perf/util/perf_event_attr_fprintf.c      |   1 +
 tools/perf/util/probe-event.c                  |   6 ++--
 tools/perf/util/session.c                      |  28 +++++++++++++++++
 tools/perf/util/symbol-elf.c                   |  37 ++++++++++++++++++++--
 tools/perf/util/symbol.c                       |  14 +++++++++
 tools/perf/util/synthetic-events.c             | 132 
++++++++++++++++++++++++++++++++++++++++++++++------------------------------
 tools/perf/util/tool.h                         |   1 +
 43 files changed, 1059 insertions(+), 316 deletions(-)
 create mode 100644 include/linux/buildid.h
 create mode 100644 lib/buildid.c

Reply via email to