Нигде не нашел описания подобной проблемы, нужно оставить заметку для других.
Имеем шлюзы freebsd 8.3 и 9.1 , на них крутится ipfw nat. Нагрузка по 200-300 мегабит, процессор 10-30%.
Недавно встал один сервак(на 9.1 с интерфейсами igb), второй (8.3 с em) подхватил и "завяз" - пинги на мир 2000-7000мсек, нагрузка по прерываниям максимальная сколько может выжать железо - в основном по тредам внешнего интерфейса.
Лежало все до вечера, разбор на локалке ничего не дал, перенаправление на третий серв положило и его в конечном итоге.
Последующий анализ привел к НАТу, ситуация эпизодически кратковременно повторялась и была ожидаема во всеоружии крутящихся в голове вариантов.
И вот, в конечном итоге выяснилось что шлюз ложит входящий из инета трафик на порт 6881(tcp+udp со всего интернета - походу торент), а точнее загинается НАТ от этого трафика.
Блок всего трафика на внутреннем интерфейсе ничего не дает, т.е. трафик из инета никто уже не просит, а он все прет.
При этом pps абсолютно не растет, трафик абсолютно не растет, и
что интересно, нет разницы в показаниях trafshow по этому трафику (на порт 6881) в ситуациях когда система почти ложится и практически в IDLE - все те же 1500-3000 соединений.
Если шлюз fb8.3на интерфейсах em хоть как-то живет под максимальной нагрузкой от НАТа, то шлюз fb9.1 на igb локается намертво, перестает отвечать на пинги и на локальную консоль.
Порыв инет нашел только хорошие отзывы про ng_nat, его и применил на проблемном шлюзе.
И да, это практически решило проблему.
Во первых теперь отчетливо видно нагрузку НАТ по ng_queue
Код: Выделить всё
PID USERNAME PRI NICE SIZE RES STATE C TIME WCPU COMMAND
11 root 155 ki31 0K 32K CPU0 0 143:21 85.69% idle{idle: cpu0}
11 root 155 ki31 0K 32K CPU2 2 135:47 80.66% idle{idle: cpu2}
11 root 155 ki31 0K 32K RUN 3 135:23 79.20% idle{idle: cpu3}
11 root 155 ki31 0K 32K RUN 1 135:28 77.69% idle{idle: cpu1}
1281 root -16 - 0K 32K sleep 2 25:09 15.97% ng_queue{ng_queue2}
1281 root -16 - 0K 32K sleep 3 25:09 15.87% ng_queue{ng_queue0}
1281 root -16 - 0K 32K sleep 3 24:52 15.09% ng_queue{ng_queue3}
1281 root -16 - 0K 32K sleep 0 24:34 13.96% ng_queue{ng_queue1}
12 root -92 - 0K 232K WAIT 2 5:46 5.66% intr{irq264: igb1:que}
12 root -92 - 0K 232K WAIT 0 5:11 5.37% intr{irq262: igb1:que}
12 root -92 - 0K 232K WAIT 3 5:37 5.18% intr{irq265: igb1:que}
12 root -92 - 0K 232K WAIT 1 5:17 4.88% intr{irq263: igb1:que}
12 root -92 - 0K 232K WAIT 1 3:12 1.86% intr{irq258: igb0:que}
12 root -92 - 0K 232K WAIT 2 2:59 1.56% intr{irq259: igb0:que}
12 root -92 - 0K 232K WAIT 0 2:47 1.37% intr{irq257: igb0:que}
12 root -92 - 0K 232K WAIT 3 3:01 0.98% intr{irq260: igb0:que}
Во вторых DOS на порт 6881 теперь не вешает машину, а забивает один из тредов ng_queue.
Тут пришлось немного оптимизировать Netgraph, иначе вываливались все сервисы с нехваткой памяти
Код: Выделить всё
net.graph.maxdata=65536
net.graph.maxalloc=65536
