V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
GeekHub
ryncsn
V2EX  ›  分享创造

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

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

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

    https://github.com/ryncsn/memstrack

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

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

    这个工具是用的 kernel 里的 tracing, 主要是 perf 和 tracepoint,主要追踪内核态。也能通过 page fault 和 stacktrace 看用户态的使用(虽然还没 implement...),不需要重新编译,也不需要重新启动任何程序,生产环境应该也可以随时跑随时关闭,就是粒度有点大... 更细粒度的追踪也可以实现,不过还在研究。
    ryncsn
        7
    ryncsn   55 天前
    @lework1234 感谢建议,目前 Fedora 33/Fedora Rawhide 里有包,`dnf install memstrack` 即可。其他发行版需要打不同的包处理 ncurses/libc 依赖,single binary release 不太合适,有哪个发行版的需求的话可以先开个 Issue 。
    ryncsn
        8
    ryncsn   55 天前
    @lework1234 加了个用 Github Action 的 static build release,可以尝试一下。
    ryncsn
        9
    ryncsn   55 天前
    @ryncsn #6
    还有一个很不一样的是这个只是分析内容占用,不会检查内存操作是否安全。
    wxy1991
        10
    wxy1991   54 天前
    老哥,执行报错了,错误信息如下
    Failed to open sys_exit_execve
    Make sure debugfs is mounted and have the right permission
    Failed initializing perf events
    ryncsn
        11
    ryncsn   54 天前 via Android
    @wxy1991 能提供一下内核版本以及发行版信息吗?还有检查一下 mount | grep debugfs,debugfs 有没有 mount,以及位置是不是 /sys/kernel/debug 。
    wxy1991
        12
    wxy1991   53 天前
    @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   53 天前
    @ryncsn emmm 过两天我试试,如果真的好用我给公司里推荐下...我们比较缺这种东西然后我自己还没时间开发.
    ryncsn
        14
    ryncsn   53 天前
    @wxy1991 目前还不支持 3.10 kernel,周末我看看能不能加个支持。
    ryncsn
        15
    ryncsn   53 天前
    @mingl0280 多谢支持,有意见可以随时提出。
    melovto
        16
    melovto   53 天前
    感觉不错
    wxy1991
        17
    wxy1991   53 天前
    @ryncsn 我这边不着急,我这是自己搞着玩,今年自己买的阿里云的服务器。但是估计用户很多都是云服务,这个内核版本可能用户很多,大哥有时间还是支持下,万一被哪个公司看上了,哈哈
    vzard
        18
    vzard   52 天前
    系统信息:
    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   52 天前 via Android
    @vzard 需要 ncurses-devel
    zhichaoli101
        20
    zhichaoli101   48 天前
    很棒,目前正好需要
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2269 人在线   最高记录 5168   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 04:31 · PVG 12:31 · LAX 21:31 · JFK 00:31
    ♥ Do have faith in what you're doing.