内存老是爆?5个Linux内存优化命令救急
半夜又被告警叫醒,top 一看可用内存不到 100M,Swap 飙红。咱们线上这台 Web 服跑了半年一直稳,怎么突然就内存爆了?别急着重启,先搞清楚内存到底去哪了。今天掏 5 个我常年在用的命令,真出事能救命,省得你大半夜爬起来背锅。
一、先看清楚:free 不是你想的那样
很多人 free 一眼就慌,其实 CentOS 7 之后的 free 输出里,buff/cache 那部分是可以随时回收的,根本不算真缺内存。
free -h
total used free shared buff/cache available
Mem: 15Gi 8.2Gi 1.1Gi 320Mi 6.1Gi 6.3Gi
重点看 available 这一列,这才是应用真正还能拿到的内存。我们线上有台机 used 显示 14G,但 available 还有 5G,那是 buff/cache 撑着,根本不用慌。监控脚本里也该盯 available,而不是 used。把 used 当报警线,运维天天被假告警骚扰,时间久了真告警反而没人看。
二、谁在吃内存:top 和 ps 双剑合璧
free 看完用 top 按内存排序,按 Shift+M。想写进监控脚本就用批处理模式一次性快照,避免交互:
top -b -n 1 | head -20
ps -eo pid,comm,%mem,rss --sort=-%mem | head -10
曾经有次内存一路涨,top 里 Java 进程 RES 占了 11G,但 Xmx 只配了 4G。一查是堆外内存(DirectByteBuffer)没回收,GC 管不到这块。这种光看 JVM 参数是发现不了的,得从 RSS 反推。所以排内存问题,RES 比 JVM 自己报的数字更准。
三、/proc/meminfo 关键字段别忽略
想深挖,直接读 /proc/meminfo,几个字段最有用:MemAvailable 等于 free 里那列;SReclaimable 是内核可回收的 slab 内存,cache 回收时会动它;Dirty 是正在写回磁盘的脏页,积压太多说明磁盘跟不上。
grep -E "MemAvailable|SReclaimable|Dirty" /proc/meminfo
有次我们发现 SReclaimable 涨到 3G,根因是某个程序疯狂创建临时 inode,dentry 缓存堆爆。清掉那个逻辑后内存自然回落,根本不用加机器。
四、Swap 是救命绳也是陷阱
Swap 用太多说明物理内存真不够了。看 Swap 使用量,再盯换入次数:
swapon --show
cat /proc/vmstat | grep pswpin # 换入次数突增就是内存压力信号
我们一台老机器 Swap 常驻 2G,磁盘 IO 被拖死。临时收缩 swappiness 让系统优先用物理内存:
sysctl vm.swappiness=10 # 默认60,调低减少Swap依赖
echo 'vm.swappiness=10' >> /etc/sysctl.conf
注意,swappiness 调太低在内存真打满时会直接 OOM 杀进程,得配监控兜底,别一刀切。
五、oom_killer 来了怎么查
内存真打满,内核 OOM killer 会挑一个进程杀掉。看谁被杀了:
dmesg -T | grep -i "killed process"
journalctl -k | grep -i oom
踩坑实录:上次一个批处理脚本把 20G 文件一次性读进内存,直接把 MySQL 干掉。第一直觉以为是 MySQL 自己崩了要重启,其实是 OOM。根因是那个脚本没限内存。修法是用 systemd 给关键服务加内存上限:
systemctl set-property mysqld MemoryMax=8G # 给关键服务兜底,防一个进程拖垮整机
六、清缓存要慎之又慎
有人一看 buff/cache 高就 echo 3 > /proc/sys/vm/drop_caches,这等于手动制造一次卡顿,生产环境别乱来。真要清,先确认没有 IO 密集任务在跑:
sync && echo 1 > /proc/sys/vm/drop_caches # 只清 pagecache,最温和
七、长期优化几条底线
- 关键服务用
systemd 的 MemoryMax 兜底,防一个进程拖垮整机 -
- JVM 类服务算清堆内+堆外,Xmx 别配到物理内存 80%
-
- 监控盯
available 和 pswpin,而不是 used -
- 大文件处理走流式读取,别一次性 load 进内存
-
- 用完即退的定时任务加
timeout,防止异常时挂死占内存 -
你线上遇到过最离谱的内存爆掉是什么场景?是日志没轮转、还是哪个服务内存泄漏悄悄涨了一周?评论区说说你是怎么定位和收口的,咱们互相抄作业。
-
标签:#服务器运维 #Linux #运维实战 #性能优化 #排错 #内存管理
-