VPS内存显示快满了要紧吗?先看available、缓存、Swap和内存压力

Linux会把空闲内存用作缓存,真正的风险信号在回收、换页、压力和OOM事件里
发布于
3

VPS执行free -h后看到used很高,不能直接得出“内存快耗尽”的结论。Linux会主动把空闲内存用于文件缓存,以减少磁盘读取;业务需要时,部分缓存可以被回收。真正需要关注的是available是否持续下降、是否频繁换页、内存压力是否升高,以及进程有没有因内存限制被回收或杀死。

free、available和buff/cache分别回答什么

free -h
grep -E 'MemTotal|MemFree|MemAvailable|Buffers|Cached|SwapTotal|SwapFree' /proc/meminfo

free表示完全未使用的内存,Linux正常运行时它可以很小。buff/cache包含用于内核和文件访问的缓存,并非全部“被应用永久占住”。available是系统在不发生明显换页的情况下,可供新应用使用的估算值,通常比只看free更有判断价值。

不过available也不是承诺值。内核版本、工作负载和容器限制都会影响解释,短时采样不能代替趋势。应与同一实例平时的业务时段比较。

四种“内存很高”需要不同处理

现象 更可能的含义 下一步
used高,available仍充足,业务正常 文件缓存或正常工作集 继续观察趋势,不急着清缓存
available持续下降,Swap换入换出增加 活跃工作集超过物理内存 定位进程增长、并发与内存泄漏
宿主机有余量,容器内频繁OOM cgroup内存上限或容器配置 检查memory.current、memory.max和memory.events
内存看似正常,业务仍停顿 回收、换页或I/O压力造成延迟 查看PSI、vmstat和磁盘延迟

“占用率达到多少必须扩容”没有通用阈值。数据库、Java服务、文件缓存和批处理的内存形态不同,扩容决策应以持续压力和业务症状为依据。

Swap用了不等于系统正在缺内存

Linux可能把长期不活跃的页面移入Swap,即使后来物理内存已经有空闲,Swap占用也不会立即归零。更重要的是当前是否持续发生换入换出:

vmstat 1 5
swapon --show

vmstat中的siso用于观察换入、换出活动。偶尔出现与持续高频不同;若它们在业务变慢时连续出现,还伴随磁盘等待,就说明内存压力已经影响响应。

不要为了让监控数字好看就随意关闭Swap。没有足够物理内存时,关闭过程可能加剧压力;是否调整Swap应结合工作集、磁盘性能、OOM风险和服务恢复要求。

怎样找到真正占内存的进程

ps -eo pid,ppid,comm,rss,vsz --sort=-rss | head
systemd-cgtop

RSS表示进程当前驻留在物理内存中的页面,但共享库可能被多个进程重复显示,简单相加可能高估。VSZ包含尚未实际驻留的虚拟地址空间,也不能直接当作物理内存消耗。

若某个进程的RSS随时间单向增长,应对照请求量、缓存项、线程数、连接池和应用自身指标。一次排序只能说明当时谁占得多,不能证明内存泄漏;至少需要同一业务负载下的连续样本。

容器里的可用内存为什么和VPS整机不同

Docker、Kubernetes或systemd服务可能受cgroup内存限制。即使free -h显示整机还有空间,某个容器达到自己的上限仍可能回收或OOM。在使用统一cgroup层级的系统中,可检查:

cat /sys/fs/cgroup/memory.current
cat /sys/fs/cgroup/memory.max
cat /sys/fs/cgroup/memory.events

实际路径会随容器和systemd单元层级变化。memory.events中的事件变化能帮助判断是否触发高水位、达到上限或发生OOM;不要只根据容器面板的一次百分比修改配额。

用内存PSI判断业务是否真的在等

cat /proc/pressure/memory

PSI记录任务因内存回收或资源压力而停顿的情况。将其与接口延迟、队列长度、vmstat换页和磁盘I/O放在同一时间轴,更容易判断内存压力是否影响业务。某个瞬时数值不能单独证明需要扩容,持续趋势和同机基线更重要。

为什么不应把“清理缓存”当成日常修复

可回收缓存本来就是Linux利用内存提升性能的机制。强行清空后,后续请求可能重新读取磁盘,带来I/O尖峰和响应抖动,却没有解决进程工作集过大、内存泄漏或容器限额问题。

除非在明确的测试或维护场景中需要控制缓存变量,否则应让内核管理缓存。生产故障先保存free/proc/meminfo、进程RSS、PSI、换页和OOM日志,再决定降低并发、修复应用、调整配额还是扩容。

什么时候扩容更有依据

  • 相同负载下available持续降低,且无法在任务结束后恢复;
  • Swap换入换出与磁盘等待长期伴随业务延迟;
  • 经过应用缓存、并发和进程泄漏治理后,工作集仍稳定超过现有容量;
  • cgroup上限是明确瓶颈,调整后整机容量也无法承载;
  • 内核或cgroup OOM事件已被日志证实,并影响关键服务。

扩容前记录峰值时段、业务吞吐和故障指标,扩容后用同一口径复测。这样才能判断增加内存是否真正减少换页、停顿和失败,而不只是让used百分比变小。

结论

VPS内存是否紧张,不能只看used或free。先看available和趋势,再检查Swap换入换出、进程工作集、cgroup事件、内存PSI与OOM记录。缓存高但业务无压力通常无需处理;持续回收、换页和服务失败才是优化或扩容的证据。

常见问题(FAQ)

Linux VPS的used内存很高是否代表内存不足?
不一定。Linux会使用空闲内存作为文件缓存,可按需回收。应结合available趋势、换页、PSI、OOM和业务延迟判断。
buff/cache占用很高需要手动清理吗?
通常不需要。缓存用于减少磁盘读取,强行清空可能带来I/O尖峰,也不会解决应用工作集过大、泄漏或容器限额问题。
Swap已经使用是否说明VPS内存不够?
不一定。长期不活跃页面进入Swap后不会立即回迁。更应观察vmstat的si和so是否持续增加,以及是否伴随磁盘等待和业务变慢。
什么时候应该给VPS扩容内存?
当available持续下降、换页和内存压力影响业务,或OOM事件已被证实,并且应用缓存、并发、泄漏和cgroup配置已经核对后,扩容更有依据。

本文由作者原创/授权发布于极跃圈(jiyueip.com)未经许可,禁止转载。题图来自Unsplash,基于CC0协议。

声明:极跃圈(JIYUEIP.com)内网友所发表的所有内容及言论仅代表其本人,并不反映任何极跃圈(JIYUEIP.com)之意见及观点。

0 讨论
热门最新
总结
暂无总结
0 / 600

1GB内存的VPS跑MySQL+PHP+Nginx,内存用满只是时间问题。加SWAP(虚拟内存)能让系统在内存不够时用磁盘当临时内存用。但它不是免费午餐——SSD的读写速度比内存慢几十倍,SWAP用多了系统卡成狗。 什么时候该加SWAP S