0.1.0 |
|
---|
#100 在 #tracker
34KB
665 行
开发用于测量混合 Rust/C++ 代码项目中内存使用情况的工具,同时最小化性能/内存开销。
目标
- 追踪大型 Rust 项目的内存使用/泄漏,其中内存泄漏可能无处不在:例如,应用程序本身、数百个导入的 Rust 库或甚至链接的 C/C++ 代码。
- 低性能开销 - 现有的工具如 Valdrid 可以将程序速度减慢 25-50 倍,使用这种方法将是不切实际的。
- 低内存开销 - 在堆上为每个内存分配额外添加 32 字节头部。虽然当需要时很容易向机器添加额外的内存,但添加额外的 CPU 内核不会帮助限制单核性能的应用程序。如果需要,可以通过减少头部大小或对小分配进行随机抽样来优化。
- 能够在进程运行时而不影响它的情况下转储内存。
要求
- Linux 操作系统 -
dump
脚本使用 linux proc 文件系统来读取进程信息。如果将来需要,可以扩展到其他平台。
设计
Rust 分配代理:通过添加代理来追踪 Rust 分配,该代理使用 jemalloc 并为所有分配添加 32 字节头部。见 https://doc.rust-lang.net.cn/std/alloc/trait.GlobalAlloc.html
C 分配代理:通过覆盖 malloc/free 等 dynamic 链接来追踪 C 分配。可以通过在运行可执行文件时提供环境变量来覆盖,例如运行 `LD_PRELOAD=./mtrace.so path`。
dump
脚本
- 从
/proc/<PID>/smaps
读取进程内存映射。 - 它能够通过从
/proc/<PID>/pagemap
读取来识别哪些页面是存在的。 - 它使用
/proc/<PID>/pagemap
读取内存。 - 读取内存后,可以通过查找头部中的一部分
MAGIC
关键字来识别 Rust/C 代码分配的内存区域。
核心工具在 dump.cpp
文件中。它转储程序内存并打印内存统计信息。
模块
- 在
near-rust-allocator-proxy
文件夹中的near-rust-allocator-proxy
- 在
near-dump-analyzer
文件夹中的near-c-allocator-proxy.c
中的near-c-allocator-proxy
- 在
near-dump-analyzer
文件夹中的dump.cpp
中的near-dump-analyzer
依赖项
~11MB
~206K SLoC