实用网络站
白蓝主题五 · 清爽阅读
首页  > 服务器维护

如何快速定位服务器上的高带宽消耗源头

问题从哪儿开始

半夜收到告警,服务带宽跑满,网站卡得打不开。这种情况不少见,尤其是业务量上来之后。别急着重启服务,先搞清楚是谁在“偷跑”流量。

用基础命令摸清当前情况

登录服务器第一件事,看看实时带宽占用情况。iftop 是个好工具,能直观显示当前网络连接的流量分布。

sudo iftop -i eth0

运行后你会看到类似任务管理器的界面,左边是源IP,右边是目标IP,中间的箭头粗细代表流量大小。一眼就能看出哪个连接最“肥”。

结合 netstat 查进程关联

光知道IP不够,得找到对应的进程。比如发现某个外部IP持续下载大量数据,可以用下面命令查是谁在通信:

sudo netstat -anp | grep :80

重点关注 ESTABLISHED 状态的连接,结合 PID 列反查进程名。如果看到某个 PHP 脚本或 Python 服务占着大连接,基本就有线索了。

用 nethogs 按进程看带宽

比 iftop 更进一步的是 nethogs,它直接按进程分组显示带宽使用,谁在传数据一目了然。

sudo nethogs eth0

打开后你会看到每行一个进程,有PID、用户、上传下载速度。某个备份脚本偷偷上传文件?或者爬虫被滥用?这里藏不住。

检查日志里的异常请求模式

Web 服务的话,Nginx 或 Apache 的访问日志是重要线索。突然某个接口被高频调用,可能就是带宽飙升的原因。

比如查 Nginx 日志里访问最多的URL:

awk '{print $7}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -10

如果发现 /download.php 出现在榜首,而且请求数是平时几十倍,那就要进去看看是不是被当成免费CDN用了。

数据库导出也能成罪魁祸首

有一次我们发现内网带宽被打满,排查发现是开发在后台执行了一个全表导出,几百万条记录打包成CSV通过网页下载。表面看是“正常操作”,实际相当于开了个临时P2P。

这种场景建议加限速,或者改走命令行+压缩+分段传输。

防火墙临时拦截做验证

怀疑某个IP或端口有问题,可以临时封掉试试效果。比如用 iptables 拦截某个外联地址:

sudo iptables -A OUTPUT -d 198.51.100.1 -j DROP

观察带宽是否回落。如果明显下降,基本就能锁定目标。记得测试完删规则:

sudo iptables -D OUTPUT -d 198.51.100.1 -j DROP

定时任务也可能背锅

别忘了 crontab。有些脚本每天凌晨同步数据,如果没加限速,很容易把带宽冲上去。查一下有没有 rsync、wget、curl 类的任务在悄悄运行。

crontab -l

顺便看看 /etc/crontab 和 /etc/cron.d/ 下的配置文件,有时候运维加的备份任务自己都忘了。