4个版本
0.1.2 | 2021年8月3日 |
---|---|
0.1.1 | 2021年8月3日 |
0.1.0 | 2021年8月3日 |
0.1.0-alpha.2 | 2021年8月2日 |
在 内存管理 中排名第 453
26KB
477 行
Malloc频率分析器
这个malloc频率分析器有助于检测程序中的热点,这些热点执行大量的内存分配。许多小的分配可能会减慢您的应用程序并导致内存碎片化。典型症状包括在应用程序的CPU性能分析中看到 malloc
位于顶部,以及观察到应用程序的常驻集大小(RSS)显著超过它从堆中分配的内存量。
注意: malloc_freq
与 valgrind
的 massif
等堆分析器不同,它们以两种方式跟踪程序在任何给定时间点的堆使用情况。首先,堆分析器忽略了那些不会显著影响堆大小的短生命周期的分配。其次,堆分析器跟踪分配的内存量,而 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
包,该包生成一个动态库,可以通过 LD_PRELOAD
用于拦截程序发出的所有 malloc
调用
LD_PRELOAD=libmalloc_freq.so ./my_program
查看 malloc_freq
分析结果
程序成功终止后,malloc_freq
将malloc分析结果存储在 malloc_freq.<pid>
目录中。该目录将包含程序中每个线程的文件。要查看分析结果,使用此包中的 mf_print
工具,例如。
mf_print --dir malloc_freq.<pid> --threshold 0.2
其中--threshold
开关指定了配置条目在百分比中的显著性阈值(小于threshold
%的malloc
调用在输出中被跳过)。mf_print
输出一个人类可读的配置文件,列出了执行malloc
调用的程序调用栈,并附有每个调用栈的malloc
调用次数和分配的字节数总和。
安装
要安装mf_print
可执行文件
cargo install malloc_freq
要在Rust程序中通过global_allocator
属性使用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
调用并记录它们的堆栈跟踪。
依赖项
~6–8MB
~153K SLoC