|
|
ru.perl- RU.PERL ---------------------------------------------------------------------- From : Nurlan Mukhanov 2:5020/400 21 Apr 2002 03:27:36 To : All Subject : Скорость сети --------------------------------------------------------------------------------
сразу скажу, что Linuxe и Perl новичек и возможно есть другие способы
определения скорости, но я намутил вот что
скрипт запускается с периодичностью в минуту.. поэтому в подпрограмме идет
деление на 60 (секунд)
============================================================================
============
#!/usr/bin/perl
my $tr = traf('eth1');
my $speed = speed($tr);
print STDERR "\nIN: $speed->{'in'} kb/s, OUT: $speed->{'out'} kb/s\n\n";
sub traf {
my $int = shift;
my @eth = `ifconfig $int`;
my %traf;
$traf{'collis'} = "0";
$traf{'output'} = "0";
$traf{'input'} = "0";
# Возвращаем нули, если был указан не правильный интерфейс
return \%traf if (scalar(@eth)<3);
# Считываем весь массив и забираем только те значения
# где хранятся коллизии и переданные байты
my @val = grep(/.*?(collisions|RX bytes)/,@eth);
$val[0] =~ /.*?(\d+)\s+.*/;
$traf{'collis'} = $1;
$val[1] =~ /.*?(\d+)\s+\(.*?\).*?(\d+)\s+.*/;
$traf{'output'} = $2;
$traf{'input'} = $1;
# Открываем файл и забираем от туда значения
open(ETH,"$DIR/eth_last");
my @value = split(/\s/,<ETH>);
close(ETH);
# Открываем еще раз файл, но уже на запись
# Записываем туда последние значения, которые были получены
open(ETH,">$DIR/eth_last");
print ETH "$traf{'collis'} $traf{'output'} $traf{'input'}";
close(ETH);
# Сравниваем те значения, которые были считанны с файла
# и те, которые только что получили.
# Если в файле значения меньше тех которые мы только что получили, то
# от текущих значений отнимаем предыдущие.
# Мы бы могли использовать в базе значения COUNT, но тогда будет не
# верный отсчет, если интерфейс упадет, или компьютер будет
# перезапущен.
if (defined($value[0]) and $traf{'output'} > $value[1]) {
$traf{'output'} -= $value[1];
$traf{'input'} -= $value[2];
$traf{'collis'} -= $value[0];
} else {
# Мы не можем с точностью определить сколько времени работал
# интерфейс, и поэтому приравняем элементы хеша к нулю.
# При следующем запросе мы высчитаем разницу с теми значениями,
# которые были записаны в файл
$traf{'collis'} = 0;
$traf{'output'} = 0;
$traf{'input'} = 0;
};
# Записываем в файл текущие значения
open(ETH,">$DIR/eth_cur");
print ETH "$traf{'collis'} $traf{'output'} $traf{'input'}";
close(ETH);
return \%traf;
}
sub speed {
my $pk = shift;
my %spd;
$spd{'in'} = sprintf("%.1f",$pk->{'input'} / 60 / 1024 * 10);
$spd{'out'} = sprintf("%.1f",$pk->{'output'} / 60 / 1024 * 10);
return \%spd;
}
============================================================================
============
Получаю примерно вот что:
IN: 35.3 kb/s, OUT: 165.9 kb/s
Hа сколько точно измерения?
Может есть другие способы?
--- ifmail v.2.15dev5
* Origin: Demos online service (2:5020/400)
Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.perl/78240036b8f5.html, оценка из 5, голосов 10
|