4个版本

0.1.2 2021年8月3日
0.1.1 2021年8月3日
0.1.0 2021年8月3日
0.1.0-alpha.22021年8月2日

内存管理 中排名第 453


用于 lib_malloc_freq

MIT 许可证

26KB
477

Rust

Malloc频率分析器

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

注意: malloc_freqvalgrindmassif 等堆分析器不同,它们以两种方式跟踪程序在任何给定时间点的堆使用情况。首先,堆分析器忽略了那些不会显著影响堆大小的短生命周期的分配。其次,堆分析器跟踪分配的内存量,而 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