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内存的云服务器,也能够支撑远超预期的业务负载。

全球服务器测评


