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