监控服务器/网站带宽负载

监控服务器/网站带宽负载

我一直在寻找一个可以监控网站“带宽”使用情况的工具,我说的不是加载了多少 MB/数据,而是服务器的实际输出速度,为了澄清我的意思,我将使用一个例子,

我的服务器的互联网连接速度为 100/MBs,我希望能够监控这 100/MBs 中的使用了多少,并将其记录下来(作为后台进程)。

我尝试过不同类型的工具,例如 Zabbix、Nagios 和 ntopng(ntop),它们都是有用的工具,但它们似乎都无法记录实际的服务器速度/速度使用情况。目前我仍然安装了 Ntop(ng),但我无法让它做我想要它做的事情。(全天候记录数据至关重要)

原因在于,由于我托管了人们可以下载的文件,我的互联网连接速度有时会达到上限,因此我希望能够监控何时/多久达到上限。

我的服务器是运行 Apache 2.2 的 Ubuntu 12.04,我不知道是否需要它,但以防万一:我的域为每个域设置了虚拟主机。

我感谢任何能得到的帮助和提示。

答案1

听起来您正在尝试通过测量日志中记录的 Web 服务器输出来监控整个网络带宽 - 这还不够,因为它不包括任何 TCP/IP 协议开销或其他流量(任何 SSH、FTP、数据库或服务器可能参与的其他流量)。

你需要关注的是接口统计任何服务器监控工具(如 Zabbix 和 Nagios)都具有此功能,例如使用 collectd 时,您可以使用接口模块(https://collectd.org/wiki/index.php/Plugin:Interface) 来监控给定接口或 iptables 模块上的所有流量(https://collectd.org/wiki/index.php/Plugin:IPTables)来监控符合某些过滤规则的流量(这样您可以更详细地分析使用的带宽)。

答案2

我将使用一个脚本(我最喜欢的是带有“re”模块的python)来解析Apache访问日志

例如:

127.0.0.1 - frank [10/Oct/2000:13:55:36 -0700] “GET /apache_pb.gif HTTP/1.0” 200 2326

最后一个元素是传输到客户端的字节数。您需要不断添加这个数字并以固定频率打印或记录,以得出从上次运行到此刻传输到客户端的总字节数。

有关 Apache 访问日志的更多信息,请参见:http://httpd.apache.org/docs/2.2/logs.html

#!/bin/env python
import time, sys, re

regex = re.compile(r'\s+([0-9]+)$')


def fetch_bytes(file, bytes):
        for line in file:
                match = regex.search(line)
                if match:
                        bytes = int(match.group(1))
                        yield bytes


def main():
        Access_File = "apache_access_log"
        try:
                with open(Access_File) as file:
                        gen = None
                        while True:
                                for i in range(1001):
                                        gen = fetch_bytes(file, bytes)
                                #bytes += sum(gen)
                                #prints how much KB has been transferred in the time duration
                                print "%s\t%dKB" % (time.strftime("%H:%M:%S"), (sum(gen)/1024))
                                time.sleep(120)

        except IOError:
                print "Could not locate the apache log file"
                sys.exit(1)

if __name__ == '__main__':
        main()

相关内容