Linux – script velocidad interfaces

por | 14 junio, 2017

Un simple script en perl para calcular el throughput de un interfaz Linux. Recordemos que el throughput se entiende como la velocidad real de transporte del interfaz y siempre será menor que el ancho de banda (bandwidth) del interfaz.

Uso:  #  perl NetStat_Super_Extractor.pl [ethX] [B|P]

ethX: interfaz ethernet
B: resultados en bytes/seg.
P: resultados en paquetes/seg.


#!/usr/bin/perl
use warnings;
use strict;
my $if;
my $method;
my $theline;
my $indataA;
my $outdataA;
my $indata_acuA=0;
my $outdata_acuA=0;
my $indata_mediaA;
my $outdata_mediaA;
my $indata_lastA;
my $outdata_lastA;
my $iterA=0;
my $initA=1;
my $indataB;
my $outdataB;
my $indata_acuB=0;
my $outdata_acuB=0;
my $indata_mediaB;
my $outdata_mediaB;
my $indata_lastB;
my $outdata_lastB;
my $iterB=0;
my $initB=1;
if ($#ARGV == 1){
    $if = $ARGV[0];
    $method = $ARGV[1];
    while(1)
    {
        if ($method eq "B")
        {
            $theline=`/sbin/ifconfig $if | grep "RX bytes"`;
            if ($theline =~ m/^\s+RX bytes:(\d+)\s+\(.*\)\s+TX bytes:(\d+)\s+\(.*\)$/)
            {
                if ($initB == 0)
                {
                    $indataB = $1 - $indata_lastB;
                    $outdataB = $2 - $outdata_lastB;
                    $indata_acuB = $indata_acuB + $indataB;
                    $outdata_acuB = $outdata_acuB + $outdataB;
                    $indata_mediaB = $indata_acuB / $iterB;
                    $outdata_mediaB = $outdata_acuB / $iterB;
                    $indata_lastB = $1;
                    $outdata_lastB = $2;
                    print "RX Bytes: $indata_mediaB --- TX Bytes: $outdata_mediaB\n";
                }
                else
                {
                   $indata_lastB = $1;
                   $outdata_lastB = $2;
                }
                $iterB = $iterB + 1;
                $initB = 0;
            }
            sleep(1);
        }
        elsif($method eq "P")
        {
            $theline=`netstat -i | grep $if`;
            if ($theline =~ m/^$if\s+\d+\s+\d+\s+(\d+)\s+\d+\s+\d+\s+\d+\s+(\d+)\s+\d+\s+\d+\s+\d+\s+.*$/)
            {
                if ($initA == 0)
                {
                    $indataA = $1 - $indata_lastA;
                    $outdataA = $2 - $outdata_lastA;
                    $indata_acuA = $indata_acuA + $indataA;
                    $outdata_acuA = $outdata_acuA + $outdataA;
                    $indata_mediaA = $indata_acuA / $iterA;
                    $outdata_mediaA = $outdata_acuA / $iterA;
                    $indata_lastA = $1;
                    $outdata_lastA = $2;
                    print "RX Packets: $indata_mediaA --- TX Packets: $outdata_mediaA\n";
                }
                else
                {
                   $indata_lastA = $1;
                   $outdata_lastA= $2;
                }
                $iterA = $iterA + 1;
                $initA = 0;
            }
            sleep(1);
        }
    }
}
else
{
    print "Bad number of arguments!!!!, .... you need the INTERFACE and the METHOD (B or P)\n"   
}

 

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *