博客服务器内存不够?看完这篇你就知道怎么救了
我之前用的是1G内存的VPS,跑个WordPress博客还算流畅。但后来装了一堆插件,突然有一天网站直接502了。打开服务器后台一看,内存使用率99%,Swap区也满了,整个系统卡得像死机一样。
后来花了三晚上研究,总算把这个问题解决了。今天把我踩的坑和解决方案全部写出来,1G、2G内存的博客服务器都可以参考。
内存为什么会不够?
先说个冷知识:Linux系统会把空闲内存用来做缓存(Cache),这部分"占用"其实是可以快速释放的。真正的内存告急指的是可用内存(free + available)接近0。
常见原因我列了个表:
| 原因 | 典型表现 | 危险程度 |
|---|---|---|
| PHP-FPM进程数太多 | 内存占用逐渐升高直到崩溃 | ⭐⭐⭐⭐ |
| MySQL/马redis内存配置过大 | 一启动就占用大量内存 | ⭐⭐⭐⭐ |
| Swap太小或没开 | 内存一满直接OOM | ⭐⭐⭐ |
| 图片/备份文件占用/tmp | 临时文件撑爆内存 | ⭐⭐ |
| 异常进程/被挖矿 | CPU和内存同时爆高 | ⭐⭐⭐⭐⭐ |
第一步:先诊断到底是哪里出了问题
别急着改配置,先看清楚。SSH连上服务器,执行:
```bash
看内存使用情况
free -h
看哪些进程最吃内存
ps aux --sort=-%mem | head -10
看实时内存变化
watch -n 2 free -h
```
我第一次看的时候吓一跳,php-fpm进程居然占了700多MB!一台1G内存的机器,PHP就吞了一半。
再看MySQL,单独又占了200MB。这俩货加起来,1G内存基本就没剩多少了。
第二步:PHP-FPM配置优化(关键!)
PHP-FPM是内存消耗的大头,配置不合理的话,一个请求就可能fork出好几个进程,每个都带一份PHP的内存占用。
打开你的php-fpm配置文件:
```bash
一般在宝塔面板里直接改,或者找这个路径
/etc/php-fpm.d/www.conf
```
关键参数改这几个:
```
pm = dynamic # 改成动态模式,比ondemand更稳定
pm.max_children = 10 # 最大子进程数,1G内存建议不超过10
pm.start_servers = 3 # 启动时建立的进程数
pm.min_spare_servers = 2 # 最小空闲进程
pm.max_spare_servers = 5 # 最大空闲进程,超过就杀掉
pm.max_requests = 500 # 每个进程处理500个请求后自动回收,防止内存泄漏
```
改完重启PHP-FPM:
```bash
systemctl restart php-fpm
```
我改完之后,内存从原来占用900MB降到了500MB左右,立竿见影。
第三步:MySQL/MariaDB内存配置
数据库也是内存消耗大户,默认配置通常偏高。找到my.cnf:
```bash
宝塔用户一般在 /etc/my.cnf 或者 /www/server/mysql/my.cnf
```
在[mysqld]区域加这些:
```
innodb_buffer_pool_size = 128M # InnoDB缓存,1G内存机器建议128-256M
max_connections = 50 # 最大连接数,博客站50足够了
query_cache_size = 0 # MySQL5.7以上已禁用,不用管
key_buffer_size = 32M # MyISAM索引缓存,32M够用
```
注意:如果你是MariaDB,buffer_pool可以适当大一点,但不要超过物理内存的50%。
第四步:给服务器加个Swap,防止OOM
Swap相当于把硬盘当内存用,速度慢但不会让系统直接崩溃。
```bash
创建一个2G的Swap文件
fallocate -l 2G /swapfile
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
设置开机自动启用
echo '/swapfile none swap sw 0 0' >> /etc/fstab
设置Swap使用倾向(数值越低越倾向使用Swap)
echo 'vm.swappiness=10' >> /etc/sysctl.conf
sysctl -p
```
我加了2G Swap之后,即使PHP偶尔内存占用过高,系统也不会直接502了,会先用Swap顶着,给你反应时间。
第五步:定期监控,做运维值班员
问题解决了还不够,得防止复发。我在宝塔面板设置了内存使用率超过80%自动重启PHP-FPM的脚本:
```bash
#!/bin/bash
used=$(free | grep Mem | awk '{print ($3/$2)*100}')
if [ $used -gt 80 ]; then
systemctl restart php-fpm
echo "$(date): Memory used $used%, restarted php-fpm" >> /var/log/mem_restart.log
fi
```
然后加到宝塔的计划任务里,每10分钟执行一次。配合监控宝的免费告警,内存超了就给我发短信。
效果对比
调优前后我做了个对比:
| 指标 | 优化前 | 优化后 |
|---|---|---|
| 内存占用率 | 95%+(经常告警) | 50%-60%(稳定) |
| 平均响应时间 | 3-8秒 | 0.5-1.5秒 |
| 502次数/周 | 3-5次 | 0次 |
| Swap使用 | 经常占满 | 基本不用 |
效果还是很明显的。
常见问题
Q:我的服务器只有512M内存,跑WordPress够用吗?
说实话,512M跑WordPress会比较吃力。建议用Typecho或者Z-Blog这类轻量级程序,内存占用只有WordPress的1/5。我有一台512M的测试机跑Typecho,内存使用率长期在40%左右。
Q:加内存和优化配置哪个更值得?
先优化配置,基本免费。实在优化不动了再加内存。一般1G优化后够用,2G就很舒服了。
Q:宝塔一键优化脚本有用吗?
有用,但不够精准。那个脚本是通用配置,具体到你的博客还是得自己调PHP-FPM和MySQL这两个核心。
推荐阅读
有问题或者想聊聊你服务器的配置?微信:15207283116,加我备注"博客"
需要了解更多使用技巧?
扫码加我微信,我来给你详细解答!
微信号:15207283116
(博客来的朋友优先通过!)
—— 本文仅供参考,具体以实际情况为准 ——
还木有评论哦,快来抢沙发吧~