#malloc #profiler #profile #frequency #memory #applications #malloc-freq

lib_malloc_freq

通过 LD_PRELOAD 使用 malloc 频率分析器 (malloc_freq)

3 个版本

0.1.2 2021 年 8 月 3 日
0.1.1 2021 年 8 月 3 日
0.1.0 2021 年 8 月 3 日

#711 in 内存管理

MIT 许可证

28KB
482

Rust

malloc 频率分析器

此 malloc 频率分析器有助于检测执行大量内存分配的程序热点。许多小分配可能会减慢您的应用程序速度并导致内存碎片化。典型症状包括在应用程序的 CPU 配置文件顶部看到 malloc,以及观察到应用程序的常驻集大小(RSS)显著超过其从堆中分配的内存量。

注意:与像 valgrindmassif 这样的堆分析器不同,malloc_freq 在两个方面不同。首先,堆分析器忽略对堆大小影响不大的短生命周期的分配。其次,堆分析器跟踪分配的内存量,而 malloc_freq 关注对 malloc 的调用次数。

malloc_freq 可用于分析 Rust 或任何其他编译语言的程序。

在 Rust 程序中启用 malloc_freq

要在 Rust 程序中启用 malloc_freq,将其配置为全局分配器,而不是 std::alloc::System

use malloc_freq::ProfAllocator;

#[global_allocator]
static GLOBAL: ProfAllocator = ProfAllocator;

fn main() {}

通过 LD_PRELOAD 使用 malloc_freq

对于其他语言编写的程序,包括 Rust、C 等语言的混合程序,请使用配套的 lib_malloc_freq crate,该 crate 生成一个动态库,可用于通过 LD_PRELOAD 拦截程序发出的所有 malloc 调用

LD_PRELOAD=libmalloc_freq.so ./my_program

查看 malloc_freq 配置文件

程序成功终止后,malloc_freq会将内存分配配置存储在malloc_freq.<pid>目录下。该目录将为程序中的每个线程包含一个文件。要查看配置,请使用此crate中的mf_print工具,例如:

mf_print --dir malloc_freq.<pid> --threshold 0.2

其中--threshold开关指定了配置条目的重要性阈值(百分比,配置条目中少于threshold%的malloc调用在输出中将被跳过)。mf_print输出一个可读性强的配置,列出了执行malloc调用的程序调用栈,并附有每个调用栈的malloc调用次数和分配的总字节数。

安装

安装mf_print可执行文件

cargo install malloc_freq

要通过global_allocator属性在您的Rust程序中使用malloc_freq,只需将其作为依赖项包含在您的Cargo.toml

[dependencies]
malloc_freq = "0.1"

要通过LD_PRELOAD使用malloc_freq,您需要下载并构建此存储库

git clone [email protected]:ryzhyk/malloc_freq.git
cd malloc_freq
cargo build --release --all

使用编译后的target/release/libmalloc_freq.so库,并使用LD_PRELOAD,如上所述。

待办事项

  • 在程序异常终止时生成配置(例如,panic或SIGKILL)。

  • 降低开销的子采样。malloc_freq可能会显著减慢目标程序,因为它目前拦截所有malloc调用并将它们的堆栈跟踪记录在配置中。


lib.rs:

malloc_freq的配套crate。该crate编译成一个动态库,可以通过LD_PRELOAD加载以拦截程序发出的malloc调用,并将它们重定向到malloc_freq分析器。

依赖项

~5.5–8MB
~152K SLoC