#header #allocator #memory #proxy #added #near #byte

near-rust-allocator-proxy

添加头部信息的Rust分配器代理

1 个不稳定版本

0.4.0 2022年1月19日
0.3.1 2021年12月25日
0.3.0 2021年10月11日
0.2.9 2021年2月23日

#26#added


2 crates 使用

Apache-2.0

17KB
306

通过为所有分配添加32字节头部来跟踪Rust内存使用情况。请参阅https://doc.rust-lang.net.cn/std/alloc/trait.GlobalAlloc.html

用法

以下代码可用来启用该库的使用

use near_rust_allocator_proxy::allocator::MyAllocator;

#[global_allocator]
static ALLOC: MyAllocator = MyAllocator;

设计

  • 头部 - 对于每次内存分配,我们添加一个32字节头部。这允许通过查看进程的内存转储来确定内存是如何分配的。
  • 每线程内存使用统计 - thread_memory_usage(tid) 方法可以用来获取线程分配的内存量
  • PRINT_STACK_TRACE_ON_MEMORY_SPIKE - 如果设置为true,当内存激增时将使用堆栈跟踪

常量

  • ENABLE_STACK_TRACE - 如果启用,每次分配时都会执行 backtrace,并将堆栈指针添加到头部
  • MIN_BLOCK_SIZE - 如果分配大小小于 MIN_BLOCK_SIZE,则只有在 SMALL_BLOCK_TRACE_PROBABILITY 百分比的时间内运行 backtrace
  • SMALL_BLOCK_TRACE_PROBABILITY - 小分配执行堆栈跟踪的概率
  • REPORT_USAGE_INTERVAL - 如果启用打印内存激增,则当内存使用超过此字节数时打印
  • PRINT_STACK_TRACE_ON_MEMORY_SPIKE - 如果为true,当给定Rust线程的内存使用超过 REPORT_USAGE_INTERVAL 时打印堆栈跟踪

头部表示

分配结构

  • magic - 唯一的8字节标识符,用于标记内存分配
  • size - 字节数
  • tid - 线程ID
  • stack - 分配时的堆栈跟踪
#[repr(C)]
struct AllocHeader {
    magic: u64,
    size: u64,
    tid: u64,
    stack: [*mut c_void; STACK_SIZE],
}

待办事项

  • 添加设置配置的方法,而不是更改常量。
  • 添加测试

依赖项

~9.5MB
~205K SLoC