diff --git a/memory/replace/logalloc/README b/memory/replace/logalloc/README index c2e8cf66cef0..45ad6e4560e5 100644 --- a/memory/replace/logalloc/README +++ b/memory/replace/logalloc/README @@ -93,3 +93,8 @@ through a different allocator. For example: Will replay the log against jemalloc4 (which is, as of writing, what libreplace_jemalloc.so contains). + +The log files can also be used for other analysis. The logalloc_stats.py +script will tally the allocation requests for small, large and huge +allocations (as configured on a system with 4KiB pages). + diff --git a/memory/replace/logalloc/replay/logalloc_stats.py b/memory/replace/logalloc/replay/logalloc_stats.py new file mode 100755 index 000000000000..a6eeaffb5445 --- /dev/null +++ b/memory/replace/logalloc/replay/logalloc_stats.py @@ -0,0 +1,60 @@ +#!/usr/bin/python3 +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + + +import sys + +from logalloc_munge import split_log_line + + +def get_size(line): + try: + pid, tid, func, args, result = split_log_line(line) + if func == "malloc": + return int(args[0]) + elif func == "calloc": + return int(args[0]) * int(args[1]) + elif func == "memalign": + return int(args[1]) + elif func == "realloc": + return int(args[1]) + else: + return None + except Exception: + return None + + +def main(): + small = 0 + large = 0 + huge = 0 + + for line in sys.stdin: + size = get_size(line.strip()) + if not size: + continue + + # Assumes a 4KiB page size, which is not true on Apple Silicon and + # some other platforms. + if size < 4096: + small += 1 + elif size < 1024 * 1024: + large += 1 + else: + huge += 1 + + total = small + large + huge + + def print_percent(name, value): + pct = 100 * value / total + print(f"{name:<5}: {value:>12,} {pct:6.2f}%") + + print_percent("Small", small) + print_percent("Large", large) + print_percent("Huge", huge) + + +if __name__ == "__main__": + main()