VPS内存不足排查与OOM预防


搬瓦工入门方案通常配备512MB-1GB内存,运行多个服务后内存容易不足。当内存耗尽时,Linux内核的OOM Killer会强制杀死进程,导致MySQL崩溃、网站宕机等严重问题。本文介绍内存问题的排查和预防方法。

一、查看内存使用情况

# 查看内存概况
free -h

# 输出示例:
#               total    used    free   shared  buff/cache   available
# Mem:          976Mi   680Mi    54Mi    12Mi      241Mi      156Mi
# Swap:           0B      0B      0B

关键看"available"列,这才是实际可用的内存(free + 可释放的buff/cache)。如果available低于总内存的10%,就需要优化。

二、定位内存大户

# 按内存排序查看进程
ps aux --sort=-%mem | head -20

# 使用top,按M键按内存排序
top

# 查看各进程内存详细占用
smem -tk

# 查看内核slab缓存
slabtop

常见内存大户及优化

进程典型占用优化方法
MySQL/MariaDB200-500MB减小innodb_buffer_pool_size
PHP-FPM每进程30-80MB减少pm.max_children
Nginx10-50MB通常不是问题
Redis50-200MB设置maxmemory限制
Elasticsearch500MB+调整JVM heap size

三、优化各服务内存配置

3.1 MySQL内存优化(1GB VPS推荐配置)

# /etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld]
innodb_buffer_pool_size = 128M    # 默认128M,1GB VPS不要超过256M
innodb_log_buffer_size = 8M
key_buffer_size = 16M
max_connections = 50               # 减少最大连接数
table_open_cache = 256
thread_cache_size = 4
query_cache_size = 0               # MySQL 8.0已移除
tmp_table_size = 16M
max_heap_table_size = 16M
performance_schema = OFF           # 关闭性能监控节省50MB+

3.2 PHP-FPM内存优化

# /etc/php/8.2/fpm/pool.d/www.conf
pm = ondemand                      # 按需创建进程(比dynamic更省内存)
pm.max_children = 3                # 1GB内存建议3-5个
pm.process_idle_timeout = 10s
pm.max_requests = 500              # 定期回收防止内存泄漏

# PHP内存限制
# /etc/php/8.2/fpm/php.ini
memory_limit = 128M                # 单个PHP进程内存上限

3.3 Redis内存限制

# /etc/redis/redis.conf
maxmemory 64mb
maxmemory-policy allkeys-lru       # 内存满时淘汰最久未使用的key

四、配置Swap交换空间

Swap是内存不足时的安全网,虽然比内存慢,但能防止OOM Killer直接杀进程。

# 创建1GB Swap文件
fallocate -l 1G /swapfile
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile

# 设置开机自动挂载
echo '/swapfile none swap sw 0 0' >> /etc/fstab

# 调整swappiness(建议10-30,SSD可用10)
echo 'vm.swappiness=10' >> /etc/sysctl.conf
sysctl -p

# 验证Swap
free -h
swapon --show

五、OOM Killer配置

OOM Killer在内存耗尽时会杀死占用内存最多的进程。可以保护关键进程:

# 查看最近OOM事件
dmesg | grep -i "oom\|killed"
journalctl -k | grep -i oom

# 保护MySQL不被OOM杀死(降低被杀优先级)
echo -17 > /proc/$(pidof mysqld)/oom_adj

# 或使用oom_score_adj(推荐)
echo -1000 > /proc/$(pidof mysqld)/oom_score_adj

注意:保护某个进程意味着OOM时其他进程更容易被杀。Swap才是根本解决方案。

六、快速释放内存

# 清理系统缓存(一般不需要,Linux会自动管理)
sync && echo 3 > /proc/sys/vm/drop_caches

# 重启内存大户服务
systemctl restart php8.2-fpm
systemctl restart mysql
systemctl restart nginx

七、1GB VPS内存分配建议

组件建议内存说明
系统基础150MB内核、systemd等
Nginx30MB低开销
PHP-FPM (3进程)240MB每进程约80MB
MySQL300MBbuffer_pool=128M
Redis64MB缓存加速
预留~200MB缓冲和其他任务

加上1GB Swap作为安全网,这套配置可以稳定运行WordPress + WooCommerce。

Tip: 如果内存确实不够,建议升级方案。查看搬瓦工全部在售方案。更多排查教程请查看新手教程
关于本站

搬瓦工VPS中文网(bwgvps.com)是非官方中文信息站,整理搬瓦工 BandwagonHost 的优惠信息、使用教程和方案对比,方便中文用户选购和使用。

新手必读
搬瓦工优惠码

当前最大折扣优惠码:

NODESEEK2026(优惠 6.77%)

在购买方案时填入优惠码即可自动抵扣。详见 优惠码使用教程