全球服务器测评

Linux服务器内存占满怎么办?SWAP扩容与内存泄漏排查

Linux服务器管理员来说,CPU占用高往往容易发现,而内存问题却更加隐蔽。很多站长发现服务器突然变卡、网站响应变慢、数据库频繁重启,甚至直接出现OOM(Out Of Memory)错误时,才意识到服务器内存已经被耗尽。

尤其是在配置较低的云服务器环境中,例如2核2G、2核4G或者4核4G的VPS,当部署WordPress、MySQL、Redis、Nginx以及多个PHP-FPM进程之后,内存资源往往会变得十分紧张。

很多人第一反应是升级服务器配置,但实际上,内存不足并不一定意味着必须升级硬件。有时候合理配置SWAP交换空间、优化服务参数,甚至找到隐藏的内存泄漏进程,就能让服务器恢复正常运行。

本文将从Linux内存管理原理开始,深入讲解SWAP配置方法、内存占用分析技巧以及内存泄漏排查实战流程。

为什么服务器会出现内存不足

很多用户认为内存占用达到90%就是异常。

实际上Linux系统并不是这样工作的。

Linux设计理念之一就是尽可能利用闲置内存。

执行:

free -h

可能看到:

              total        used        free
Mem:          4.0G        3.8G        200M

表面看似只剩200M。

但继续查看:

free -h

完整结果:

              total        used        free      shared  buff/cache
Mem:          4.0G        3.8G        200M       120M      1.5G

这里的1.5G缓存实际上可以随时释放。

因此判断内存是否不足,不能只看used。

更应该关注:

available

例如:

available 2.1G

说明系统实际上还有2.1G可用内存。

内存不足会出现哪些现象

生产环境中常见表现包括:

网站打开速度明显下降;

MySQL查询变慢;

PHP-FPM进程频繁重启;

Redis被系统杀死;

SSH连接卡顿;

宝塔面板无法打开;

服务器负载持续升高;

出现OOM Killer日志。

查看系统日志:

dmesg | grep -i kill

或者:

journalctl -k

如果发现:

Out of memory
Killed process

说明系统已经触发OOM机制。

Linux为了保证系统继续运行,会强制终止占用内存最高的进程。

有时被杀死的正是MySQL或者PHP。

如何快速找到占用内存最高的进程

第一步先查看整体情况。

free -h

第二步查看进程。

top

或者:

htop

安装htop:

yum install htop -y

CentOS 7:

yum install epel-release -y
yum install htop -y

进入后按:

M

按照内存排序。

例如:

PID USER     RES
1250 mysql   2.1G
2301 php     800M

立即就能发现哪个服务占用资源最多。

使用ps命令统计内存占用

查看前十名进程:

ps aux --sort=-%mem | head

输出示例:

USER       PID %MEM COMMAND
mysql      1222 45.1 mysqld
www        3456 15.2 php-fpm
redis      2211 5.3 redis-server

这比top更加直观。

如果PHP进程异常增长:

ps -ylC php-fpm --sort:rss

即可看到具体内存消耗。

什么是SWAP交换空间

很多新手认为SWAP就是虚拟内存。

这种理解并不完全准确。

SWAP本质上是硬盘空间。

当物理内存不足时:

Linux会将暂时不用的数据写入磁盘。

释放出RAM供当前任务使用。

流程如下:

应用程序
     ↓
物理内存RAM
     ↓
内存不足
     ↓
SWAP交换空间
     ↓
硬盘

因为SSD速度远低于内存。

所以SWAP不是提升性能。

而是避免服务器直接崩溃。

为什么云服务器必须配置SWAP

很多云厂商默认关闭SWAP。

例如:

  • 腾讯云轻量服务器
  • 阿里云ECS
  • Vultr VPS
  • DigitalOcean
  • Linode

如果服务器只有2G内存。

数据库突然占用过高。

系统会立即触发OOM。

而配置SWAP之后:

内存不足
↓
先使用SWAP
↓
避免OOM
↓
服务继续运行

虽然速度会下降。

但至少不会直接宕机。

查看当前SWAP状态

执行:

swapon --show

或者:

free -h

如果显示:

Swap: 0B 0B 0B

说明没有配置交换空间。

Linux创建SWAP实战

以创建4GB交换空间为例。

创建文件:

fallocate -l 4G /swapfile

如果不支持:

dd if=/dev/zero of=/swapfile bs=1M count=4096

修改权限:

chmod 600 /swapfile

格式化:

mkswap /swapfile

启用SWAP:

swapon /swapfile

查看结果:

free -h

输出:

Swap: 4.0G 0B 4.0G

说明创建成功。

设置开机自动挂载

编辑:

vim /etc/fstab

添加:

/swapfile swap swap defaults 0 0

保存退出。

测试:

mount -a

无报错即可。

SWAP设置多大比较合适

过去有个经典规则:

SWAP = 内存 × 2

但如今已经不适用了。

推荐如下:

物理内存 SWAP建议
1G 2G
2G 2G~4G
4G 4G
8G 4G
16G以上 2G~4G

对于WordPress服务器:

4G内存搭配4G SWAP通常比较合理。

调整SWAPPINESS参数

Linux默认值:

cat /proc/sys/vm/swappiness

通常:

60

意味着系统比较积极使用SWAP。

对于SSD服务器建议:

10

修改:

sysctl vm.swappiness=10

永久生效:

vim /etc/sysctl.conf

添加:

vm.swappiness=10

应用:

sysctl -p

这样系统优先使用物理内存。

只有真正紧张时才启用SWAP。

什么是内存泄漏

很多服务器即使配置了SWAP。

内存依然不断上涨。

最终占满所有资源。

这通常就是内存泄漏。

简单理解:

程序申请内存:

申请内存
↓
使用完成
↓
未释放
↓
持续堆积

时间越久:

占用越大。

最终耗尽服务器资源。

PHP-FPM内存泄漏排查

WordPress环境最常见。

查看:

ps aux | grep php-fpm

如果发现:

php-fpm 600M
php-fpm 700M
php-fpm 800M

并持续增长。

说明某插件或者代码存在问题。

查看配置:

vim /etc/php-fpm.d/www.conf

重点:

pm.max_children

例如:

pm.max_children = 20

每个进程占用:

100MB

理论消耗:

20 × 100MB
=
2GB

对于4G服务器已经非常危险。

适当调整:

pm.max_children = 8

即可减少内存占用。

MySQL内存泄漏排查

查看:

mysqladmin processlist

或者:

show processlist;

如果大量Sleep连接长期存在:

Sleep
Sleep
Sleep
Sleep

可能导致资源浪费。

优化:

wait_timeout=60
interactive_timeout=60

同时检查:

innodb_buffer_pool_size

不要超过物理内存的70%。

例如:

4G内存服务器

推荐:

innodb_buffer_pool_size=1G

或者:

innodb_buffer_pool_size=1.5G

Redis导致内存耗尽怎么办

查看:

redis-cli info memory

重点关注:

used_memory_human

如果持续增长:

查看最大内存设置:

CONFIG GET maxmemory

设置限制:

CONFIG SET maxmemory 512mb

永久配置:

maxmemory 512mb

淘汰策略:

maxmemory-policy allkeys-lru

避免Redis无限占用内存。

使用smem分析真实内存占用

安装:

yum install smem -y

查看:

smem -rk

结果示例:

PID User Command USS PSS RSS

其中:

  • USS:独占内存
  • PSS:实际占用
  • RSS:总占用

相比top更加准确。

使用pmap分析单个进程

找到PID:

pidof mysqld

查看:

pmap -x PID

例如:

pmap -x 1234

输出详细内存映射。

适用于分析:

  • MySQL
  • Java
  • PHP
  • Python

等高内存进程。

使用sar观察历史内存变化

安装:

yum install sysstat -y

查看:

sar -r

查看一天数据:

sar -r -f

能够发现:

凌晨正常
上午开始增长
下午达到峰值

帮助定位泄漏时间点。

一套实用的排查流程

当服务器出现内存不足时,可以按照以下顺序检查:

第一步:

free -h

查看整体内存。

第二步:

top

找出高占用进程。

第三步:

ps aux --sort=-%mem

确认具体程序。

第四步:

swapon --show

检查SWAP。

第五步:

sar -r

查看历史趋势。

第六步:

pmap

分析可疑进程。

第七步:

journalctl -k

确认是否发生OOM。

经过这套流程,大部分内存问题都能够快速定位。

服务器内存不足并不可怕,可怕的是不知道问题出在哪里。很多运维人员一遇到内存告警就直接升级配置,结果发现升级后问题依旧存在,因为根本原因往往不是内存容量不够,而是程序配置不合理、缓存策略错误或者存在内存泄漏。

对于中小型网站、WordPress博客、电商独立站以及企业官网而言,合理配置SWAP交换空间能够显著提高系统容错能力,避免因瞬时流量或异常进程导致服务器直接崩溃。同时配合free、top、ps、smem、pmap、sar等工具,可以快速锁定高内存进程,找到资源消耗源头。

真正稳定的服务器运维思路并不是无限堆配置,而是通过持续监控、合理优化和定期排查,让有限的硬件资源发挥最大的价值。当你掌握SWAP配置与内存泄漏分析方法之后,即使面对2G或4G内存的云服务器,也能够支撑远超预期的业务负载。

未经允许不得转载:全球服务器测评 » Linux服务器内存占满怎么办?SWAP扩容与内存泄漏排查