Проблемы со скоростью интернета

Технические вопросы по UTM 5.0
JAO
Сообщения: 1153
Зарегистрирован: Вт дек 11, 2007 08:17

Сообщение JAO »

А Speedtest вообще выдает верные данные? у меня ему доверия нету, trafshow и тот точнее показывает.

NShut
Сообщения: 72
Зарегистрирован: Ср апр 01, 2009 12:39

Сообщение NShut »

сам лично для теста использую iperf
правда это клиент сервер и если удаленная машина виндовс то данные тоже могут быть недостоверны
в добавку, создать правило отдельно для себя и тестовой машины. то что канал не загружен ничего не говорит. Все тесты лучше проводить на отдельных правилах

JAO
Сообщения: 1153
Зарегистрирован: Вт дек 11, 2007 08:17

Сообщение JAO »

При нарезке через pipe скорость в байтах может зависеть от размера пакетов. Поэтому тестировать надо, гоняя исключительно полновесные пакеты и исключительно сквозь этот конкретный роутер.

Oleg_121
Сообщения: 81
Зарегистрирован: Пн апр 14, 2008 21:09

Сообщение Oleg_121 »

Была таже картина - все дело как оказалость в правильной настройке очереди , когда сделали так то все заработало
/sbin/ipfw pipe 500 config bw 64Kbit/s queue 2kbytes gred 0.002/0kbytes/200bytes/0.99 mask dst-ip 0xffffffff
/sbin/ipfw pipe 16 config bw 16Kbit/s queue 4kbytes gred 0.02/2kbytes/3kbytes/0.5 mask dst-ip 0xffffffff
/sbin/ipfw pipe 32 config bw 64Kbit/s queue 8kbytes gred 0.02/2kbytes/5kbytes/0.5 mask dst-ip 0xffffffff
/sbin/ipfw pipe 64 config bw 128Kbit/s queue 19kbytes gred 0.02/4kbytes/10kbytes/0.5 mask dst-ip 0xffffffff
/sbin/ipfw pipe 128 config bw 256Kbit/s queue 39kbytes gred 0.02/7kbytes/19kbytes/0.5 mask dst-ip 0xffffffff
/sbin/ipfw pipe 256 config bw 512Kbit/s queue 78kbytes gred 0.02/13kbytes/39kbytes/0.5 mask dst-ip 0xffffffff
/sbin/ipfw pipe 512 config bw 2048Kbit/s queue 150kbytes gred 0.02/25kbytes/75kbytes/0.5 mask dst-ip 0xffffffff
/sbin/ipfw pipe 1024 config bw 4096Kbit/s queue 300kbytes gred 0.02/50kbytes/150kbytes/0.5 mask dst-ip 0xffffffff
/sbin/ipfw pipe 2048 config bw 8192Kbit/s queue 600kbytes gred 0.02/100kbytes/300kbytes/0.5 mask dst-ip 0xffffffff
/sbin/ipfw pipe 4096 config bw 10000Kbit/s queue 1000kbytes gred 0.02/200kbytes/600kbytes/0.5 mask dst-ip 0xffffffff

В инете читаем документацию про gred там все примеры и формулы расчета для пропускной способности трубы - как оказалось сильно уменьшает нагрузку на сервер и режет скорость более плавно

vobbs
Сообщения: 70
Зарегистрирован: Вт янв 22, 2008 17:02

Сообщение vobbs »

Код: Выделить всё

${ipfw} pipe 11 config bw 7168Kbit/s queue 560kbytes gred 0.02/95kbytes/280kbytes/0.5 mask src-ip 0xffffffff
${ipfw} pipe 12 config bw 7168Kbit/s queue 560kbytes gred 0.02/95kbytes/280kbytes/0.5 mask dst-ip 0xffffffff
${ipfw} add 1011 pipe 11 ip from "table(6)" to any out xmit $ext
${ipfw} add 1012 pipe 12 ip from any to "table(6)" out xmit $int
Порезали так. Теперь 7Мбит вообще нет нигде, но в оба конца примерно одинаково показывает. То 3 и 3, то 5 и 5.
Oleg_121
Вы одним правилом режете в оба конца или двумя ?

JAO
Сообщения: 1153
Зарегистрирован: Вт дек 11, 2007 08:17

Сообщение JAO »

Может лучше ng_ipfw+ng_car?

vobbs
Сообщения: 70
Зарегистрирован: Вт янв 22, 2008 17:02

Сообщение vobbs »

JAO писал(а):Может лучше ng_ipfw+ng_car?
Пробовали и так - особой разницы не заметно.

South
Сообщения: 21
Зарегистрирован: Чт фев 12, 2009 14:12
Откуда: С-Петербург
Контактная информация:

Сообщение South »

ng_car ... а разве там не для каждого IP надо свое правило ? это ведь помоему дополнительная нагрузка ?

JAO
Сообщения: 1153
Зарегистрирован: Вт дек 11, 2007 08:17

Сообщение JAO »

У меня два правила:

netgraph tablearg all from table(1) to any out
netgraph tablearg all from any to table(2) out

Нода ng_car стыкуется обоими хуками с ng_ipfw, в первую таблицу передается номер первого хука ipfw как аргумент для адреса, а во вторую - номер второго хука для того же адреса. Нода создается и программируется скриптом для управления доступом, который в свою очередь вызывается из RFW.

South
Сообщения: 21
Зарегистрирован: Чт фев 12, 2009 14:12
Откуда: С-Петербург
Контактная информация:

Сообщение South »

JAO

А можно с примерном настройки например на тарифе 7 мегабит ?

буду благодарен, уже непонятно сколько бьемся с проблемой ...

может все дело в том, что канал на интернет уже 400 мегабит и клиентов активных в пиках 3000 тысячи ? И надо смотреть на сиську и на уровне компа уже нечего и пыхтеть ?

Тарифы сейчас такие

512 кб/с
2 мб/с
7 мб/с
9 мб/с
12 мб/с
15 мб/с
18 мб/с

Днем когда нет нагрузки режет более мение, хотя Upload меньше заявленного ...

После 18 реально происходит звиздец, особенно проседает канал на зарубежье ... Пинг остается в норме а скорость падает.

JAO
Сообщения: 1153
Зарегистрирован: Вт дек 11, 2007 08:17

Сообщение JAO »

South, у вас dummynet режет (т.е. через pipe)?

South
Сообщения: 21
Зарегистрирован: Чт фев 12, 2009 14:12
Откуда: С-Петербург
Контактная информация:

Сообщение South »

Вот как примерно выглядит тариф 9 мегабит возьмем.


int=igb0 - канал в локалку
ext=igb1 - канал номер 1 300 мегабит
ext0=em0 - канал номер 2 100 мегабит


${ipfw} pipe 13 config bw 9216Kbit/s queue 900kbytes gred 0.02/110kbytes/320kbytes/0.5 mask src-ip 0xffffffff
${ipfw} pipe 14 config bw 9216Kbit/s queue 900kbytes gred 0.02/110kbytes/320kbytes/0.5 mask dst-ip 0xffffffff
${ipfw} add 1013 pipe 13 ip from "table(7)" to any out xmit $ext
${ipfw} add 1013 pipe 13 ip from "table(7)" to any out xmit $ext0
${ipfw} add 1014 pipe 14 ip from any to "table(7)" out xmit $int

JAO
Сообщения: 1153
Зарегистрирован: Вт дек 11, 2007 08:17

Сообщение JAO »

Понял. Вот эта перловая каша называется скрипт управления доступом, переделайте его под себя. Там самое интересное - это создание и программирование ноды ng_car. Таблицы 20-23 содержат привязку ноды к адресу, таблицы 1,2 - это контроль доступа (есть адрес в таблице - пустит, нет адреса - свободен). Реально хватит одной пары таблиц для нарезки, скажем 20 и 21 (у меня две пары, потому что там гибрид туннелей и простого шлюза). Как резать, выше уже писал.

Правила доступа в биллинге такие
open UIP n
close UIP

n - номер скорости 1-6 (см. скрипт)

Код: Выделить всё

#!/usr/bin/perl

sub ipaddr_ntoa
{ my $addr = shift (@_);
  return sprintf ('%d.%d.%d.%d',
                  ($addr & 0xFF000000) >> 24,
                  ($addr & 0x00FF0000) >> 16,
                  ($addr & 0x0000FF00) >> 8,
                  ($addr & 0x000000FF));
}

sub ipaddr_aton
{ my $addr = shift (@_);
  ($d1,$d2,$d3,$d4) = split (/\./,$addr);
  return &#40;&#40;$d1 << 24&#41; | &#40;$d2 << 16&#41; | &#40;$d3 << 8&#41; | $d4&#41;;
&#125;

sub ipaddr2shid
&#123; my $addr = shift &#40;@_&#41;;
  &#40;$d1,$d2,$d3,$d4&#41; = split &#40;/\./,$addr&#41;;
  return $d3*1000+$d4;
&#125;

sub ipaddr2fwhid
&#123; my $addr = shift &#40;@_&#41;;
  &#40;$d1,$d2,$d3,$d4&#41; = split &#40;/\./,$addr&#41;;
  return &#40;$d3*1000+$d4&#41;*2;
&#125;

$ipfw_cmd = '/sbin/ipfw -q';
$ngctl_cmd = '/usr/sbin/ngctl';

$max_speedlimit = 6;
@speedlist = &#40;64,128,256,512,1024,2048&#41;;

$iprange_direct_low = ipaddr_aton &#40;'xx.xx.xx.xx'&#41;;
$iprange_direct_high = ipaddr_aton &#40;'xx.xx.xx.xx'&#41;;
$iprange_tunnel_low = ipaddr_aton &#40;'xx.xx.xx.xx'&#41;;
$iprange_tunnel_high = ipaddr_aton &#40;'xx.xx.xx.xx'&#41;;
$iprange_tunnel_real_1_low = ipaddr_aton &#40;'xx.xx.xx.xx'&#41;;
$iprange_tunnel_real_1_high = ipaddr_aton &#40;'xx.xx.xx.xx'&#41;;

if &#40;defined &#40;$ARGV&#91;0&#93;&#41;&#41;
&#123; if &#40;$ARGV&#91;0&#93; =~ /^&#91;Oo&#93;&#91;Pp&#93;&#91;Ee&#93;&#91;Nn&#93;$/&#41;
  &#123; if &#40;$ARGV&#91;1&#93; =~ /^&#91;&#91;&#58;digit&#58;&#93;&#93;&#123;1,3&#125;\.&#91;&#91;&#58;digit&#58;&#93;&#93;&#123;1,3&#125;\.&#91;&#91;&#58;digit&#58;&#93;&#93;&#123;1,3&#125;\.&#91;&#91;&#58;digit&#58;&#93;&#93;&#123;1,3&#125;$/&#41;
    &#123; $customer = $ARGV&#91;1&#93;;
      $ipaddr = ipaddr_aton &#40;$customer&#41;;
      $table_num = 0;
      if &#40;&#40;$ipaddr > $iprange_direct_low&#41; && &#40;$ipaddr < $iprange_direct_high&#41;&#41;
      &#123; $table_num = 2;
      &#125;
      else
      &#123; if &#40;&#40;$ipaddr > $iprange_tunnel_low&#41; && &#40;$ipaddr < $iprange_tunnel_high&#41;&#41;
        &#123; $table_num = 1;
	&#125;
	else
	&#123; if &#40;&#40;$ipaddr > $iprange_tunnel_real_1_low&#41; && &#40;$ipaddr < $iprange_tunnel_real_1_high&#41;&#41;
	  &#123; $table_num = 11;
	  &#125;
        &#125;
      &#125;
      if &#40;$table_num != 0&#41;
      &#123; if &#40;defined &#40;$ARGV&#91;2&#93;&#41;&#41;
        &#123; if &#40;$ARGV&#91;2&#93; =~ /^&#91;&#91;&#58;digit&#58;&#93;&#93;&#123;1,3&#125;$/&#41;
	  &#123; $limit_num = $ARGV&#91;2&#93;;
	    if &#40;&#40;$limit_num >= 1&#41; && &#40;$limit_num <= $max_speedlimit&#41;&#41;
	    &#123; $speed = $speedlist&#91;$limit_num-1&#93;*1024;
	      $shaper_id = ipaddr2shid &#40;$customer&#41;;
	      $fwhook_id = ipaddr2fwhid &#40;$customer&#41;;
	      if &#40;defined &#40;open &#40;fh,"| $ngctl_cmd -f-"&#41;&#41;&#41;
	      &#123; print fh "mkpeer ipfw&#58; car ",$fwhook_id," upper\n";
	        print fh "name ipfw&#58;",$fwhook_id," sh",$shaper_id,"\n";
	        print fh "connect sh",$shaper_id,"&#58; ipfw&#58; lower ",$fwhook_id + 1,"\n";
	        print fh "msg sh",$shaper_id,"&#58; setconf &#123; upstream=&#123; cbs=",$speed / 8," ebs=",$speed / 8," cir=",$speed," greenAction=1 yellowAction=1 redAction=2 mode=2 &#125; downstream=&#123; cbs=",$speed / 8," ebs=",$speed / 8," cir=",$speed," greenAction=1 yellowAction=1 redAction=2 mode=2 &#125; &#125;\n";
	        close fh;
	      &#125;
	      if &#40;$table_num == 1&#41;
	      &#123; system &#40;sprintf &#40;"%s table 20 add %s %d",$ipfw_cmd,$customer,$fwhook_id&#41;&#41;;
	        system &#40;sprintf &#40;"%s table 21 add %s %d",$ipfw_cmd,$customer,$fwhook_id + 1&#41;&#41;;
		system &#40;sprintf &#40;"%s table %d add %s",$ipfw_cmd,$table_num,$customer&#41;&#41;;
	      &#125;
	      else
	      &#123; if &#40;$table_num == 2&#41;
	        &#123; system &#40;sprintf &#40;"%s table 22 add %s %d",$ipfw_cmd,$customer,$fwhook_id&#41;&#41;;
	          system &#40;sprintf &#40;"%s table 23 add %s %d",$ipfw_cmd,$customer,$fwhook_id + 1&#41;&#41;;
		  system &#40;sprintf &#40;"%s table %d add %s",$ipfw_cmd,$table_num,$customer&#41;&#41;;
	        &#125;
	      &#125;
	    &#125;
	  &#125;
	&#125;
	else
	&#123; system &#40;sprintf &#40;"%s table %d add %s",$ipfw_cmd,$table_num,$customer&#41;&#41;;
	&#125;
      &#125;
    &#125;
  &#125;
  else
  &#123; if &#40;$ARGV&#91;0&#93; =~ /^&#91;Cc&#93;&#91;Ll&#93;&#91;Oo&#93;&#91;Ss&#93;&#91;Ee&#93;$/&#41;
    &#123; if &#40;$ARGV&#91;1&#93; =~ /^&#91;&#91;&#58;digit&#58;&#93;&#93;&#123;1,3&#125;\.&#91;&#91;&#58;digit&#58;&#93;&#93;&#123;1,3&#125;\.&#91;&#91;&#58;digit&#58;&#93;&#93;&#123;1,3&#125;\.&#91;&#91;&#58;digit&#58;&#93;&#93;&#123;1,3&#125;$/&#41;
      &#123; $customer = $ARGV&#91;1&#93;;
        $ipaddr = ipaddr_aton &#40;$customer&#41;;
	$table_num = 0;
	if &#40;&#40;$ipaddr > $iprange_direct_low&#41; && &#40;$ipaddr < $iprange_direct_high&#41;&#41;
	&#123; $table_num = 2;
	&#125;
	else
	&#123; if &#40;&#40;$ipaddr > $iprange_tunnel_low&#41; && &#40;$ipaddr < $iprange_tunnel_high&#41;&#41;
	  &#123; $table_num = 1;
	  &#125;
	  else
	  &#123; if &#40;&#40;$ipaddr > $iprange_tunnel_real_1_low&#41; && &#40;$ipaddr < $iprange_tunnel_real_1_high&#41;&#41;
	    &#123; $table_num = 11;
	    &#125;
	  &#125;
	&#125;
	if &#40;$table_num != 0&#41;
	&#123; system &#40;sprintf &#40;"%s table %d delete %s",$ipfw_cmd,$table_num,$customer&#41;&#41;;
	  $shaper_id = ipaddr2shid &#40;$customer&#41;;
          $shaper_name = "sh$shaper_id";
	  $shaper_found = 0;
	  if &#40;defined &#40;open &#40;fh,"$ngctl_cmd list |"&#41;&#41;&#41;
	  &#123; while &#40;!eof &#40;fh&#41;&#41;
	    &#123; $line = readline &#40;fh&#41;;
	      chomp &#40;$line&#41;;
	      &#40;$n,$nodename,$t,$nodetype&#41; = split &#40;' ',$line&#41;;
	      if &#40;$nodetype eq 'car'&#41;
	      &#123; if &#40;$nodename eq $shaper_name&#41;
	        &#123; $shaper_found = 1;
	        &#125;
	      &#125;
	    &#125;
	    close fh;
	  &#125;
	  if &#40;$shaper_found == 1&#41;
	  &#123; if &#40;defined &#40;open &#40;fh,"| $ngctl_cmd -f-"&#41;&#41;&#41;
	    &#123; print fh "shutdown sh",$shaper_id,"&#58;\n";
	      close fh;
	    &#125;
	  &#125;
	  if &#40;$table_num == 1&#41;
	  &#123; system &#40;sprintf &#40;"%s table 20 delete %s",$ipfw_cmd,$customer&#41;&#41;;
	    system &#40;sprintf &#40;"%s table 21 delete %s",$ipfw_cmd,$customer&#41;&#41;;
	  &#125;
	  else
	  &#123; if &#40;$table_num == 2&#41;
	    &#123; system &#40;sprintf &#40;"%s table 22 delete %s",$ipfw_cmd,$customer&#41;&#41;;
	      system &#40;sprintf &#40;"%s table 23 delete %s",$ipfw_cmd,$customer&#41;&#41;;
	    &#125;
	  &#125;
	&#125;
      &#125;
    &#125;
  &#125;
&#125;

South
Сообщения: 21
Зарегистрирован: Чт фев 12, 2009 14:12
Откуда: С-Петербург
Контактная информация:

Сообщение South »

Спасибо сейчас попробуем. Только я вижу что тарифы маленькие ... Сколько у вас клиентов и ширина канала ?

До 2000 активных клиентов в пиках у нас небыло проблем

JAO
Сообщения: 1153
Зарегистрирован: Вт дек 11, 2007 08:17

Сообщение JAO »

6 мегабит на данный момент. Клиентов не помню, давно не считал. Наверно под тысячу уже. Точно не скажу.

Ответить