你正忙着上线一个新项目,突然收到报警:服务器负载飙到 8.0 以上,SSH 登录都卡得不行。这种情况不少见,尤其在流量突增或配置不当的时候。别慌,先搞清楚“负载”到底是什么。
什么是服务器负载?
Linux 系统中的 load average 显示的是过去 1 分钟、5 分钟、15 分钟内处于可运行状态的平均进程数。比如三组数值是 8.00, 6.50, 4.20,说明最近一分钟平均每秒有 8 个进程在等待 CPU 资源。如果你的服务器是 4 核 CPU,那这个负载已经明显偏高了。
第一步:登录服务器看实时情况
用 SSH 登进去,先跑 top 命令看看:
top
观察 %CPU 使用率高的进程,重点关注 USER 列是不是某个 PHP、Node.js 或 Java 进程占满了 CPU。如果看到大量 php-fpm 或 python 进程堆积,可能是程序没处理好并发请求。
换更直观的工具:htop
top 界面不够友好?装个 htop,颜色区分更清楚:
sudo apt install htop && htop
用方向键上下选中进程,按 F6 可以按 CPU、内存排序,一眼看出“元凶”是谁。
查网络连接有没有异常
有时候不是 CPU 不够用,而是连接数太多导致系统资源耗尽。比如被 CC 攻击,或者数据库连接没释放。
看看当前有多少 ESTABLISHED 连接:
netstat -an | grep ESTABLISHED | wc -l
如果数字超过几千甚至上万,就得继续深挖。找出哪些 IP 连得最多:
netstat -an | grep ESTABLISHED | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr | head
发现某个 IP 占了几百个连接?基本可以怀疑是恶意刷接口,用 iptables 拦一下:
iptables -A INPUT -s 恶意IP -j DROP
检查磁盘 IO 是否卡住
CPU 和内存看着不高,但服务器还是慢?可能是磁盘 IO 太高。用 iotop 看看:
iotop
如果没有安装,先执行:
sudo apt install iotop
关注 WRITE 和 READ 高的进程。比如 MySQL 在频繁写日志,或者某个脚本在狂扫日志文件,都会拖慢整个系统。
临时缓解:重启服务 or 限流
线上出问题,先稳住局面。如果是 Web 服务扛不住,可以临时重启 php-fpm 或 Nginx:
sudo systemctl restart php7.4-fpm
或者在 Nginx 层做限流,防止请求雪崩:
limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;
加到 server 块里,限制单 IP 每秒最多 10 个请求,能有效防住小规模攻击。
长期优化建议
别等出事才动手。平时可以做几件事:
- 给关键服务加监控,比如用 Prometheus + Grafana 看负载趋势
- 定期分析访问日志,发现异常 URL 或高频爬虫
- 数据库加索引,避免慢查询拖垮连接池
- 静态资源走 CDN,减少源站压力
举个例子,之前有个博客站点总在晚上八点崩溃,一查是定时生成报表的脚本把 MySQL 锁住了。后来改成异步队列处理,负载立马恢复正常。
小技巧:用 uptime 快速看负载
不想进 top,只想快速确认?直接输:
uptime
输出类似:
14:23:01 up 10 days, 2 users, load average: 7.98, 6.45, 5.10
一眼就知道系统最近挺忙。