搬瓦工入门方案通常配备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/MariaDB | 200-500MB | 减小innodb_buffer_pool_size |
| PHP-FPM | 每进程30-80MB | 减少pm.max_children |
| Nginx | 10-50MB | 通常不是问题 |
| Redis | 50-200MB | 设置maxmemory限制 |
| Elasticsearch | 500MB+ | 调整JVM heap size |
# /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+
# /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进程内存上限
# /etc/redis/redis.conf
maxmemory 64mb
maxmemory-policy allkeys-lru # 内存满时淘汰最久未使用的key
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事件
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
| 组件 | 建议内存 | 说明 |
|---|---|---|
| 系统基础 | 150MB | 内核、systemd等 |
| Nginx | 30MB | 低开销 |
| PHP-FPM (3进程) | 240MB | 每进程约80MB |
| MySQL | 300MB | buffer_pool=128M |
| Redis | 64MB | 缓存加速 |
| 预留 | ~200MB | 缓冲和其他任务 |
加上1GB Swap作为安全网,这套配置可以稳定运行WordPress + WooCommerce。
Tip: 如果内存确实不够,建议升级方案。查看搬瓦工全部在售方案。更多排查教程请查看新手教程。