From: Alireza Haghdoost via B4 Relay <devnull+haghdoost.uber.com@kernel.org>
To: Peter Zijlstra <peterz@infradead.org>,
Ingo Molnar <mingo@redhat.com>,
Arnaldo Carvalho de Melo <acme@kernel.org>,
Namhyung Kim <namhyung@kernel.org>,
Mark Rutland <mark.rutland@arm.com>,
Alexander Shishkin <alexander.shishkin@linux.intel.com>,
Jiri Olsa <jolsa@kernel.org>, Ian Rogers <irogers@google.com>,
Adrian Hunter <adrian.hunter@intel.com>,
James Clark <james.clark@linaro.org>,
Andrii Nakryiko <andriin@fb.com>,
Alexei Starovoitov <ast@kernel.org>
Cc: linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org,
Alireza Haghdoost <haghdoost@uber.com>
Subject: [PATCH 0/4] perf script: Bounded and lazy symbol loading
Date: Tue, 15 Sep 2026 11:42:42 -0700 [thread overview]
Message-ID: <20260915-perf-symbol-memory-send-v1-0-1d3360e21f07@uber.com> (raw)
perf script loads the entire ELF symbol table of every DSO that appears
in a sample, allocating each symbol into an rb-tree held until process
exit. Therefore, a large enough profile turns symbol loading into an OOM kill.
This is not scalable for profiling a large cgroup with a lot of large
binaries on a production system with limited free memory.
This series adds two independent, opt-in mechanisms and a leading
regression fix they build on:
[1/4] Fix a broken "#ifdef ELF_C_READ_MMAP" guard so perf actually
mmaps ELF files instead of malloc'ing section data. This is a
standalone regression fix introduced by 22dd1ac91a77.
[2/4] --max-symbol-bytes <size>: a byte budget on struct symbol
allocations (and the lazy index) enforced at the ELF symbol
loader, degrading to [unknown] with a warning past the cap.
An unbounded profile doesn't just risk OOM-killing itself. It
also forces memory pressure on the whole host, pushing the kernel
to reclaim from co-located latency-sensitive processes. Capping
it lets the user bound that footprint up front and choose the
trade-off explicitly.
[3/4] --lazy-load-symbols: build a compact per-DSO sorted index and
resolve only the sampled addresses, reading names via pread()
from the file's string table at lookup time. On the production fixture,
peak RssAnon drops from 265 MiB to 39 MiB (6.8x) and wall time
from 3.1 s to 1.85 s (1.7x). Memory optimizations usually cost
time; this one does not because lazy loading skips a lot of calloc and
demangle calls. The output is byte-identical to the default loader.
[4/4] Documentation and a shell test.
Signed-off-by: Alireza Haghdoost <haghdoost@uber.com>
---
Alireza Haghdoost (4):
perf symbols: Fix broken ELF_C_READ_MMAP fallback guard
perf script: Add --max-symbol-bytes to bound ELF symbol memory
perf script: Add --lazy-load-symbols for lazy symbol loading
perf script: Document and test --lazy-load-symbols and --max-symbol-bytes
tools/perf/Documentation/perf-script.txt | 24 +
tools/perf/builtin-script.c | 33 ++
tools/perf/tests/shell/script_lazy_load_symbols.sh | 120 +++++
tools/perf/util/dso.c | 10 +
tools/perf/util/dso.h | 29 ++
tools/perf/util/map.c | 9 +-
tools/perf/util/symbol-elf.c | 561 +++++++++++++++++++++
tools/perf/util/symbol-minimal.c | 11 +
tools/perf/util/symbol.c | 87 +++-
tools/perf/util/symbol.h | 18 +-
tools/perf/util/symbol_conf.h | 2 +
11 files changed, 875 insertions(+), 29 deletions(-)
---
base-commit: aa18964dd64511305de0711fed912054da6f5d18
change-id: 20260915-perf-symbol-memory-send-e7cfca1ac3d9
Best regards,
--
Alireza Haghdoost <haghdoost@uber.com>
next reply other threads:[~2026-09-15 18:43 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-15 18:42 Alireza Haghdoost via B4 Relay [this message]
2026-09-15 18:42 ` [PATCH 1/4] perf symbols: Fix broken ELF_C_READ_MMAP fallback guard Alireza Haghdoost via B4 Relay
2026-09-15 18:42 ` [PATCH 2/4] perf script: Add --max-symbol-bytes to bound ELF symbol memory Alireza Haghdoost via B4 Relay
2026-09-17 6:53 ` Namhyung Kim
2026-09-19 18:37 ` Alireza Haghdoost
2026-09-15 18:42 ` [PATCH 3/4] perf script: Add --lazy-load-symbols for lazy symbol loading Alireza Haghdoost via B4 Relay
2026-09-17 7:24 ` Namhyung Kim
2026-09-19 23:22 ` Alireza Haghdoost
2026-09-15 18:42 ` [PATCH 4/4] perf script: Document and test --lazy-load-symbols and --max-symbol-bytes Alireza Haghdoost via B4 Relay
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260915-perf-symbol-memory-send-v1-0-1d3360e21f07@uber.com \
--to=devnull+haghdoost.uber.com@kernel.org \
--cc=acme@kernel.org \
--cc=adrian.hunter@intel.com \
--cc=alexander.shishkin@linux.intel.com \
--cc=andriin@fb.com \
--cc=ast@kernel.org \
--cc=haghdoost@uber.com \
--cc=irogers@google.com \
--cc=james.clark@linaro.org \
--cc=jolsa@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-perf-users@vger.kernel.org \
--cc=mark.rutland@arm.com \
--cc=mingo@redhat.com \
--cc=namhyung@kernel.org \
--cc=peterz@infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®