linux常用内存相关命令总结


  • 查看某个pid占用物理内存的峰值
  • 查看每个node上的内存分布
    • cat /sys/device/system/node/node*/meminfo|grep Mem  
  • 内核内存泄漏常用工具
    • kmemleak
      • Kmemleak是Linux内核提供的一个内存泄漏检测工具(内核3.1.5之后得版本支持)。它通过在内核中跟踪动态分配的内存块,定期扫描内存,检测是否存在未释放的内存块。Kmemleak可以帮助定位内核中的内存泄漏问题
      • 前提条件:需要内核开启了CONFIG_DEBUG_KMEMLEAK选项(普通的 Linux 发行版,默认情况下可能没有启用 Kmemleak 功能)
      • 调试准备,加载memleak模块:sudo modprobe kmemleak(不一定可信)
      • 开启memleak扫描:echo scan > /sys/kernel/debug/kmemleak
      • 查看扫描结果:cat /sys/kernel/debug/kmemleak
        • 报告将包含未释放内存的地址、分配堆栈信息以及相关的对象和符号名称等。这些信息可以帮助你定位内存泄漏或者未释放内存的原因
      • 重置扫描结果:echo clear > /sys/kernel/debug/kmemleak
      • 注意事项:
        • 扫描时间长短取决于内核内存使用量
        • 建议在系统处于空闲状态下进行扫描操作,以减少误报和干扰

        • kmemleak只能检测到堆分配的内存泄漏,对于其他类型的资源泄漏(如文件描述符、锁等),无法提供完整的信息

        • 具体的kmemleak命令和路径可能会因Linux发行版或内核版本而有所不同,请根据你的实际情况来进行相应的调整

      • 参考链接:
    • slabtop
      • Slabtop是一个用户空间工具,用于监视和分析内核SLAB分配器的使用情况。通过运行slabtop命令,可以获得当前系统中各种SLAB缓存的信息,包括已分配和未释放的内存对象数量。通过分析这些信息,可以发现可能存在的内存泄漏问题
      • 一个Linux命令行工具,slab分配器是一种用于管理对象缓存的机制,它在内核中广泛使用;

      • 运行机制:默认情况下,slabtop会每隔五秒自动刷新一次显示的内容。可以观察对象数目和内存使用情况的变化
      • 使用方式:直接执行slabtop

      • 参数:
        • -o /--once : 只打印一次
          • slabtop -o|head -n 20:

        • -d/--delay <secs>: 更新的间隔
        • -s/--sort <char> : 排序方式
          • a:根据活跃对象个数排序
          • b:根据每个slab中的对象排序slab
          • c:根据cache大小排序slab
          • l:根据slabs个数排序
          • v:根据活跃slabs个数排序
          • n:根据名称排序
          • o:根据对象个数排序
          • p:根据每个slab的页面个数排序
          • s:根据对象大小排序
          • u:根据cache使用量排序
      • 结果查看:如缓存名称、对象数目、对象大小等。该信息将按照内存占用量进行排序,从最大的缓存到最小的缓存。
      • 值得注意的是,slabtop提供了很多选项和命令行参数,可以用于控制显示方式、排序方式和过滤条件等。可以在终端中输入 "man slabtop" 命令来查看所有可用的选项和参数以及它们的含义和使用方法。这将提供更多的功能和灵活性来满足特定需求。

    • Valgrind
      • Valgrind是一个功能强大的内存调试和性能分析工具。虽然它主要用于用户空间程序的调试,但它也可以应用于内核空间。通过在模拟执行的环境中进行内存分析,Valgrind可以帮助定位内核中的内存泄漏和其他内存错误;
      • Valgrind会在程序执行过程中对内存进行监视,并生成相应的报告。一旦程序执行完毕,Valgrind会显示报告的摘要信息,如内存泄漏数量、无效读写等。可以查看这些报告来定位问题所在。
      • 使用方式:valgrind --tool=memcheck ./your_program
      • 结果说明:根据Valgrind的报告,找到引起内存错误的代码行,并进行相应的修复。根据报告中提供的详细信息,可以确定具体的内存泄漏或错误类型,并采取适当的措施来解决问题。
      • 注意事项:Valgrind对目标程序的执行会产生一定的性能开销,并且可能会导致程序运行变慢。因此,在生产环境中一般不建议长期使用Valgrind,而是在开发和调试阶段使用它来检测内存错误。
    • AddressSanitizer
      • AddressSanitizer是一种内存错误检测工具,可以用于用户空间和内核空间的应用程序。它通过在编译时插入特殊的运行时检查代码来检测内存错误,包括内存泄漏。ASan可以帮助开发人员快速发现和修复潜在的内存问题 (会占用较多内存&影响系统性能,可作为test模式的一个编译选项,发包中一般不带)
    • kernelShark
      • KernelShark是一个用于可视化和分析Linux内核跟踪数据的工具。它可以帮助开发人员定位内存泄漏和其他性能问题,并提供图形化界面以便更好地理解内核行为(存储中使用可视化界面有点大材小用,只需要简单的跟踪即可,节省资源)
    • 基本使用
        • 安装KernelShark:首先要确保您的系统上已安装了KernelShark。你可以从官方网站(https://www.kernelshark.org/)或者通过包管理器来获取和安装KernelShark。
        • 收集内核跟踪数据:KernelShark需要分析内核跟踪数据文件,你可以使用Ftrace、perf等工具来收集内核跟踪数据。这些工具可以提供有关内核函数调用、事件持续时间等信息。
        • 打开KernelShark:打开终端并执行以下命令来启动KernelShark
        • 导入内核跟踪数据:在KernelShark界面中,选择“File”菜单,然后点击“Open Trace File”选项。浏览并选择你之前收集的内核跟踪数据文件,点击“打开”
        • 分析内核跟踪数据:一旦内核跟踪数据被导入,KernelShark将显示跟踪数据的各个事件和活动的时间线视图。你可以在此查看和分析内核调用、事件时间戳、进程切换等信息,以便深入分析内核行为和性能瓶颈。
        • 进一步探索:KernelShark提供了丰富的功能和可视化选项,例如过滤事件、搜索功能、标记重要事件等。你可以通过菜单栏和工具栏中的选项来进一步探索和定制显示方式,以满足你的分析需求。

      请注意,使用KernelShark需要一定的内核跟踪数据分析经验,并理解基本的内核概念和调试技术。此外,对于大型和复杂的内核跟踪数据,可能需要进行合适的过滤和缩放,以获得更有用和易读的结果。

      希望这些步骤对您有所帮助,让您能够开始使用KernelShark进行内核跟踪数据分析。

  • Page_owner
  • 内核内存泄漏检查
    • cat /proc/slabinfo
    •  

 

posted @ 2023-07-27 10:01  山中的宠物  阅读(212)  评论(0编辑  收藏  举报