krovozhadina Posted September 6, 2011 Posted September 6, 2011 Как заставить эту связку работать? Много перечитал документации в интернетах, но ничего конкретного не нашел, а то что есть - не работает. Делаю так: 1. создаю таблицу и добавляю туда свой адрес. Адреса выдает mpd, при подключении срабатывает скрипт который берет выданный адрес и подставляет его в таблицу ipfw table 10 add $IP 10 2. в ipfw есть правило ${fwcmd} add 10 netgraph tablearg all from any to "table(10)" out via igb1 где igb1 внешний фейс 3. после этого стартует скрипт, #!/bin/sh ng=`awk "BEGIN { printf \"%04s\", substr(\"$1\", 3) }"` ng=`echo "$ng*1" | bc`; ng2=`echo "1000+$ng" | bc`; LOGIN="inet_$2"; shape=`echo "1024*$3" | bc`; cbsebs=`echo "$shape/8" | bc`; /usr/sbin/ngctl shutdown $LOGIN: /usr/sbin/ngctl mkpeer ipfw: car $ng upper; /usr/sbin/ngctl name ipfw:$ng $LOGIN; /usr/sbin/ngctl connect $LOGIN: ipfw: lower $ng2; /usr/sbin/ngctl msg $LOGIN: setconf { upstream={ cbs=${cbsebs} ebs=${cbsebs} cir=${shape} greenAction=1 yellowAction=1 redAction=2 mode=2 } downstream={ cbs=${cbsebs} ebs=${cbsebs} cir=${shape} greenAction=1 yellowAction=1 redAction=2 mode=2 } }; который должен связать хуки ipfw и ng_car, что в принципе и происходит Free# ngctl msg inet_krovozhadina: getconf Rec'd response "getconf" (4) from "[3f2]:": Args: { upstream={ cbs=8192 ebs=8192 cir=100000 greenAction=1 yellowAction=1 redAction=2 mode=2 } downstream={ cbs=8192 ebs=8192 cir=100000 greenAction=1 yellowAction=1 redAction=2 mode=2 } } но скорость не режется! Подскижате, если кто сталкивался и поборол, как бы и мне тоже побороть? Вставить ник Quote
Hawk128 Posted September 6, 2011 Posted September 6, 2011 Может проще радиусом отдать параметры? Или хотя бы скриптом, так тоже делал. Вставить ник Quote
krovozhadina Posted September 6, 2011 Author Posted September 6, 2011 Может проще радиусом отдать параметры? Или хотя бы скриптом, так тоже делал. Радиусом не то... прикаждом новом тарифе (читай Скорости тарифа) придется в биллинг новое правило вносить, а скриптом было бы самое то, просто брать скорость по текущему тарифу и дело пойдет! Можно примерчик, как сделать скриптом? Вставить ник Quote
krovozhadina Posted September 8, 2011 Author Posted September 8, 2011 Ап. Помогите советом, знающие люди. Вставить ник Quote
littlesavage Posted September 8, 2011 Posted September 8, 2011 Проще радиусом. 2. в ipfw есть правило ${fwcmd} add 10 netgraph tablearg all from any to "table(10)" out via igb1 где igb1 внешний фейс Но если хочется иначе - подумай, для начала, над этим правилом Вставить ник Quote
krovozhadina Posted September 8, 2011 Author Posted September 8, 2011 (edited) Радиусом конечно проще и все это работает (я пробовал), но цель в том, чтоб задавать скриптом при подключении абонента. Но если хочется иначе - подумай, для начала, над этим правилом А что тут не так? Просто я никогда не пробовал работать с netgraph`ом и это "первые шаги". Edited September 8, 2011 by krovozhadina Вставить ник Quote
Deac Posted September 8, 2011 Posted September 8, 2011 ${fwcmd} add 10 netgraph tablearg all from any to "table(10)" out via igb1 Вставить ник Quote
krovozhadina Posted September 8, 2011 Author Posted September 8, 2011 Заменил на in, пробовал вообще убрать направление, толку 0. Хотя кое-что определенно изменилось... Сервер стал падать в кору при добавлении в таблицу table(10) адреса FreeVPN-16# uname -a FreeBSD FreeVPN-16 7.4-STABLE FreeBSD 7.4-STABLE #0: Tue Sep 6 15:20:34 MSD 2011 root@FreeVPN-16:/usr/src/sys/i386/compile/mykernel i386 FreeVPN-16# kgdb -q /boot/kernel/kernel.debug /usr/vmcore.3 #0 doadump () at pcpu.h:197 197 pcpu.h: No such file or directory. in pcpu.h (kgdb) bt #0 doadump () at pcpu.h:197 #1 0xc0388463 in boot (howto=260) at ../../../kern/kern_shutdown.c:421 #2 0xc0388737 in panic (fmt=Variable "fmt" is not available. ) at ../../../kern/kern_shutdown.c:576 #3 0xc058dabc in trap_fatal (frame=0xee3d6bc0, eva=24) at ../../../i386/i386/trap.c:950 #4 0xc058dd50 in trap_pfault (frame=0xee3d6bc0, usermode=0, eva=24) at ../../../i386/i386/trap.c:863 #5 0xc058e72c in trap (frame=0xee3d6bc0) at ../../../i386/i386/trap.c:541 #6 0xc056f53b in calltrap () at ../../../i386/i386/exception.s:166 #7 0xc0464750 in move_pkt (pkt=0xcdf95800, q=0xd098c500, p=0xd0973c00, len=1396) at ../../../netinet/ip_dummynet.c:545 #8 0xc0465200 in ready_event (q=0xd098c500, head=0xee3d6c80, tail=0xee3d6c7c) at ../../../netinet/ip_dummynet.c:593 #9 0xc0466fb5 in dummynet_task (context=0x0, pending=1) at ../../../netinet/ip_dummynet.c:847 #10 0xc03bfff2 in taskqueue_run_locked (queue=0xcdb25000) at ../../../kern/subr_taskqueue.c:293 #11 0xc03c0197 in taskqueue_thread_loop (arg=0xc0652e48) at ../../../kern/subr_taskqueue.c:428 #12 0xc03600a9 in fork_exit (callout=0xc03c00d0 <taskqueue_thread_loop>, arg=0xc0652e48, frame=0xee3d6d38) at ../../../kern/kern_fork.c:798 #13 0xc056f5b0 in fork_trampoline () at ../../../i386/i386/exception.s:271 (kgdb) quit Вставить ник Quote
andriko Posted September 8, 2011 Posted September 8, 2011 насколько я понял ман, пакет из ng_ipfw должен уйти в хук с именем "10" ... Вставить ник Quote
krovozhadina Posted September 8, 2011 Author Posted September 8, 2011 насколько я понял ман, пакет из ng_ipfw должен уйти в хук с именем "10" ... Там у меня вверху опечатка. Каждому адресу присваиваются номера хуков из ng фейсов. Скажем... я подключаюсь к NAS-серверу и для меня создается фейс ng1. В таком случае запись будет выглядеть так: ipfw table 10 add $IP 1 Вставить ник Quote
littlesavage Posted September 8, 2011 Posted September 8, 2011 А почему бы не dummynet? И добавлять IP в таблицу желательно после создания и связи ng_car ноды, а не до Вставить ник Quote
krovozhadina Posted September 8, 2011 Author Posted September 8, 2011 А почему бы не dummynet? И добавлять IP в таблицу желательно после создания и связи ng_car ноды, а не до На dummynet сделано сейчас уже, все это работает как часы. Но! Загрузка процессора при ~600 клиентах почти 100%, что не есть гуд. В интернетах везде хвалятся, что на ng_car работает гораздо лучше и процессор не ест так сильно. Где-то в этом форуме даже было несколько тем, о том что люди умудрялись до 4000 абонентов держать на обном сервере NAS. Хотя реального подтверждения я невидел... Сегодня сделал следующим образом: в конфиг mpd дописал set radsrv self 127.0.0.1 set radsrv peer 127.0.0.1 pass set radsrv open set radsrv enable coa disconnect и при подключении клиента запускается скрипт #!/bin/sh sleep 1; LOGIN=$1; cr=`echo "$2*1024" | bc`; # configured rate nb=`echo "$cr*3/16" | bc`; # normal burst eb=`echo "2*$nb" | bc`; # extended burst shape=`echo "$2*1024" | bc`; #/bin/echo "User-Name =" $LOGIN", mpd-limit += \"in#1=all shape $shape 8000 pass\", mpd-limit += \"out#1=all shape $shape 8000 pass\"" | /usr/local/bin/radclient -x -s 127.0.0.1:3799 coa pass /bin/echo "User-Name =" $LOGIN", mpd-limit += \"in#1=all rate-limit $cr $nb $eb\", mpd-limit += \"out#1=all rate-limit $cr $nb $eb\"" | /usr/local/bin/radclient -x -s 127.0.0.1:3799 coa pass где $1 - логин клиента, $2 - скорость по тарифу. В консоли mpd видно, что значения mpd-limit выставляются нормально, но шейпинг не происходит почему-то... Пробовал два варианта, ни один не сработал. Почему? Опять что-то не так далаю? Вставить ник Quote
krovozhadina Posted September 8, 2011 Author Posted September 8, 2011 Проверил sysctl net.inet.ip.dummynet.io_fast= 0|1 Разницы нет, какое значение, нагрузка на проц не меняется. Вставить ник Quote
Deac Posted September 8, 2011 Posted September 8, 2011 Где-то в этом форуме даже было несколько тем, о том что люди умудрялись до 4000 абонентов держать на обном сервере NAS. Хотя реального подтверждения я невидел... Железо то не озвучено, м.б. там 600 юзверей и есть макс. Вставить ник Quote
krovozhadina Posted September 9, 2011 Author Posted September 9, 2011 (edited) FreeBSD 7.4-STABLE #0: Mon Sep 5 15:52:51 MSD 2011 CPU: Intel(R) Core(TM)2 Quad CPU Q8300 @ 2.50GHz (2499.73-MHz 686-class CPU) real memory = 9328132096 (8896 MB) igb0: <Intel(R) PRO/1000 Network Connection version - 2.0.7> igb1: <Intel(R) PRO/1000 Network Connection version - 2.0.7> из особенностей: - polling отключен, с ним все виснет и пакеты не ходят - на каждого клиента создается отдельная труба pipe - при ~600 клиентах загрузка процессора под 100% (т.е. все 4 ядра) Еще интересно, откуда берется ng_queue, если mpd собрать без ng_car ? FreeVPN-16# top -IS last pid: 57162; load averages: 0.33, 0.33, 0.32 up 0+19:06:55 09:56:26 117 processes: 6 running, 90 sleeping, 21 waiting CPU: 1.9% user, 0.0% nice, 10.3% system, 7.3% interrupt, 80.6% idle Mem: 86M Active, 685M Inact, 254M Wired, 30M Cache, 112M Buf, 6865M Free Swap: 4096M Total, 4096M Free PID USERNAME THR PRI NICE SIZE RES STATE C TIME WCPU COMMAND 13 root 1 171 ki31 0K 8K CPU1 1 17.2H 92.19% idle: cpu1 14 root 1 171 ki31 0K 8K CPU0 0 16.7H 91.46% idle: cpu0 11 root 1 171 ki31 0K 8K RUN 3 17.6H 90.48% idle: cpu3 12 root 1 171 ki31 0K 8K CPU2 2 17.4H 85.99% idle: cpu2 39 root 1 -68 - 0K 8K WAIT 3 35:04 4.69% irq264: igb1 37 root 1 -68 - 0K 8K CPU2 2 35:08 4.49% irq263: igb1 35 root 1 -68 - 0K 8K WAIT 1 32:33 3.56% irq262: igb1 24 root 1 -68 - 0K 8K WAIT 0 15:56 3.37% irq256: igb0 4 root 1 -68 - 0K 8K sleep 2 23:01 3.27% ng_queue2 3 root 1 -68 - 0K 8K sleep 1 22:59 2.88% ng_queue1 5 root 1 -68 - 0K 8K sleep 3 22:59 2.69% ng_queue3 33 root 1 -68 - 0K 8K WAIT 0 34:45 2.59% irq261: igb1 2 root 1 -68 - 0K 8K sleep 3 23:00 2.59% ng_queue0 16 root 1 -32 - 0K 8K WAIT 1 24:22 1.56% swi4: clock sio 30 root 1 -68 - 0K 8K WAIT 3 6:56 0.78% irq259: igb0 26 root 1 -68 - 0K 8K WAIT 1 7:47 0.29% irq257: igb0 Edited September 9, 2011 by krovozhadina Вставить ник Quote
Hawk128 Posted September 9, 2011 Posted September 9, 2011 Весь MPD написан на нетграфе... Я использовал для регистрации в MPD5 пользователя внешний скрипт, MPD ему при вызове скидывает первым параметром логин пользователя, скрипт обращается к базе mysql и выдает либо отказ либо пароль и параметры в радиусовском виде. Примерно вот так это выглядит: Код stat# ./mpd5-l.sh fortebool RESULT:UNDEF USER_PASSWORD:Hj;tyrjdGjkyjtXvj FRAMED_IP_ADDRESS:200.10.0.6 MPD_LIMIT:in#6=all rate-limit 262144 MPD_LIMIT:out#6=all rate-limit 262144 Сам скрипт надо искать, я его Механику на этом форуме в свой время отправлял. Сейчас перешел на радиус, с ним лучше, привязал его к mysql туда простым sql скриптом выгружаю с биллинга нужные данные пользователей. Там же реализовал mpd_drop_user. + сделал скриптом на НАСах увеличение скорости ночью без разрыва. IPFW почти пустой (одно правило запрета людей с минусовым балансом, на всякий случай). Нагрузка хорошо распределяется и проблем пока нет. (1300 в он-лайне, 800 мбит/с). Вставить ник Quote
krovozhadina Posted September 9, 2011 Author Posted September 9, 2011 (edited) Этот скрипт в конфиге должен быть так? set iface up-script /usr/local/etc/mpd5/up.sh или так? set auth extauth-script /usr/local/etc/mpd5/up.sh Можно примерчик из вашего конфига? ps. вот пример загрузки на моем сервере, при 340 абонентах. При 600 абонентах будет 100% все 4 ядра FreeVPN-16# top -IS last pid: 42860; load averages: 2.07, 1.91, 1.62 up 0+21:48:40 12:38:11 115 processes: 17 running, 82 sleeping, 16 waiting CPU: 0.2% user, 0.0% nice, 43.4% system, 28.9% interrupt, 27.5% idle Mem: 94M Active, 730M Inact, 270M Wired, 31M Cache, 112M Buf, 6794M Free Swap: 4096M Total, 4096M Free PID USERNAME THR PRI NICE SIZE RES STATE C TIME WCPU COMMAND 49 root 1 -68 - 0K 8K CPU1 1 120:39 48.29% dummynet 13 root 1 171 ki31 0K 8K RUN 1 18.6H 38.38% idle: cpu1 14 root 1 171 ki31 0K 8K RUN 0 18.0H 30.47% idle: cpu0 11 root 1 171 ki31 0K 8K RUN 3 19.1H 28.37% idle: cpu3 12 root 1 171 ki31 0K 8K RUN 2 18.9H 27.98% idle: cpu2 4 root 1 -68 - 0K 8K CPU2 3 48:16 24.17% ng_queue2 3 root 1 -68 - 0K 8K RUN 2 48:13 24.17% ng_queue1 5 root 1 -68 - 0K 8K CPU3 0 48:13 22.46% ng_queue3 2 root 1 -68 - 0K 8K RUN 3 48:14 22.36% ng_queue0 33 root 1 -68 - 0K 8K WAIT 0 53:37 20.65% irq261: igb1 35 root 1 -68 - 0K 8K RUN 1 50:03 18.80% irq262: igb1 37 root 1 -68 - 0K 8K CPU2 2 53:39 18.16% irq263: igb1 39 root 1 -68 - 0K 8K RUN 3 53:35 17.29% irq264: igb1 24 root 1 -68 - 0K 8K WAIT 0 30:40 14.26% irq256: igb0 28 root 1 -68 - 0K 8K RUN 2 16:00 11.18% irq258: igb0 30 root 1 -68 - 0K 8K RUN 3 14:59 7.67% irq259: igb0 26 root 1 -68 - 0K 8K RUN 1 16:49 6.49% irq257: igb0 16 root 1 -32 - 0K 8K WAIT 0 30:38 2.69% swi4: clock sio Edited September 9, 2011 by krovozhadina Вставить ник Quote
Deac Posted September 9, 2011 Posted September 9, 2011 - на каждого клиента создается отдельная труба pipe Не в этом ли проблема? Оптимально создать N pipes и загонять туда юзверей посредством таблиц. N=количеству тарифов. Вставить ник Quote
krovozhadina Posted September 9, 2011 Author Posted September 9, 2011 (edited) Я использовал для регистрации в MPD5 пользователя внешний скрипт, MPD ему при вызове скидывает первым параметром логин пользователя, скрипт обращается к базе mysql и выдает либо отказ либо пароль и параметры в радиусовском виде. Переделал с подобным скриптом. В конфиг mpd добавил set auth enable ext-auth set auth extauth-script /usr/local/etc/mpd5/up-ext.sh Сам скрипт FreeVPN-16# cat up-ext.sh #!/bin/sh - MYSQL="/usr/local/bin/mysql -h<IP> -u<user> -p<password> billing" q="ЗАПРОС О СКОРОСТИ ПО ТАРИФУ"; s=`echo $q | $MYSQL | tail -n1`; s1=`echo $s | awk '{ print $1 }'`; s2=`echo $s | awk '{ print $2 }'`; if test $s1 -gt $s2 then s2=$s1 fi s2=`echo "$s2*0.8*1024" | bc`; echo "MPD_LIMIT:in#6=all rate-limit $s2" echo "MPD_LIMIT:out#6=all rate-limit $s2" cat exit Теперь при подключении клиентам выдется скорость по тарифу, ну и шейпинг происходит через ng_car. Вот загрузка при 250 клиентах last pid: 11336; load averages: 0.73, 0.90, 0.87 up 0+02:07:06 15:46:48 119 processes: 6 running, 92 sleeping, 21 waiting CPU: 0.2% user, 0.0% nice, 17.3% system, 18.0% interrupt, 64.5% idle Mem: 72M Active, 137M Inact, 140M Wired, 9556K Cache, 112M Buf, 7562M Free Swap: 4096M Total, 4096M Free PID USERNAME THR PRI NICE SIZE RES STATE C TIME WCPU COMMAND 12 root 1 171 ki31 0K 8K RUN 2 100:27 69.78% idle: cpu2 13 root 1 171 ki31 0K 8K RUN 1 97:56 69.48% idle: cpu1 11 root 1 171 ki31 0K 8K CPU3 3 102:27 67.77% idle: cpu3 14 root 1 171 ki31 0K 8K RUN 0 90:14 58.69% idle: cpu0 3 root 1 -68 - 0K 8K sleep 1 11:53 16.46% ng_queue1 2 root 1 -68 - 0K 8K sleep 1 11:53 16.26% ng_queue0 5 root 1 -68 - 0K 8K sleep 3 11:52 15.38% ng_queue3 4 root 1 -68 - 0K 8K sleep 0 11:53 15.09% ng_queue2 33 root 1 -68 - 0K 8K WAIT 0 10:18 14.99% irq261: igb1 39 root 1 -68 - 0K 8K WAIT 3 10:46 13.48% irq264: igb1 35 root 1 -68 - 0K 8K WAIT 1 9:21 10.89% irq262: igb1 37 root 1 -68 - 0K 8K WAIT 2 10:17 10.35% irq263: igb1 28 root 1 -68 - 0K 8K CPU2 2 3:18 5.76% irq258: igb0 24 root 1 -68 - 0K 8K WAIT 0 4:10 5.18% irq256: igb0 30 root 1 -68 - 0K 8K WAIT 3 3:06 4.20% irq259: igb0 16 root 1 -32 - 0K 8K WAIT 0 2:54 2.20% swi4: clock sio 26 root 1 -68 - 0K 8K WAIT 1 2:23 2.10% irq257: igb0 504 root 1 45 0 2652K 2268K select 1 0:03 0.29% zebra Пока мне вроде как даже нравится. Позже выложу еще загрузку при большем кол-ве... просто еще не вечер :) Edited September 9, 2011 by krovozhadina Вставить ник Quote
krovozhadina Posted September 9, 2011 Author Posted September 9, 2011 (edited) 720 клиентов FreeVPN-16# top -IS last pid: 89424; load averages: 4.46, 3.81, 3.78 up 0+07:54:01 21:33:43 120 processes: 11 running, 91 sleeping, 18 waiting CPU: 1.4% user, 0.0% nice, 47.7% system, 39.5% interrupt, 11.3% idle Mem: 91M Active, 208M Inact, 170M Wired, 17M Cache, 112M Buf, 7434M Free Swap: 4096M Total, 4096M Free PID USERNAME THR PRI NICE SIZE RES STATE C TIME WCPU COMMAND 2 root 1 -68 - 0K 8K sleep 2 123:48 39.70% ng_queue0 5 root 1 -68 - 0K 8K RUN 3 123:44 39.45% ng_queue3 4 root 1 -68 - 0K 8K sleep 2 123:47 38.77% ng_queue2 3 root 1 -68 - 0K 8K sleep 3 123:41 37.89% ng_queue1 33 root 1 -68 - 0K 8K RUN 0 88:09 32.18% irq261: igb1 39 root 1 -68 - 0K 8K WAIT 3 89:27 28.96% irq264: igb1 35 root 1 -68 - 0K 8K CPU1 1 87:50 28.76% irq262: igb1 37 root 1 -68 - 0K 8K WAIT 2 85:38 26.66% irq263: igb1 12 root 1 171 ki31 0K 8K RUN 2 217:13 12.70% idle: cpu2 24 root 1 -68 - 0K 8K RUN 0 38:42 11.96% irq256: igb0 13 root 1 171 ki31 0K 8K RUN 1 208:15 11.57% idle: cpu1 11 root 1 171 ki31 0K 8K RUN 3 222:07 11.38% idle: cpu3 30 root 1 -68 - 0K 8K WAIT 3 31:44 10.69% irq259: igb0 14 root 1 171 ki31 0K 8K RUN 0 188:46 10.60% idle: cpu0 28 root 1 -68 - 0K 8K WAIT 2 25:40 9.18% irq258: igb0 26 root 1 -68 - 0K 8K WAIT 1 25:52 8.06% irq257: igb0 16 root 1 -32 - 0K 8K WAIT 0 17:15 2.20% swi4: clock sio 4848 root 4 46 0 55132K 28200K select 0 11:29 1.76% mpd5 856 root 1 45 0 9908K 6772K select 3 1:28 0.49% snmpd 504 root 1 44 0 3008K 2624K select 0 1:01 0.49% zebra FreeVPN-16# netstat -w1 -h -d input (Total) output packets errs bytes packets errs bytes colls drops 117K 0 70M 112K 0 69M 0 0 117K 0 70M 112K 0 70M 0 0 119K 0 71M 115K 0 72M 0 0 118K 0 70M 114K 0 72M 0 0 121K 0 72M 116K 0 74M 0 0 Edited September 9, 2011 by krovozhadina Вставить ник Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.