实用网络站
白蓝主题五 · 清爽阅读
首页  > 电脑进阶

服务器负载高怎么办?几个实用排查与解决方法

你正忙着上线一个新项目,突然收到报警:服务负载飙到 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

一眼就知道系统最近挺忙。