分享一下一个可能用得上的 Linux 下的内存分析工具 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
ryncsn
V2EX    分享创造

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

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

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

    https://github.com/ryncsn/memstrack

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

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

    这个工具是用的 kernel 里的 tracing 主要是 perf 和 tracepoint,主要追踪内核态。也能通过 page fault 和 stacktrace 看用户态的使用(虽然还没 implement...),不需要重新编译,也不需要重新启动任何程序,生产环境应该也可以随时跑随时关闭,就是粒度有点大... 更细粒度的追踪也可以实现,不过还在研究。
    ryncsn
        7
    ryncsn  
    OP
       2020-08-01 23:34:44 +08:00
    @lework1234 感谢建议,目前 Fedora 33/Fedora Rawhide 里有包,`dnf install memstrack` 即可。其他发行版需要打不同的包处理 ncurses/libc 依赖,single binary release 不太合适,有哪个发行版的需求的话可以先开个 Issue 。
    ryncsn
        8
    ryncsn  
    OP
       2020-08-02 00:35:35 +08:00
    @lework1234 加了个用 Github Action 的 static build release,可以尝试一下。
    ryncsn
        9
    ryncsn  
    OP
       2020-08-02 01:51:16 +08:00
    @ryncsn #6
    还有一个很不一样的是这个只是分析内容占用,不会检查内存操作是否安全。
    wxy1991
        10
    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
        11
    ryncsn  
    OP
       2020-08-03 11:38:54 +08:00 via Android
    @wxy1991 能提供一下内核版本以及发行版信息吗?还有检查一下 mount | grep debugfs,debugfs 有没有 mount,以及位置是不是 /sys/kernel/debug 。
    wxy1991
        12
    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
        13
    mingl0280  
       2020-08-03 16:59:15 +08:00
    @ryncsn emmm 过两天我试试,如果真的好用我给公司里推荐下...我们比较缺这种东西然后我自己还没时间开发.
    ryncsn
        14
    ryncsn  
    OP
       2020-08-03 22:29:32 +08:00
    @wxy1991 目前还不支持 3.10 kernel,周末我看看能不能加个支持。
    ryncsn
        15
    ryncsn  
    OP
       2020-08-03 22:29:55 +08:00
    @mingl0280 多谢支持,有意见可以随时提出。
    melovto
        16
    melovto  
       2020-08-03 22:39:10 +08:00
    感觉不错
    wxy1991
        17
    wxy1991  
       2020-08-04 09:16:20 +08:00
    @ryncsn 我这边不着急,我这是自己搞着玩,今年自己买的阿里云的服务器。但是估计用户很多都是云服务,这个内核版本可能用户很多,大哥有时间还是支持下,万一被哪个公司看上了,哈哈
    vzard
        18
    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
        19
    ryncsn  
    OP
       2020-08-04 22:54:16 +08:00 via Android
    @vzard 需要 ncurses-devel
    zhichaoli101
        20
    zhichaoli101  
       2020-08-09 11:01:22 +08:00
    很棒,目前正好需要
    puzzle9
        21
    puzzle9  
       2022-07-28 17:33:40 +08:00
    支持下
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     956 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 22ms UTC 19:31 PVG 03:31 LAX 12:31 JFK 15:31
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86