3 个版本
| 0.1.2 | 2021 年 8 月 3 日 |
|---|---|
| 0.1.1 | 2021 年 8 月 3 日 |
| 0.1.0 | 2021 年 8 月 3 日 |
#711 in 内存管理
28KB
482 行
malloc 频率分析器
此 malloc 频率分析器有助于检测执行大量内存分配的程序热点。许多小分配可能会减慢您的应用程序速度并导致内存碎片化。典型症状包括在应用程序的 CPU 配置文件顶部看到 malloc,以及观察到应用程序的常驻集大小(RSS)显著超过其从堆中分配的内存量。
注意:与像 valgrind 的 massif 这样的堆分析器不同,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 git@github.com: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