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

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

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

https://github.com/ryncsn/memstrack

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

接下来打算加上用户态的堆栈追踪,唯一问题就是追踪粒度有点大(页级别),用户层的内存分配经过一层 libc 和 page fault 机制之后这里反映可能不是很准,但也应该有一定参考意义。
3940 次点击
所在节点    分享创造
21 条回复
dexter
2020-07-30 12:14:10 +08:00
挺厉害的,star 了
koharu
2020-07-30 17:29:44 +08:00
先 start
charons
2020-07-31 08:54:58 +08:00
我先 start
lework1234
2020-07-31 11:05:23 +08:00
建议加个 github action 自动编译成包。。
mingl0280
2020-08-01 16:13:01 +08:00
-fsantize=address?
valgrind?
ryncsn
2020-08-01 23:19:44 +08:00
@mingl0280
和这两个原理和用途都不太一样,AddressSanitizer 需要重新编译,专注用户态,替换了用户态内存管理的函数,内核有 KASAN,不过也是需要重新编译内核。
Valgrind 也是专注用户态,需要用 valgrind 启动程序,把整个程序跑在沙盒里检测内存使用。

这个工具是用的 kernel 里的 tracing, 主要是 perf 和 tracepoint,主要追踪内核态。也能通过 page fault 和 stacktrace 看用户态的使用(虽然还没 implement...),不需要重新编译,也不需要重新启动任何程序,生产环境应该也可以随时跑随时关闭,就是粒度有点大... 更细粒度的追踪也可以实现,不过还在研究。
ryncsn
2020-08-01 23:34:44 +08:00
@lework1234 感谢建议,目前 Fedora 33/Fedora Rawhide 里有包,`dnf install memstrack` 即可。其他发行版需要打不同的包处理 ncurses/libc 依赖,single binary release 不太合适,有哪个发行版的需求的话可以先开个 Issue 。
ryncsn
2020-08-02 00:35:35 +08:00
@lework1234 加了个用 Github Action 的 static build release,可以尝试一下。
ryncsn
2020-08-02 01:51:16 +08:00
@ryncsn #6
还有一个很不一样的是这个只是分析内容占用,不会检查内存操作是否安全。
wxy1991
2020-08-03 11:28:34 +08:00
老哥,执行报错了,错误信息如下
Failed to open sys_exit_execve
Make sure debugfs is mounted and have the right permission
Failed initializing perf events
ryncsn
2020-08-03 11:38:54 +08:00
@wxy1991 能提供一下内核版本以及发行版信息吗?还有检查一下 mount | grep debugfs,debugfs 有没有 mount,以及位置是不是 /sys/kernel/debug 。
wxy1991
2020-08-03 13:31:36 +08:00
@ryncsn 内核信息:3.10.0-957.21.3.el7.x86_64
发行版本:CentOS Linux release 7.6.1810
mount 命令执行结果:debugfs on /sys/kernel/debug type debugfs (rw,relatime)
mingl0280
2020-08-03 16:59:15 +08:00
@ryncsn emmm 过两天我试试,如果真的好用我给公司里推荐下...我们比较缺这种东西然后我自己还没时间开发.
ryncsn
2020-08-03 22:29:32 +08:00
@wxy1991 目前还不支持 3.10 kernel,周末我看看能不能加个支持。
ryncsn
2020-08-03 22:29:55 +08:00
@mingl0280 多谢支持,有意见可以随时提出。
melovto
2020-08-03 22:39:10 +08:00
感觉不错
wxy1991
2020-08-04 09:16:20 +08:00
@ryncsn 我这边不着急,我这是自己搞着玩,今年自己买的阿里云的服务器。但是估计用户很多都是云服务,这个内核版本可能用户很多,大哥有时间还是支持下,万一被哪个公司看上了,哈哈
vzard
2020-08-04 22:48:36 +08:00
系统信息:
LSB Version: :core-4.1-amd64:core-4.1-noarch
Distributor ID: CentOS
Description: CentOS Linux release 7.6.1810 (Core)
Release: 7.6.1810
Codename: Core

源码安装报错:
rc/tui.c:26:21: 致命错误:ncurses.h:没有那个文件或目录
#include <ncurses.h>
^
编译中断。
make: *** [src/tui.o] 错误 1
ryncsn
2020-08-04 22:54:16 +08:00
@vzard 需要 ncurses-devel
zhichaoli101
2020-08-09 11:01:22 +08:00
很棒,目前正好需要

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/694173

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX