Аналогично, с вызовом программы на каждое правило и еще и печатью на stdout (которое мы отправим в /dev/null), чтоб замедлить насколько можно, запустим простое добавление в ipfw семидесяти тысяч правил, прямой аналог того, что делали с iptables в статье:# ./genips.pl > rules.sh; chmod +x rules.sh # в genips строки сменены с таблицы на обычное add all from, см. комментарии в скрипте
# time ./rules.sh > /dev/null
./rules.sh > /dev/null 116,97s user 519,57s system 100% cpu 10:33,90 total
Десять с половиной минут.
Измерения проводились на ненагруженном в этот момент сервере:
FreeBSD 6.2-STABLE #0: Sat Apr 28 23:26:52 NOVST 2007
vadim@hostel.avtf.net:/usr/obj/usr/src/sys/HOSTEL
acpi_alloc_wakeup_handler: can't alloc wake memory
Timecounter "i8254" frequency 1193182 Hz quality 0
CPU: Intel(R) Pentium(R) 4 CPU 3.00GHz (2992.52-MHz 686-class CPU)
Origin = "GenuineIntel" Id = 0xf34 Stepping = 4
Features=0xbfebfbff<FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CLFLUSH,DTS,ACPI,MMX,FXSR,SSE,SSE2,SS,HTT,TM,PBE>
Features2=0x441d<SSE3,RSVD2,MON,DS_CPL,CNTX-ID,<b14>>
Logical CPUs per core: 2
Повторим добавление в таблицу в "боевых" условиях, наиболее быстрым способом (подгружая из файла без печати на stdout):
# ./genips.pl > table
# time ipfw -q /home/vadim/work/table
ipfw -q /home/vadim/work/table 0,67s user 0,19s system 93% cpu 0,910 total
То есть практически мгновенно. Строки в скрипте генерации были изменены на:
my $prefix = "table 111 add ";
my $suffix = "\n";
Изменим их на:
my $prefix = "add 777 deny all from ";
my $suffix = " to any\n";
И проверим добавление 70000 правил снова:
# ./genips.pl > rules
# time ipfw -q /home/vadim/work/rules
ipfw -q /home/vadim/work/rules 85,85s user 315,14s system 98% cpu 6:46,03 total
В полтора раза быстрее, чем в предыдущий раз, как видим.
Ну и в дополнение по нагрузке. Если запустить на этот сервер ping -f с соседнего, то есть каждый пакет проходит через все 70000 правил и ответ на него - тоже, при примерно 300-400 pps (фря ограничивает количество icmp-ответов в секунду) нагрузка по прерываниям составляет около 50% CPU.