场景引入:
凌晨三点,服务器告警突然响起——某台线上机器内存占用飙升至95%,服务响应缓慢,你顶着困意连上SSH,却发现free -h
显示可用内存所剩无几,但top
里却没有明显异常的进程,这种情况你是否熟悉?Linux内存管理机制复杂,光看剩余内存往往会产生误导,今天我们就来聊聊如何真正读懂Linux内存使用情况,以及那些能帮你快速定位问题的神器级工具。
Linux会主动利用空闲内存做缓存(Cache)和缓冲(Buffer),通过free
命令看到的输出类似这样:
total used free shared buff/cache available Mem: 16G 5.2G 1.1G 345M 9.7G 10G Swap: 8.0G 0B 8.0G
关键指标是Available(可用内存),它=free内存+可回收的缓存,上例中虽然free仅剩1.1G,但实际可用内存高达10G,根本无需紧张。
top
的RES
列查看真实物理内存占用 free
:快速概览free -h --si # 人类可读单位(GB/MB) watch -n 2 free -h # 每2秒刷新
重点看:available
值是否持续走低,swap used
是否增长(频繁swap说明物理内存不足)
top/htop
:进程级分析按M
按内存排序进程,关注两列:
htop --tree -d 10 # 树状显示进程层级,10秒刷新
vmstat
:动态趋势vmstat 1 5 # 每秒1次,输出5次
输出示例:
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 0 742560 210384 2964236 0 0 1 4 0 0 2 1 97 0 0
关键指标:
si/so
:swap换入/换出频率(>0则预警) cache
:Page Cache大小变化 smem
:精准统计内存开销普通工具会重复计算共享库内存,smem
能显示更真实的独占内存(PSS):
smem -tk # 按进程组统计(-t),KB单位(-k)
输出示例:
PID User Command Swap USS PSS RSS
1234 mysql /usr/sbin/mysqld 0B 1.2G 1.4G 1.6G
slabtop
:揪出内核内存泄漏当free
显示内存少但top
找不到嫌疑进程时,可能是内核Slab占用异常:
slabtop -o # 按占用排序
重点关注dentry
、inode_cache
等是否持续增长不释放(常见于频繁创建/删除文件的场景)
pmap
:解剖单个进程pmap -x 1234 # 查看PID为1234的进程详细内存映射
输出会显示内存区域类型(如[heap]、[stack])和大小,适合分析Java/Python等托管语言进程的内存分布
现象:available
内存不足,但buff/cache
特别高
解决方案:手动清理缓存(生产环境慎用)
sync; echo 3 > /proc/sys/vm/drop_caches # 释放PageCache/dentries/inodes
步骤:
smem
找到内存持续增长的进程 pmap
对比该进程不同时间点的内存快照 strace
或gdb
分析可疑内存分配调用 查看系统日志找被杀掉的进程:
dmesg | grep -i "oom killer"
预防措施:调整/proc/<pid>/oom_score_adj
降低关键进程被杀的优先级
nmon
:终端里的仪表盘nmon -c 300 -s 10 -f -t # 每10秒采样,共300次,输出到文件
按m
键可切换内存监控视图,支持导出CSV分析
/proc/meminfo
等指标 Linux内存监控就像读体检报告——不能只看"剩余内存"这个单项指标,掌握smem
、slabtop
等工具的组合用法,配合对内存管理机制的理解,你就能在下次深夜告警时快速判断:这是需要立即处理的真危机,还是Linux在高效利用资源的假警报。
(本文方法基于Linux内核5.4+环境验证,工具版本更新至2025年8月)
本文由 包坚成 于2025-08-02发表在【云服务器提供商】,文中图片由(包坚成)上传,本平台仅提供信息存储服务;作者观点、意见不代表本站立场,如有侵权,请联系我们删除;若有图片侵权,请您准备原始证明材料和公证书后联系我方删除!
本文链接:https://vps.7tqx.com/wenda/515012.html
发表评论