|
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 |
|