我正在尝试使用 Munin 绘制接口上的累积带宽图。
显然有一个bandwidth_
插件可以实现这个功能(见http://munin-monitoring.org/browser/munin-contrib/plugins/network/bandwidth_),我已经安装了它并且已经运行了几个星期了。
我原本希望看到一些漂亮的图表,但一切都被设置为“0”。
当执行时munin-run
,我也会得到空值:
# munin-run bandwidth_br0
average.value 0
monthly.value 0
30dayusage.value 0
所以我尝试看一下代码:
open( my $rx, "<", "/sys/class/net/$interface/statistics/rx_bytes" )
|| die "Unable to read: $!";
$counter_input = <$rx>;
chomp $counter_input;
...并且输出一个不断增加的值,就像它应该的那样:
# cat /sys/class/net/br0/statistics/rx_bytes
2095478809
我的state
文件包含以下信息:
pst0^D^H^H12345678^D^H^H^H^C+
^@^@^D^C^B^@^@^@^H<80>^E^@^@^@input^H<80>^F^@^@^@output
^@^@^@1398125584^D^C^B^@^@^@^H<80>^E^@^@^@input^H<80>^F^@^@^@output
^@^@^@1398037387^D^C^B^@^@^@^H<80>^E^@^@^@input^H<80>^F^@^@^@output
^@^@^@1398331077^D^C^B^@^@^@^H<80>^E^@^@^@input^H<80>^F^@^@^@output
^@^@^@1397950990^D^C^B^@^@^@^H<80>^E^@^@^@input^H<80>^F^@^@^@output
有人知道问题出在哪里或如何进一步调试吗?
在 Ubuntu Saucy 上使用 munin 2.0.17。
答案1
我写了这个插件。
这是我用来转储存储文件内容的脚本。我还想知道自我发现是否为您确定了正确的接口。
#!/usr/bin/perl
use Storable;
use Data::Dumper;
my $file="/var/lib/munin-node/plugin-state/nobody/bandwidth_eth1.state";
my $dump;
my $perf_ref;
my $store_ref = retrieve($file);
while (my ($key, $value) = each(%$store_ref) ) {
$perf_ref->{$key} = $value;
}
foreach $key (sort keys %$perf_ref) {
if ($key =~ /last/) {
print "$key\n";
} else {
print scalar(localtime($key)) . "\n";
}
print Dumper($perf_ref->{$key}) . "\n";
}
看起来您正在尝试测量虚拟接口 br0。监控物理接口可能更好。我查看了我拥有的一个桥接接口,结果很奇怪。接收计数器正在顺利增加,而传输从未改变,即使我对其进行 ping 也是如此。
答案2
我在使用 Ubuntu 14.04 的插件修订版 1.37 时遇到了同样的问题。
我尝试通过让 perl 检查脚本来追踪它:
perl -Mstrict -cw bandwidth_
它抱怨 split 的一些奇怪用法。我相信 split 需要一个变量来分配返回值。可能在最近的某个版本的 perl 中对此进行了更改。该脚本有点过时了。
Useless use of split in void context at bandwidth_ line 130.
Useless use of split in void context at bandwidth_ line 132.
Scalar value @_[0] better written as $_[0] at bandwidth_ line 212.
Useless use of split in void context at bandwidth_ line 211.
我不在乎建议函数,因为我已经将插件符号链接到 eth0 接口。如果您需要,可能也需要更改该部分。我的情况是问题$uptime
始终未定义,导致返回 0。
因此我改变了子程序正常运行时间,将返回值分配给变量,然后使用该变量。
sub uptime {
my $puptime = "/proc/uptime";
open( TIME, "<", $puptime ) || die "Unable to read $puptime: $!";
while (<TIME>) {
my @arr = split;
$uptime = $arr[0];
}
close(TIME);
chomp $uptime;
}
现在插件返回的值看起来相当合理。