用 free -h 命令一眼看清内存总量和占用,重点看第二行的 available 值,它才是真正可用的内存。很多人一看到 used 数值高就以为内存不足,其实是被 Linux 的缓存机制吓唬住了,下面从命令实操到排查思路,把 Linux 服务器内存这件事彻底讲透。
Linux服务器内存使用情况三个核心指标
运行 free -h 是 Linux 查看内存使用情况最直接的命令,没有之一。 它把内存显示成两行,第一行是物理内存的全局概况,第二行是带缓存的真实账目,把这两个值读明白,你就解锁了 80% 的内存诊断能力。
第一行:total、used、free、shared 怎么读
total 是内存总容量,等于机器物理内存减去系统保留部分。used 是正在被进程占用的内存,free 是完全空闲的内存,shared 是临时文件系统(如 /tmp)占用的内存,这个值通常很小,可以忽略。
业内专家指出,新手最容易犯的错误就是把第一行的 free 数字当成空余内存,如果服务器跑着 MySQL 或 Nginx,free 那一列显示 0 是常见现象,但系统依然流畅无比,核心原因就在第二行。
第二行:buff/cache 是内存吗
buff/cache 是 Linux 把空闲内存拿去当磁盘缓存了,读文件时,数据会先放进 cache,下次访问直接读内存,速度比摸硬盘快几个数量级。buff 则是块设备写入的缓冲区。这一块内存不是被白白吃掉了,它随时能被系统回收给需要的进程。
available 才是真正可用的内存
available 是第二行最重要的参数,官方定义是“无需交换即可启动新应用的内存估算值”,它包含了真实空闲内存加上可回收的缓存,判断内存够不够用,我一律看 available,如果这个值稳定在总内存的 20% 以上,说明服务器一点都不虚。
linux服务器内存占用过高怎么办?先找出内存大户
当 available 长期低于 10%,系统开始疯狂交换内存到磁盘,机器卡得像幻灯片,这时候不用猜,直接拿命令把吃内存的进程揪出来。
用 ps 命令捕获内存排行前三名
ps aux --sort=-%mem | head -5 是按内存占用排序输出进程的经典组合,第一行展示表头,紧接着的三行就是内存区的三大“毒瘤”,重点看 %MEM 列,这代表该进程占物理内存的百分比,Java 应用或数据库进程会长期霸榜。
top 与 htop 交互查看实时内存波动
top 命令进入后按 M 键可以按内存占用排序。htop 是升级版,彩色界面,能直观看到每个 CPU 核心的负载,还能直接用 F6 选择排序方式。分析内存趋势用 top -d 2,每两秒刷新一次,观察内存占用是平稳还是逐步走高。 如果内存占用像螺旋一样往上钻,那八成是代码里有内存泄漏。
用 pidstat 追踪进程历史内存峰值
pidstat -r 1 5 每秒打印一次进程的内存变化,能看出某个进程是不是在偷偷积累内存,搭配 pidstat -r -p PID 可以紧盯一个重点嫌疑进程,这个工具对付“跑着跑着内存就没了”的异常场景特别顺手。
缓存为什么占满了内存?这其实是个好信号
缓存占用高不代表有问题,恰恰说明服务器在努力加速。Linux 的存储管理理念是“不用白不用”,空闲内存放太久不如拿来当缓存,这就是为什么要用 available 而非 free 来判断内存状态。
什么时候才需要手动清理缓存
手动清理是下策,只有因为缓存导致问题的时候才值得动手,比如跑了内存压力测试,或者用缓存占位验证业务逻辑时。sync && echo 3 > /proc/sys/vm/drop_caches 是清缓存的标准写法,需要 root 权限。普通场景千万别在业务高峰期清缓存,数据全写到磁盘上,性能反而会断崖下跌。
正确看待缓存占比的参考值
很多云服务器厂商的监控面板里,used 数值标得很高,看着吓人,其实里面躺着一大片缓存,判断规则很简单:available 够用,就别理 used,比如说,一台 16G 内存的服务器,used 显示 14G,但 available 还有 6G,这完全是健康状态,无脑加内存反而是浪费。
怎么持续查看 Linux 服务器内存使用情况:从命令到脚本
一次性的内存快照只能反映当下瞬间,排查问题时需要连续观察,最简单的连续监控工具是 watch。
用 watch 命令循环刷新内存快照
watch -n 3 free -h 会每隔 3 秒自动刷新一次内存数据,把 free -h 的输出固定在屏幕上,你盯着看一分钟,就能摸清内存是稳定还是持续在掉。平时排查不通畅的服务器,我都会开两个窗口,一个跑 watch free,一个跑操作方法,这样内存变化和系统反应能对上号。
写一个轻量级内存监控脚本做日志记录
愿意折腾的话,可以用 shell 脚本把内存数据落盘带上时间戳。
#!/bin/bash while true; do date >> /var/log/mem_usage.log free -m | grep Mem >> /var/log/mem_usage.log sleep 60 done
然后扔到后台跑,出了事故翻日志就能定位到几点几分内存被掏空,这个脚本日志是纯文本,格式化好之后可以直接丢给监控软件读。
借助云端监控面板观察历史曲线
如果服务器是在常见云厂商买的,控制台自带的监控图表就能显示内存曲线,通常有 1 小时、1 天、7 天粒度。历史曲线是判断内存瓶颈的利器,比如你是白天流量大内存高,还是早上定期任务触发时内存飙升,一看便知。
遇到linux服务器内存不足怎么排查?按照这个顺序来
内存不足的表现是网站变慢、服务被杀进程(MySQL 直接挂掉),遇到这种情况,千万别直接重启,按下面的顺序稳步排查。
第一步:确认交换分区是否在兜底
先用 free -h 看 swap 这行的 used 值。swap 的 used 数值明显上涨,说明物理内存扛不住了,系统开始拿磁盘内存当替换品,这时机器性能会大幅缩水。 查看 swap 使用情况是判断内存不足的“金标准”,swap 飙红往往意味着物理内存告急。
第二步:按进程定位占用并评估合理性
接着用 ps aux --sort=-%mem | head -10 找出排前面的进程,评估一下:是正常业务增长,还是某个进程的异常波动,Java 的堆内存设置得比物理内存还大,那出事是必然的,治理思路是调整应用的内存配置参数,而不是简单杀死进程。
第三步:检查是否存在内存泄漏和错配
如果某个进程的内存占用伴随时间缓慢爬升,重启后才降下去,那基本能确认有内存泄漏,这类问题通常要改代码,或者升级应用版本,还有一类常见坑是数据库的缓存参数设置不当,InnoDB buffer pool 配置占满了机器内存,需要根据业务量调整 my.cnf 里的相关参数。
那些 Linux 运维新手常踩的内存坑
聊到内存,有些坑是反复出现的,值得单列出来提醒一下,它们看起来不像内存问题,但本质上全是内存惹的祸。
- OOM Killer 杀进程:日志里出现
Out of memory: Kill process,这是内核的自我保护机制,物理内存耗尽后就挑个进程杀掉,排查时不仅看free -h,还要检查/var/log/messages里的内核日志。 - 过度配置交换分区:swap 设太大,进程濒死还能硬撑着,反而掩盖了业务异常,对于多数云服务器,swap 设到 2G 就够了。
- 用
uptime看平均负载却忽略内存:负载高有时候不是 CPU 忙,而是内存紧张导致频繁换页,磁盘 I/O 跟着上去了,查负载异常时要连带内存一起验证。
Q&A:Linux 服务器内存查看的常见问题
Q1:为什么 free -h 显示内存还有很多,但应用就是反应很慢?
A1:慢的根源未必是内存容量,可能是 CPU 打满或者磁盘 I/O 瓶颈,内存充足时优先看 top 里的 %wa 值,如果这个数值偏高,说明磁盘读写卡住了,内存再多也无济于事。
Q2:linux 服务器查看内存使用情况命令很多,生产环境最实用的是哪几个?
A2:free -h 看整体库存,ps aux --sort=-%mem 看进程占用,pidstat -r 看历史趋势,vmstat 1 看内存和 CPU 联动,这四个命令组合覆盖 90% 的内存查看场景。
Q3:clean 缓存后 available 会变大吗?
A3:clean 缓存后 available 的短期变化不大,因为可回收的缓存原本就计入 available,清理缓存只会降低 used 数值,但不会额外增加可用内存的量,在可用内存紧张时,系统本来就会自动回收,手动干预收益甚微。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/787765.html


