别再只用free了!openEuler上这5个命令让你把内存‘看透’
别再只用free了openEuler上这5个命令让你把内存‘看透’在Linux系统运维和性能调优中内存管理一直是核心课题。很多工程师习惯性地使用free -m命令查看内存情况但实际上这就像用体温计测量整个身体的健康状况——只能得到一个粗略的指标。特别是在openEuler这样的企业级平台上面对复杂的内存泄漏、缓存异常或OOM killer触发等问题时我们需要更精密的内存诊断工具包。本文将带你深入openEuler内存分析的五种武器top、free、pmap、ps和/proc/meminfo。不同于简单的命令罗列我们会从实际排查场景出发分析每个工具的最佳使用时机和局限最终形成一套组合拳式的分析方法。无论你是需要快速定位内存泄漏进程还是分析共享内存使用情况都能找到对应的解决方案。1. 全局视角free与/proc/meminfo的黄金组合free命令确实是内存分析的起点但大多数人只停留在free -m的层面。在openEuler上结合/proc/meminfo能获得更全面的内存画像# 显示人类可读格式并包含详细统计 free -h --wide关键指标解读available真正可用的内存比free更准确buff/cache内核用于缓存和缓冲的内存可回收部分但free有个致命缺陷——它无法区分哪些缓存是活跃的。这时就需要/proc/meminfo# 筛选关键指标 grep -E MemTotal|MemFree|MemAvailable|Active|Inactive|SwapCached|Slab /proc/meminfo重要对比项指标free命令对应项实际含义差异MemAvailableavailable包含可回收缓存的更精确估计Active(file)buff/cache真正活跃的文件缓存Inactive(file)buff/cache可能被回收的文件缓存SReclaimablebuff/cache可回收的Slab内存提示当free显示内存不足但MemAvailable还充足时说明系统缓存机制工作正常无需立即干预。2. 进程级分析top与ps的动静结合对于运行中的进程我们需要动态和静态两种视角2.1 top的动态监控艺术# 按内存排序并显示完整命令行 top -o %MEM -c进阶技巧按E切换内存单位从KB到PB按e切换进程列表中的单位-p PID1,PID2监控特定进程但top的%MEM计算是基于总物理内存的在有大内存机器上可能失真。这时应该关注RES绝对值# 只显示内存相关列 top -o %MEM -c -n 1 | awk {print $1,$6,$10,$12} | head2.2 ps的精准快照当需要记录内存状态或分析瞬时问题时ps更合适# 按RSS排序显示前10个内存消耗进程 ps -eo pid,user,%mem,rss,comm --sort-rss | head -n 10关键字段对比字段top中对应项差异说明RSSRES完全相同物理内存使用量%MEM%MEM计算方式相同VSZVIRT虚拟内存大小包含共享库等实际案例某Java应用内存泄漏排查时通过ps定期采样发现RSS持续增长而top动态观察确认没有内存释放行为最终定位到是缓存未设置上限。3. 深度透视pmap的内存显微镜当某个进程内存异常时pmap能让我们看到内存的原子级组成# 查看进程的详细内存映射按大小排序 pmap -x PID | sort -nr -k3 | head典型输出解析Address Kbytes RSS Dirty Mode Mapping 0000555... 102400 51200 0 rw--- [anon] 00007f3... 65536 1024 512 r-x-- libc-2.28.so关键发现点巨大的[anon]映射可能是堆内存泄漏异常的[stack]增长可能预示栈溢出共享库的RSS占比过高可能需要优化加载方式在openEuler上特别有用的技巧# 统计各类内存的总使用量 pmap -x PID | awk /^total/ { print Total:, $2KB } /[heap]/ { heap$2 } END { print Heap:, heapKB } [stack] { stack$2 } END { print Stack:, stackKB } 4. 交换空间分析不只要看free交换空间使用不当会严重影响性能。除了free显示的Swap总量我们更应关注# 查看交换空间使用详情 vmstat -s | grep -i swap在openEuler上特别有用的命令# 找出正在使用swap的进程 for file in /proc/*/status; do awk /Name|Swap/{printf $2 $3}END{ print } $file 2/dev/null done | sort -k2 -n -r | head交换空间健康检查清单当si(swap in) 0时说明系统正在换入长期so(swap out) 0可能内存不足进程的VmSwap 0需要重点关注5. openEuler特色工具链补充除了通用工具openEuler还提供了一些增强工具# 内存压力测试与监控 yum install stress-ng memtester # 高级内存诊断 yum install numactlnumactl的典型应用# 查看NUMA节点内存分布 numactl -H # 在指定NUMA节点运行程序 numactl --membind1 --cpunodebind1 java -Xmx8g MyApp实战内存泄漏排查七步法结合上述工具我们形成标准排查流程全局确认free -h和vmstat 1确认是否真内存不足定位嫌疑进程top -o %MEM或ps -eo pid,%mem,cmd --sort-%mem进程内存分析pmap -x PID查看内存分布历史对比sar -r查看内存变化趋势交换空间检查cat /proc/meminfo | grep -i swapSlab分析slabtop查看内核对象使用NUMA诊断numastat查看跨节点内存访问在最近一次线上事故排查中正是通过这套方法快速定位到某个Go服务的协程泄漏——pmap显示不断增长的[anon]映射而top观察到RSS持续上升但SHR不变最终确定是channel使用不当导致的对象累积。