Blame scripts/ibswportwatch.pl

Packit db064d
#!/usr/bin/perl
Packit db064d
#
Packit db064d
# Copyright (c) 2008 Voltaire, Inc. All rights reserved.
Packit db064d
# Copyright (c) 2006 The Regents of the University of California.
Packit db064d
#
Packit db064d
# Produced at Lawrence Livermore National Laboratory.
Packit db064d
# Written by Ira Weiny <weiny2@llnl.gov>.
Packit db064d
#
Packit db064d
# This software is available to you under a choice of one of two
Packit db064d
# licenses.  You may choose to be licensed under the terms of the GNU
Packit db064d
# General Public License (GPL) Version 2, available from the file
Packit db064d
# COPYING in the main directory of this source tree, or the
Packit db064d
# OpenIB.org BSD license below:
Packit db064d
#
Packit db064d
#     Redistribution and use in source and binary forms, with or
Packit db064d
#     without modification, are permitted provided that the following
Packit db064d
#     conditions are met:
Packit db064d
#
Packit db064d
#      - Redistributions of source code must retain the above
Packit db064d
#        copyright notice, this list of conditions and the following
Packit db064d
#        disclaimer.
Packit db064d
#
Packit db064d
#      - Redistributions in binary form must reproduce the above
Packit db064d
#        copyright notice, this list of conditions and the following
Packit db064d
#        disclaimer in the documentation and/or other materials
Packit db064d
#        provided with the distribution.
Packit db064d
#
Packit db064d
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
Packit db064d
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
Packit db064d
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
Packit db064d
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
Packit db064d
# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
Packit db064d
# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
Packit db064d
# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
Packit db064d
# SOFTWARE.
Packit db064d
#
Packit db064d
Packit db064d
use strict;
Packit db064d
Packit db064d
use Getopt::Std;
Packit db064d
use IBswcountlimits;
Packit db064d
Packit db064d
my $sw_addr = "";
Packit db064d
my $sw_port = "";
Packit db064d
my $verbose = undef;
Packit db064d
Packit db064d
# =========================================================================
Packit db064d
#
Packit db064d
sub print_verbose
Packit db064d
{
Packit db064d
	if ($verbose) {
Packit db064d
		print $_[0];
Packit db064d
	}
Packit db064d
}
Packit db064d
Packit db064d
# =========================================================================
Packit db064d
#
Packit db064d
sub print_all_counts
Packit db064d
{
Packit db064d
	if (!$verbose) { return; }
Packit db064d
Packit db064d
	print "   Counter\t\t\tNew ==> Old\n";
Packit db064d
	foreach my $cnt (@IBswcountlimits::counters) {
Packit db064d
		print
Packit db064d
"   $cnt\t\t\t$IBswcountlimits::new_counts{$cnt} ==> $IBswcountlimits::cur_counts{$cnt}\n";
Packit db064d
	}
Packit db064d
}
Packit db064d
Packit db064d
# =========================================================================
Packit db064d
#
Packit db064d
sub usage_and_exit
Packit db064d
{
Packit db064d
	my $prog = $_[0];
Packit db064d
	print
Packit db064d
	  "Usage: $prog [-p <pause_time> -b -v -n <cycles> -G] <guid|lid> <port>\n";
Packit db064d
	print "   Attempt to diagnose a problem on a port\n";
Packit db064d
	print
Packit db064d
"   Run this on a link while a job is running which utilizes that link.\n";
Packit db064d
	print
Packit db064d
"   -p <pause_time> define the ammount of time between counter polls (default $IBswcountlimits::pause_time)\n";
Packit db064d
	print "   -v Be verbose\n";
Packit db064d
	print "   -n <cycles> run n cycles then exit (default -1 == forever)\n";
Packit db064d
	print "   -G Address provided is a GUID\n";
Packit db064d
	print "   -b report bytes/second packets/second\n";
Packit db064d
	exit 2;
Packit db064d
}
Packit db064d
Packit db064d
# =========================================================================
Packit db064d
#
Packit db064d
sub clear_counters
Packit db064d
{
Packit db064d
	# clear the counters
Packit db064d
	foreach my $count (@IBswcountlimits::counters) {
Packit db064d
		$IBswcountlimits::cur_counts{$count} = 0;
Packit db064d
		$IBswcountlimits::new_counts{$count} = 0;
Packit db064d
	}
Packit db064d
}
Packit db064d
Packit db064d
# =========================================================================
Packit db064d
#
Packit db064d
sub mv_counts
Packit db064d
{
Packit db064d
	foreach my $count (@IBswcountlimits::counters) {
Packit db064d
		$IBswcountlimits::cur_counts{$count} =
Packit db064d
		  $IBswcountlimits::new_counts{$count};
Packit db064d
	}
Packit db064d
}
Packit db064d
Packit db064d
# =========================================================================
Packit db064d
# use perfquery to get the counters.
Packit db064d
my $GUID = "";
Packit db064d
Packit db064d
sub get_new_counts
Packit db064d
{
Packit db064d
	my $addr = $_[0];
Packit db064d
	my $port = $_[1];
Packit db064d
	mv_counts;
Packit db064d
	ensure_cache_dir;
Packit db064d
	if (
Packit db064d
		system(
Packit db064d
"perfquery $GUID $addr $port > $IBswcountlimits::cache_dir/perfquery.out"
Packit db064d
		)
Packit db064d
	  )
Packit db064d
	{
Packit db064d
		die "perfquery failed : \"perfquery $GUID $addr $port\"\n";
Packit db064d
	}
Packit db064d
	open PERF_QUERY, "<$IBswcountlimits::cache_dir/perfquery.out"
Packit db064d
	  or die "cannot read '$IBswcountlimits::cache_dir/perfquery.out': $!\n";
Packit db064d
	while (my $line = <PERF_QUERY>) {
Packit db064d
		foreach my $count (@IBswcountlimits::counters) {
Packit db064d
			if ($line =~ /^$count:\.+(\d+)/) {
Packit db064d
				$IBswcountlimits::new_counts{$count} = $1;
Packit db064d
			}
Packit db064d
		}
Packit db064d
	}
Packit db064d
	close PERF_QUERY;
Packit db064d
}
Packit db064d
Packit db064d
my $cycle = -1;    # forever
Packit db064d
Packit db064d
my $bytes_per_second = undef;
Packit db064d
my $argv0            = `basename $0`;
Packit db064d
chomp $argv0;
Packit db064d
if (!getopts("hbvp:n:G"))        { usage_and_exit $argv0; }
Packit db064d
if (defined $Getopt::Std::opt_h) { usage_and_exit $argv0; }
Packit db064d
if (defined $Getopt::Std::opt_p) {
Packit db064d
	$IBswcountlimits::pause_time = $Getopt::Std::opt_p;
Packit db064d
}
Packit db064d
if (defined $Getopt::Std::opt_v) { $verbose          = $Getopt::Std::opt_v; }
Packit db064d
if (defined $Getopt::Std::opt_n) { $cycle            = $Getopt::Std::opt_n; }
Packit db064d
if (defined $Getopt::Std::opt_G) { $GUID             = "-G"; }
Packit db064d
if (defined $Getopt::Std::opt_b) { $bytes_per_second = $Getopt::Std::opt_b; }
Packit db064d
Packit db064d
my $sw_addr = $ARGV[0];
Packit db064d
my $sw_port = $ARGV[1];
Packit db064d
Packit db064d
sub main
Packit db064d
{
Packit db064d
	clear_counters;
Packit db064d
	get_new_counts($sw_addr, $sw_port);
Packit db064d
	while ($cycle != 0) {
Packit db064d
		print "Checking counts...\n";
Packit db064d
		sleep($IBswcountlimits::pause_time);
Packit db064d
		get_new_counts($sw_addr, $sw_port);
Packit db064d
		check_counter_rates;
Packit db064d
		if ($bytes_per_second) {
Packit db064d
			print_data_rates;
Packit db064d
		}
Packit db064d
		print_all_counts;
Packit db064d
		if ($cycle != -1) { $cycle = $cycle - 1; }
Packit db064d
	}
Packit db064d
}
Packit db064d
main;
Packit db064d