如何确定导致服务器带宽使用率过高的原因

如何确定导致服务器带宽使用率过高的原因

我在 VPS 上运行了一个 MySQL 数据库服务器。该服务器通过私有网络接口连接到 Web 服务器,除了 SSH 和 PHPMyAdmin 安装外没有其他公共服务。

前段时间,我安装了一条 Monit 规则来检查公共网络接口(不是 MySQL 数据传输的接口)上的异常流量:

# Monitor network connection
check network public with interface eth1
   if failed link then alert
   if changed link then alert
   if saturation > 90% then alert
   if download > 10 MB/s then alert
   if total upload > 1 GB in last hour then alert

几个月前,我开始收到由该规则触发的大量 Monit 警报:

Upload bytes exceeded Service public

        Date:        Tue, 04 Apr 2017 13:11:55
        Action:      alert
        Host:        myhostname.com
        Description: total upload 1.0 GB matches limit [upload rate < 1024.0 MB in last 1 hour]

Your faithful employee,
Monit

这些警报实际上与服务器上的任何使用量峰值无关,而且由于没有真正面向公众的服务,我无法想象是什么导致了如此大的上传带宽。磁盘空间似乎也没有被使用。

我怎样才能找出导致上传 1GB 以上的“某些内容”的原因、上传了什么以及从哪里上传?

答案1

听起来好像某些东西正在运行某种定期的 SELECT 查询,并将数据从公共接口转储出来。

Wireshark、pcap 或其他数据包监听变体会显示源(SQL 服务器)和目标、使用的端口/协议等。锁定端口 3306(TCP 或 UDP),即 MySQL 端口。

如果您的系统上有大量磁盘空间,您可以设置数据包监听来保存包含公共接口上的网络流量的 pcap 文件。

我建议使用假脱机模式,比如说,10GB,分成 2GB 的文件,这样您就不会使用超过这个空间量,但您应该能够捕获至少一个上传(或至少是它的开始)。可能需要一两个小时才能填满,或者只需几分钟,但使用此方法您将始终拥有至少 8GB 的​​完整对话(最后一个文件将小于 2GB 并且将是最新数据)。

一旦你了解了发生了什么,你就可以采取措施来缓解。首先,我建议关闭公共端口上的 3306 端口,并在 MySQL 的权限内锁定“可以运行查询”的凭证。这样就可以锁上谷仓门了。

答案2

识别 MySQL 方面正在发生什么情况的一种可能方法是启用慢查询日志,然后建立一个非常低的阈值来捕获每个语句。然后,您可以查看慢查询日志以查看当时正在运行的内容。

另一种方法是定期转储“show full processlist \G”。这样可以更轻松地查看特定时间正在运行的内容。

相关内容