分享一下一个可能用得上的 Linux 下的内存分析工具

ryncsn 15天前 18

自己写这个小工具有阵子了,解决了不少工作中遇到的问题。可以做到页级别追踪内存分配,再通过堆栈统计具体使用情况,可以统计得出哪个程序哪个内核函数占用了最多的内存。并且可以分析历史最高占用和当前占用,而且没有什么库依赖,纯 C 实现。性能比 eBPF 例子中的 memleak 好一些,内存占用也比较小,很适合在资源有限的环境中使用。

也可以后台运行一段时间,收到终止信号后生成一份内存使用报告:

https://github.com/ryncsn/memstrack

已经通过这个工具修复了多个 Linux Kernel 中的相关问题,欢迎大家尝试和提建议~

接下来打算加上用户态的堆栈追踪,唯一问题就是追踪粒度有点大(页级别),用户层的内存分配经过一层 libc 和 page fault 机制之后这里反映可能不是很准,但也应该有一定参考意义。
最新回复 (9)
  • dexter 10天前
    引用 2
    挺厉害的,star 了
  • koharu 10天前
    引用 3
    先 start
  • charons 10天前
    引用 4
    我先 start
  • lework1234 10天前
    引用 5
    建议加个 github action 自动编译成包。。
  • mingl0280 10天前
    引用 6
    -fsantize=address?
    valgrind?
  • 楼主 ryncsn 10天前
    引用 7
    @mingl0280
    和这两个原理和用途都不太一样,AddressSanitizer 需要重新编译,专注用户态,替换了用户态内存管理的函数,内核有 KASAN,不过也是需要重新编译内核。
    Valgrind 也是专注用户态,需要用 valgrind 启动程序,把整个程序跑在沙盒里检测内存使用。

    这个工具是用的 kernel 里的 tracing, 主要是 perf 和 tracepoint,主要追踪内核态。也能通过 page fault 和 stacktrace 看用户态的使用(虽然还没 implement...),不需要重新编译,也不需要重新启动任何程序,生产环境应该也可以随时跑随时关闭,就是粒度有点大... 更细粒度的追踪也可以实现,不过还在研究。
  • 楼主 ryncsn 10天前
    引用 8
    @lework1234 感谢建议,目前 Fedora 33/Fedora Rawhide 里有包,`dnf install memstrack` 即可。其他发行版需要打不同的包处理 ncurses/libc 依赖,single binary release 不太合适,有哪个发行版的需求的话可以先开个 Issue 。
  • 楼主 ryncsn 10天前
    引用 9
    @lework1234 加了个用 Github Action 的 static build release,可以尝试一下。
  • 楼主 ryncsn 10天前
    引用 10
    @ryncsn #6
    还有一个很不一样的是这个只是分析内容占用,不会检查内存操作是否安全。
  • 游客
    11
返回