my $stat;
my $mac_to_name;
+my $instance_tap;
+my $tap_instance;
my $lines;
my @nodes = @ARGV;
if ( @nodes ) {
$hostname = shift @nodes;
$ssh = "ssh $hostname ";
+ $hostname =~ s/\..+$//; # -s
+ warn "## hostname $hostname\n";
}
# if prefixed with _ it will be hiddden from output, _args must be last!
_args);
sub ps_cols_all { map { my $t = $_; $t =~ s/^_//; $t } @ps_cols };
-sub ps_cols_visible { grep { ! /^_/ } @ps_cols };
+sub ps_cols_visible { 'node', grep { ! /^_/ } @ps_cols, 'rx', 'tx' };
sub DD_hh_mm_ss {
my $t = shift;
return $t_sec;
}
-my $cmd = $ssh . 'ps --no-headers axwwo ' . join(',', ps_cols_all);
-warn "## $cmd\n";
-open(my $ps, '-|', $cmd);
+sub sh {
+ my $cmd = join(' ', @_);
+ $cmd = "$ssh '$cmd'";
+ warn "## $cmd\n";
+ open(my $fh, '-|', $cmd);
+ return $fh;
+}
+
+my $ps = sh 'ps --no-headers axwwo ' . join(',', ps_cols_all);
while(<$ps>) {
chomp;
s/^\s*//;
my $name = $1;
$stat->{$name}->{$_} = $h{$_} foreach ps_cols_all;
+ $stat->{$name}->{node} = $hostname;
+
while ( $h{_args} =~ m/mac=([0-9a-fA-F:]+)/g ) {
- $mac_to_name->{$1} = $name;
+ $mac_to_name->{$hostname}->{$1} = $name;
}
} else {
# warn "## SKIP [$_]\n";
- $stat->{ '__' . $hostname }->{$_} += $h{$_} foreach qw( pcpu pmem vsz rss cputime etimes maj_flt min_flt );
+ $stat->{ '__' . $hostname }->{$_} += $h{$_} foreach qw( pcpu pmem vsz rss
+ nlwp cputime etimes
+ maj_flt min_flt
+ );
}
}
-open(my $ip, '-|', $ssh . 'ip -s -o link');
+
+my $tap = sh('grep . /var/run/ganeti/kvm-hypervisor/nic/*/*');
+while(<$tap>) {
+ chomp;
+# warn "## tap $_\n";
+ my @p = split(/\//,$_);
+ push @{ $instance_tap->{$hostname}->{ $p[-2] } }, $p[-1];
+
+ my $if = $p[-1];
+ $if =~ s/\d://;
+ $tap_instance->{$hostname}->{$if} = $p[-2];
+}
+
+=for later
+
+my $ip = sh('ip -s -o link');
while(<$ip>) {
chomp;
if ( m/master\s+(\S+).+ether\s+([0-9a-fA-F:]+).+RX:\s+.+\\\s+(\d+).+TX:\s+.+\\\s+(\d+)/ ) {
- my ( $br, $mac, $rx, $tx ) = ( $1, $2, $3, $4 );
- if ( my $name = $mac_to_name->{$mac} ) {
- $stat->{$name}->{link}->{ $br } = [ $rx, $tx ];
+ my ( $if, $mac, $rx, $tx ) = ( $1, $2, $3, $4 );
+ if ( my $name = $tap_instance->{$hostname}->{$if} ) {
+ $stat->{$name}->{link}->{ $if } = [ $rx, $tx ];
+ warn "## ip $name $ip $mac $rx $tx\n";
} else {
- warn "## SKIP MAC $mac [$_]\n" if $DEBUG;
+ warn "## ip SKIP $if $mac $rx $tx\n"; # XXX if $DEBUG;
}
} else {
warn "## SKIP $_\n" if $DEBUG;
}
}
+=cut
+
+my $dev = sh 'grep : /proc/net/dev';
+while(<$dev>) {
+ chomp;
+ s/^\s+//;
+ my @l = split(/[:\s]+/, $_);
+#warn "XXX $_ -> ",Dumper( \@l );
+ if ( my $instance = $tap_instance->{$hostname}->{ $l[0] } ) {
+ $stat->{$instance}->{rx} += $l[1];
+ $stat->{$instance}->{tx} += $l[9];
+ } elsif ( $l[0] =~ m/eth/ ) { # connect hardware eth devices under node
+ $stat->{ '__' . $hostname }->{rx} += $l[1];
+ $stat->{ '__' . $hostname }->{tx} += $l[9];
+ }
+}
+
+
goto next_node if @nodes;
+
+
+# dump some useful data structures
+
+sub tab_dump {
+ my ( $name, $hash ) = @_;
+ warn "# $name\n";
+ foreach my $key ( sort keys %$hash ) {
+ warn $key, "\t", $hash->{$key}, "\n";
+ }
+}
+
+
+
+foreach my $node ( sort keys %$mac_to_name ) {
+ tab_dump "$node mac instance", $mac_to_name->{$node};
+}
+#warn Dumper( $mac_to_name );
+#tab_dump 'instance_tap', $instance_tap;
+#warn Dumper( $instance_tap );
+#warn Dumper( $tap_instance );
+
+
warn "# stat ", Dumper( $stat ) if $DEBUG;
-XXX( @ps_cols );
+
+
+# dump tablable ascii output
+
+#XXX( @ps_cols );
sub push_line {
my @l = @_;
push_line( $name, map { $stat->{$name}->{$_} } ps_cols_visible );
}
-warn '# mac_to_name ', Dumper( $mac_to_name );
-
-XXX $lines;
+#XXX $lines;
my $fmt = join(' ', map { '%' . $_ . 's' } @{ $lines->{len} } ) . "\n";
warn "# fmt = [$fmt]" if $DEBUG;