linux常用内存相关命令总结
- 查看某个pid占用物理内存的峰值
- cat /proc/pid/status|grep -E "VmHWM|VmRSS"
- 参考信息:(23条消息) Linux下查看某一进程占用的内存_Jeremy_Lee123的博客-CSDN博客
- 查看每个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使用量排序
- -o /--once : 只打印一次
- 结果查看:如缓存名称、对象数目、对象大小等。该信息将按照内存占用量进行排序,从最大的缓存到最小的缓存。
-
值得注意的是,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进行内核跟踪数据分析。
- kmemleak
- Page_owner
- centos7.2以及之后的版本上才能支持
- 对于linux 版本4.1.4以及之后得版本支持(不区分centos/redhad/ubuntu/方德/龙熙)
- 开启后:消耗大量内存,对性能损失较大(记录栈信息),且有误报
- 参考资料:Kernel Hacking之内核内存泄漏_page_owner_m布谷鸟的博客-CSDN博客
- 内核内存泄漏检查
- cat /proc/slabinfo
-