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 [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