#memory #allocation #header #tracker

已撤销 rust-memory-analyzer

Rust 内存分析器

0.1.0 2022年1月20日

#100#tracker

Apache-2.0

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