diff options
author | Frank Ch. Eigler <fche@elastic.org> | 2009-08-12 16:07:08 -0400 |
---|---|---|
committer | Frank Ch. Eigler <fche@elastic.org> | 2009-08-12 16:07:08 -0400 |
commit | 43241c442263dd52e34f86e2d0a64c20cd7235c3 (patch) | |
tree | 39711f175ec2dc1d712880bc5cdbf1ae22ae3f68 | |
parent | 857bdfd1bec07003d3d92aaacf6ba578057324ef (diff) | |
download | systemtap-steved-43241c442263dd52e34f86e2d0a64c20cd7235c3.tar.gz systemtap-steved-43241c442263dd52e34f86e2d0a64c20cd7235c3.tar.xz systemtap-steved-43241c442263dd52e34f86e2d0a64c20cd7235c3.zip |
PR10507: tweak heuristics for stap_uprobes[] allocation
* tapsets.cxx (uprobes::emit_module_decls): Compute MAXUPROBES
with x-treme kl3v3rn3ss.
* stap.1.in: Clarify MAXUPROBES.
-rw-r--r-- | stap.1.in | 6 | ||||
-rw-r--r-- | tapsets.cxx | 17 |
2 files changed, 15 insertions, 8 deletions
@@ -1081,9 +1081,9 @@ for the probe handler's own needs, plus a safety margin. .TP MAXUPROBES Maximum number of concurrently armed user-space probes (uprobes), default -100 times the number of user-space probe points named in the script. This -pool is large because individual uprobe objects are allocated for each -process for each script-level probe. +somewhat larger than the number of user-space probe points named in the script. +This pool needs to be potentialy large because individual uprobe objects (about +64 bytes each) are allocated for each process for each matching script-level probe. .PP With scripts that contain probes on any interrupt path, it is possible that diff --git a/tapsets.cxx b/tapsets.cxx index 9884860a..333914d0 100644 --- a/tapsets.cxx +++ b/tapsets.cxx @@ -4400,12 +4400,19 @@ uprobe_derived_probe_group::emit_module_decls (systemtap_session& s) s.op->newline() << "#define UPROBES_API_VERSION 1"; s.op->newline() << "#endif"; - s.op->newline() << "#ifndef MULTIPLE_UPROBES"; - s.op->newline() << "#define MULTIPLE_UPROBES 256"; // maximum possible armed uprobes per process() probe point - // or apprx. max number of processes mapping a shared library - s.op->newline() << "#endif"; + // We'll probably need at least this many: + unsigned minuprobes = probes.size(); + // .. but we don't want so many that .bss is inflated (PR10507): + unsigned uprobesize = 64; + unsigned maxuprobesmem = 10*1024*1024; // 10 MB + unsigned maxuprobes = maxuprobesmem / uprobesize; + + // Let's choose a value on the middle, but clamped on the minimum size + unsigned default_maxuprobes = + (minuprobes < maxuprobes) ? ((minuprobes + maxuprobes) / 2) : minuprobes; + s.op->newline() << "#ifndef MAXUPROBES"; - s.op->newline() << "#define MAXUPROBES (MULTIPLE_UPROBES * " << probes.size() << ")"; + s.op->newline() << "#define MAXUPROBES " << default_maxuprobes; s.op->newline() << "#endif"; // In .bss, the shared pool of uprobe/uretprobe structs. These are |