售前咨询400-838-0503

Linux服务器内存不足怎么办?

发布:2026-10-16 15:39

搜索全部帮助分类的文档

Linux服务器出现网站响应缓慢、程序启动失败、数据库异常退出等情况时,可以先检查内存使用情况。

判断是否缺少内存,需要结合可用内存、进程占用、交换活动和故障日志。只看到“内存使用率高”,还不能确定服务器需要扩容。

本文适用于通过SSH管理的常见Linux服务器。日志查询部分适用于使用systemd的系统,命令中的进程PID、容器名称需要替换为实际值。

1. 查看内存和Swap使用情况

Linux使用free和swapon查看服务器内存与交换空间

登录服务器后,执行:

free -h

重点查看以下字段:

字段 含义 查看重点
total 系统可使用的内存总量 确认系统识别到的容量
used 已使用或不可用的内存 不同版本的统计口径可能不同
free 完全空闲的内存 数值较低不一定代表内存不足
buff/cache 缓冲区和缓存占用 其中部分内存可以回收
available 无需交换即可供新程序使用的内存估算值 优先观察这一项
Swap 交换空间使用情况 结合交换活动判断影响

Linux会利用内存缓存文件和其他数据。因此,free较低、buff/cache较高,而available仍比较充足时,通常不需要专门清理缓存。

如果available持续偏低,同时出现页面变慢、进程退出或大量交换活动,就需要继续排查。

查看已启用的交换空间:

swapon --show

没有输出时,通常表示当前没有启用Swap。Swap已经占用一部分,也不等于服务器此刻仍在频繁交换数据。

2. 定位占用内存较高的进程

Linux使用ps和top定位内存占用较高的进程

执行以下命令,按常驻内存从高到低列出前5个进程:

ps -eo pid,user,pmem,rss,comm --sort=-rss | head -n 6

输出字段说明:

字段 含义
PID 进程编号
USER 运行该进程的用户
%MEM 常驻内存占系统物理内存的比例
RSS 当前驻留在物理内存中的进程内存,单位为KiB
COMMAND 进程名称

例如,RSS为1048576,约等于1GiB。

需要注意,多个进程可能共享部分内存,不能简单相加所有RSS来计算整台服务器的实际占用。

发现高占用进程后,查看启动参数和运行时间:

ps -p 2841 -o pid,ppid,user,etime,args

继续观察该进程:

top -p 2841

也可以直接运行top,按Shift + M按照内存占用排序,按q退出。

先确认进程属于哪个网站、数据库或后台任务,再判断占用是否符合预期。一次采样偏高,不能直接认定存在内存泄漏。

3. 判断是否正在频繁使用Swap

执行:

vmstat 1 6

该命令每秒输出一次,共输出6次。

重点关注:

字段 含义
swpd 已使用的交换空间
si 每秒从交换空间读入内存的数据量
so 每秒从内存写入交换空间的数据量
b 等待I/O完成的阻塞进程数
wa CPU等待I/O的时间比例

第一行中的交换、I/O和CPU速率通常是开机以来的平均值,后续行才反映采样间隔内的变化;进程和内存数量则是当前值。

如果连续出现明显的si或so活动,同时可用内存偏低、业务响应变慢,说明交换活动可能正在影响性能。

如果没有启用Swap,即使si和so一直为0,也不能据此排除内存不足。

4. 检查进程是否因OOM被终止

Linux使用journalctl查询OOM与进程终止日志

OOM表示内存分配遇到不足。当系统或某个受限制的进程组无法满足内存需求时,内核可能终止进程以释放资源。

查询本次启动后、最近两小时的相关内核日志:

sudo journalctl -k -b --since "-2h" --no-pager | \
  grep -Ei 'out of memory|killed process|oom-kill'

发现类似Out of memory或Killed process的记录时,记下:

  • 故障发生时间。

  • 被终止进程的PID和名称。

  • 当时的内存占用。

  • 是否涉及容器或其他资源限制。

被终止的进程不一定是造成内存压力的最初原因,还需要结合其他进程和故障前的监控判断。

查看完整上下文时,执行:

sudo journalctl -k -b --since "-2h" --no-pager

如果系统启用了systemd-oomd,还可以检查其日志:

sudo journalctl -b -u systemd-oomd --since "-2h" --no-pager

它可能在内核OOM发生前,根据内存压力终止相关进程。

没有查到记录时,先确认故障时间是否在查询范围内。服务器重启过的,还需要检查上一次启动的日志;只有历史日志被保留下来时,才能查询到。

应用自身报告的内存错误,例如Java的OutOfMemoryError,也需要查看应用日志,不能全部归为内核OOM。

5. Docker容器内存不足怎么排查?

在宿主机上执行:

docker stats --no-stream

重点查看MEM USAGE / LIMIT,确认容器当前占用和允许使用的内存上限。

持续观察某个容器:

docker stats web

其中web需要替换为实际容器名称。

检查容器状态和配置:

docker inspect --format \
'OOMKilled={{.State.OOMKilled}} ExitCode={{.State.ExitCode}} Memory={{.HostConfig.Memory}}' web

主要字段说明:

字段 含义
OOMKilled Docker记录的容器OOM终止状态
ExitCode 容器退出码
Memory 显式配置的内存硬限制,单位为字节

Memory=0通常表示没有通过该配置设置容器内存硬限制,但仍可能受到上级资源限制和宿主机容量影响。

宿主机还有可用内存,并不代表容器一定够用。例如,容器只允许使用512MiB,达到限制后仍可能发生OOM。

退出码137通常与被SIGKILL信号终止有关,不能单凭这个数字认定发生了OOM。应结合OOMKilled、内核日志和应用日志确认;容器自动重启后,当前状态也不能完整代替历史记录。

另外,Linux上的docker stats会对缓存占用作扣除处理,其数值不一定与其他监控工具完全一致。

6. 常见内存占用原因怎么处理?

常见情况 排查方向 处理思路
PHP-FPM进程数量较多 并发请求、工作进程数量、单进程占用 根据单进程实际占用调整并发上限
MySQL占用较大 缓冲池、连接数量、查询和临时数据 综合调整缓存及连接配置
Java程序持续增长 堆设置、堆外内存、线程数量、对象增长 结合应用监控定位问题,并为堆外内存留出空间
Python或Node.js批处理占用高 大文件读取、批量查询、队列堆积 分批处理,限制并发和队列长度
备份、压缩任务运行时突增 是否同时运行多个任务 错峰执行,减少并行任务
容器反复退出 容器限额、应用峰值、宿主机余量 同时核对限额与真实需求
tmpfs占用较大 内存文件系统中的文件 确认文件用途后,由对应应用清理

如果占用在相近业务负载下持续增长,且长期不回落,应进一步分析应用对象、缓存策略或内存分配情况。

不要仅凭进程名称结束程序,也不要把全部内存都分配给单个数据库缓存或应用堆。

7. 是否需要手动清理系统缓存?

通常不需要。

Linux会在需要时回收可回收缓存。定时执行drop_caches不能解决应用内存泄漏、并发过高或容器限额不足等问题。

频繁丢弃缓存,还可能导致系统重新读取文件,增加磁盘I/O和CPU开销。

更有效的做法是查看available的变化,找到实际占用来源,再调整应用配置和任务安排。

8. 业务已经卡顿,应该先做什么?

建议按以下顺序处理:

  1. 保存当前内存、进程和故障日志,记录发生时间。

  2. 暂停已经确认可以暂停的备份、压缩、导入等非核心任务。

  3. 降低异常任务的并发,控制队列积压和重复重试。

  4. 对明确异常的应用,评估影响后通过服务管理工具正常重启。

  5. 继续观察内存和业务响应,确认是否再次增长。

数据库、缓存和关键业务进程需要先确认恢复方式,避免直接使用kill -9强行结束。

如果SSH已经难以响应,可以使用实例支持的控制台连接方式尝试登录。需要重启服务器时,应考虑当前写入任务和业务恢复流程。

重启能够暂时释放内存,但仍需要继续查明占用增长的原因。

9. 增加Swap还是升级内存?

Swap可以为部分短时内存峰值提供缓冲,但磁盘上的交换空间速度通常明显低于内存。

是否增加Swap,应结合磁盘剩余空间、存储性能和应用要求判断。持续依赖大量交换,通常会影响业务响应。

情况 优先处理方式
偶尔运行任务时短暂出现峰值 错峰执行、降低并发,评估Swap缓冲
日常业务长期缺少可用内存 优化配置并评估升级内存
单个应用持续增长 排查应用问题,扩容只能延缓再次耗尽
容器上限明显偏低 在宿主机资源允许时调整容器配置
主要是可回收缓存占用 结合available和业务表现判断,无需只为降低使用率而扩容

不要为了让Swap使用量归零,在内存紧张时直接关闭全部Swap。将交换数据搬回内存可能进一步增加压力。

升级莱卡云服务器配置前,应核对目标实例支持的变更方式,以及是否需要停机或重启。

10. 处理后如何确认恢复正常?

再次检查:

free -h
vmstat 1 6
ps -eo pid,user,pmem,rss,comm --sort=-rss | head -n 6

同时确认:

  • 可用内存是否恢复到能支撑当前业务的水平。

  • 交换活动是否减少。

  • 高占用进程是否停止异常增长。

  • 网站、接口和数据库是否恢复正常响应。

  • 是否还有新的OOM或进程异常退出记录。

应覆盖实际业务高峰继续观察,避免只检查空闲时段。

如需提交莱卡云技术支持工单,建议提供故障时间及服务器时区、系统与内存配置、相关命令输出、故障日志,以及近期部署或配置变更。提交前请遮盖密码、令牌和其他敏感信息。

按文档操作后还是不行,把机器编号、出问题的时间点和现象截图一起提工单,能少来回一轮。

提交工单