Проблемы со скоростью интернета
Была таже картина - все дело как оказалость в правильной настройке очереди , когда сделали так то все заработало
/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 там все примеры и формулы расчета для пропускной способности трубы - как оказалось сильно уменьшает нагрузку на сервер и режет скорость более плавно
/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 там все примеры и формулы расчета для пропускной способности трубы - как оказалось сильно уменьшает нагрузку на сервер и режет скорость более плавно
Код: Выделить всё
${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
Вы одним правилом режете в оба конца или двумя ?Oleg_121
У меня два правила:
netgraph tablearg all from table(1) to any out
netgraph tablearg all from any to table(2) out
Нода ng_car стыкуется обоими хуками с ng_ipfw, в первую таблицу передается номер первого хука ipfw как аргумент для адреса, а во вторую - номер второго хука для того же адреса. Нода создается и программируется скриптом для управления доступом, который в свою очередь вызывается из RFW.
netgraph tablearg all from table(1) to any out
netgraph tablearg all from any to table(2) out
Нода ng_car стыкуется обоими хуками с ng_ipfw, в первую таблицу передается номер первого хука ipfw как аргумент для адреса, а во вторую - номер второго хука для того же адреса. Нода создается и программируется скриптом для управления доступом, который в свою очередь вызывается из RFW.
-
- Сообщения: 21
- Зарегистрирован: Чт фев 12, 2009 14:12
- Откуда: С-Петербург
- Контактная информация:
JAO
А можно с примерном настройки например на тарифе 7 мегабит ?
буду благодарен, уже непонятно сколько бьемся с проблемой ...
может все дело в том, что канал на интернет уже 400 мегабит и клиентов активных в пиках 3000 тысячи ? И надо смотреть на сиську и на уровне компа уже нечего и пыхтеть ?
Тарифы сейчас такие
512 кб/с
2 мб/с
7 мб/с
9 мб/с
12 мб/с
15 мб/с
18 мб/с
Днем когда нет нагрузки режет более мение, хотя Upload меньше заявленного ...
После 18 реально происходит звиздец, особенно проседает канал на зарубежье ... Пинг остается в норме а скорость падает.
А можно с примерном настройки например на тарифе 7 мегабит ?
буду благодарен, уже непонятно сколько бьемся с проблемой ...
может все дело в том, что канал на интернет уже 400 мегабит и клиентов активных в пиках 3000 тысячи ? И надо смотреть на сиську и на уровне компа уже нечего и пыхтеть ?
Тарифы сейчас такие
512 кб/с
2 мб/с
7 мб/с
9 мб/с
12 мб/с
15 мб/с
18 мб/с
Днем когда нет нагрузки режет более мение, хотя Upload меньше заявленного ...
После 18 реально происходит звиздец, особенно проседает канал на зарубежье ... Пинг остается в норме а скорость падает.
-
- Сообщения: 21
- Зарегистрирован: Чт фев 12, 2009 14:12
- Откуда: С-Петербург
- Контактная информация:
Вот как примерно выглядит тариф 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
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
Понял. Вот эта перловая каша называется скрипт управления доступом, переделайте его под себя. Там самое интересное - это создание и программирование ноды ng_car. Таблицы 20-23 содержат привязку ноды к адресу, таблицы 1,2 - это контроль доступа (есть адрес в таблице - пустит, нет адреса - свободен). Реально хватит одной пары таблиц для нарезки, скажем 20 и 21 (у меня две пары, потому что там гибрид туннелей и простого шлюза). Как резать, выше уже писал.
Правила доступа в биллинге такие
open UIP n
close UIP
n - номер скорости 1-6 (см. скрипт)
Правила доступа в биллинге такие
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 (($d1 << 24) | ($d2 << 16) | ($d3 << 8) | $d4);
}
sub ipaddr2shid
{ my $addr = shift (@_);
($d1,$d2,$d3,$d4) = split (/\./,$addr);
return $d3*1000+$d4;
}
sub ipaddr2fwhid
{ my $addr = shift (@_);
($d1,$d2,$d3,$d4) = split (/\./,$addr);
return ($d3*1000+$d4)*2;
}
$ipfw_cmd = '/sbin/ipfw -q';
$ngctl_cmd = '/usr/sbin/ngctl';
$max_speedlimit = 6;
@speedlist = (64,128,256,512,1024,2048);
$iprange_direct_low = ipaddr_aton ('xx.xx.xx.xx');
$iprange_direct_high = ipaddr_aton ('xx.xx.xx.xx');
$iprange_tunnel_low = ipaddr_aton ('xx.xx.xx.xx');
$iprange_tunnel_high = ipaddr_aton ('xx.xx.xx.xx');
$iprange_tunnel_real_1_low = ipaddr_aton ('xx.xx.xx.xx');
$iprange_tunnel_real_1_high = ipaddr_aton ('xx.xx.xx.xx');
if (defined ($ARGV[0]))
{ if ($ARGV[0] =~ /^[Oo][Pp][Ee][Nn]$/)
{ if ($ARGV[1] =~ /^[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}$/)
{ $customer = $ARGV[1];
$ipaddr = ipaddr_aton ($customer);
$table_num = 0;
if (($ipaddr > $iprange_direct_low) && ($ipaddr < $iprange_direct_high))
{ $table_num = 2;
}
else
{ if (($ipaddr > $iprange_tunnel_low) && ($ipaddr < $iprange_tunnel_high))
{ $table_num = 1;
}
else
{ if (($ipaddr > $iprange_tunnel_real_1_low) && ($ipaddr < $iprange_tunnel_real_1_high))
{ $table_num = 11;
}
}
}
if ($table_num != 0)
{ if (defined ($ARGV[2]))
{ if ($ARGV[2] =~ /^[[:digit:]]{1,3}$/)
{ $limit_num = $ARGV[2];
if (($limit_num >= 1) && ($limit_num <= $max_speedlimit))
{ $speed = $speedlist[$limit_num-1]*1024;
$shaper_id = ipaddr2shid ($customer);
$fwhook_id = ipaddr2fwhid ($customer);
if (defined (open (fh,"| $ngctl_cmd -f-")))
{ print fh "mkpeer ipfw: car ",$fwhook_id," upper\n";
print fh "name ipfw:",$fwhook_id," sh",$shaper_id,"\n";
print fh "connect sh",$shaper_id,": ipfw: lower ",$fwhook_id + 1,"\n";
print fh "msg sh",$shaper_id,": setconf { upstream={ cbs=",$speed / 8," ebs=",$speed / 8," cir=",$speed," greenAction=1 yellowAction=1 redAction=2 mode=2 } downstream={ cbs=",$speed / 8," ebs=",$speed / 8," cir=",$speed," greenAction=1 yellowAction=1 redAction=2 mode=2 } }\n";
close fh;
}
if ($table_num == 1)
{ system (sprintf ("%s table 20 add %s %d",$ipfw_cmd,$customer,$fwhook_id));
system (sprintf ("%s table 21 add %s %d",$ipfw_cmd,$customer,$fwhook_id + 1));
system (sprintf ("%s table %d add %s",$ipfw_cmd,$table_num,$customer));
}
else
{ if ($table_num == 2)
{ system (sprintf ("%s table 22 add %s %d",$ipfw_cmd,$customer,$fwhook_id));
system (sprintf ("%s table 23 add %s %d",$ipfw_cmd,$customer,$fwhook_id + 1));
system (sprintf ("%s table %d add %s",$ipfw_cmd,$table_num,$customer));
}
}
}
}
}
else
{ system (sprintf ("%s table %d add %s",$ipfw_cmd,$table_num,$customer));
}
}
}
}
else
{ if ($ARGV[0] =~ /^[Cc][Ll][Oo][Ss][Ee]$/)
{ if ($ARGV[1] =~ /^[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}$/)
{ $customer = $ARGV[1];
$ipaddr = ipaddr_aton ($customer);
$table_num = 0;
if (($ipaddr > $iprange_direct_low) && ($ipaddr < $iprange_direct_high))
{ $table_num = 2;
}
else
{ if (($ipaddr > $iprange_tunnel_low) && ($ipaddr < $iprange_tunnel_high))
{ $table_num = 1;
}
else
{ if (($ipaddr > $iprange_tunnel_real_1_low) && ($ipaddr < $iprange_tunnel_real_1_high))
{ $table_num = 11;
}
}
}
if ($table_num != 0)
{ system (sprintf ("%s table %d delete %s",$ipfw_cmd,$table_num,$customer));
$shaper_id = ipaddr2shid ($customer);
$shaper_name = "sh$shaper_id";
$shaper_found = 0;
if (defined (open (fh,"$ngctl_cmd list |")))
{ while (!eof (fh))
{ $line = readline (fh);
chomp ($line);
($n,$nodename,$t,$nodetype) = split (' ',$line);
if ($nodetype eq 'car')
{ if ($nodename eq $shaper_name)
{ $shaper_found = 1;
}
}
}
close fh;
}
if ($shaper_found == 1)
{ if (defined (open (fh,"| $ngctl_cmd -f-")))
{ print fh "shutdown sh",$shaper_id,":\n";
close fh;
}
}
if ($table_num == 1)
{ system (sprintf ("%s table 20 delete %s",$ipfw_cmd,$customer));
system (sprintf ("%s table 21 delete %s",$ipfw_cmd,$customer));
}
else
{ if ($table_num == 2)
{ system (sprintf ("%s table 22 delete %s",$ipfw_cmd,$customer));
system (sprintf ("%s table 23 delete %s",$ipfw_cmd,$customer));
}
}
}
}
}
}
}