Назад | Перейти на главную страницу

FreeBSD ng_nat останавливает периодическую передачу пакетов

У меня роутер FreeBSD:

#uname
9.1-STABLE FreeBSD 9.1-STABLE #0: Fri Jan 18 16:20:47 YEKT 2013

Это мощный компьютер с большим объемом памяти

#top -S
last pid: 45076;  load averages:  1.54,  1.46,  1.29                                      up 0+21:13:28  19:23:46
84 processes:  2 running, 81 sleeping, 1 waiting
CPU:  3.1% user,  0.0% nice, 32.1% system,  5.3% interrupt, 59.5% idle
Mem: 390M Active, 1441M Inact, 785M Wired, 799M Buf, 5008M Free
Swap: 8192M Total, 8192M Free

  PID USERNAME    THR PRI NICE   SIZE    RES STATE   C   TIME   WCPU COMMAND
   11 root          4 155 ki31     0K    64K RUN     3  71.4H 254.83% idle
   13 root          4 -16    -     0K    64K sleep   0 101:52 103.03% ng_queue
    0 root         14 -92    0     0K   224K -       2 229:44 16.55% kernel
   12 root         17 -84    -     0K   272K WAIT    0 213:32 15.67% intr
40228 root          1  22    0 51060K 25084K select  0  20:27  1.66% snmpd
15052 root          1  52    0   104M 22204K select  2   4:36  0.98% mpd5
   19 root          1  16    -     0K    16K syncer  1   0:48  0.20% syncer

Его задачи: NAT через ng_nat и сервер PPPoE через mpd5.

Сквозной трафик - около 300Мбит / с, в пике около 40kpps. Создано PPPOE сессий - 350 макс.

ng_nat настраивается скриптом:

 /usr/sbin/ngctl -f- <<-EOF                                            

             mkpeer ipfw: nat %s out                                                                               
             name ipfw:%s %s                                                                                       
             connect ipfw: %s: %s in                                                                               
             msg %s: setaliasaddr 1.1.%s

Есть 20 таких узлов ng_nat, около 150 клиентов.

Иногда движение по физ прекращается. Когда это происходит, vmstat сообщает о большом количестве неудачных попыток.

vmstat -z | grep -i netgraph
ITEM                   SIZE  LIMIT     USED     FREE      REQ FAIL SLEEP
NetGraph items:          72,  10266,       1,     376,39178965,   0,   0
NetGraph data items:     72,  10266,       9,   10257,2327948820,2131611,4033

Я пытался увеличить

net.graph.maxdata=10240                                                                                           
net.graph.maxalloc=10240

но это не работает.

Это новая проблема (1-2 недели). Конфигурация работала нормально около 5 месяцев, и не было внесено никаких изменений в конфигурацию, что привело к возникновению проблем.

За последние несколько недель мы немного увеличили трафик (с 270 до 300 мбит) и немного больше сессий pppoe (300-> 350).

Помогите, пожалуйста, как найти и решить мою проблему?

Upd: Информация о сетевых картах:

# pciconf -lv | grep -B3 network   
em0@pci0:0:25:0:        class=0x020000 card=0x35788086 chip=0x15028086 rev=0x05 hdr=0x00
    vendor     = 'Intel Corporation'
    device     = '82579LM Gigabit Network Connection'
    class      = network
--
em1@pci0:2:0:0: class=0x020000 card=0x35788086 chip=0x10d38086 rev=0x00 hdr=0x00
    vendor     = 'Intel Corporation'
    device     = '82574L Gigabit Network Connection'
    class      = network

UPD: Есть 2 "верхних" вывода https://gist.github.com/korjavin/9190181

когда я переключаю net.isr.dispatch на гибрид. После этого у меня есть масса процессов mpd (не знаю почему) и один процессор на 100% прерывания, и через 10 минут работы он был перезагружен из-за потери большого пакета.

UPD: Произошло снова Есть "верхний" вывод до перезагрузки и после https://gist.github.com/korjavin/9254734

похоже на проблему в процессе ng_queue, которая сильно съедает CPU. Со времени моего первого поста сессий и траффиков стало намного больше. Около 400 pppoe и 450 Мбит / с

Я бы попробовал увеличить net.link.ifqmaxlen в /boot/loader.conf до 10240. Как я недооценил, драйвер em (4) (и igp, карта Intel 10g) (или, по крайней мере, ваш 82574L) не будет балансируйте не-IP-трафик (ваш pppoe), чтобы все попадало в одну ng_queue.

Я не понимаю, почему один из ваших интерфейсов (em0) использует одно IRQ, а другой (em1) использует отдельные IRQ для tx, rx и ссылки. Установлены ли обе карты NIC в слоты с поддержкой MSI-X?

Вы, вероятно, сможете лучше понять это, чем я (я не знаю русского, и Google Translate мало помогает):

http://forum.nag.ru/forum/index.php?s=c4da62052515736f45c73b932216af33&showtopic=82322&st=0

В этой ветке форумов FreeBSD есть несколько предложений

Вики FreeBSD по настройке производительности сети немного объясняет однопоточность в ng_nat и некоторые обходные пути

Некоторые люди сообщают об успешном отключении IPv6 в ядре (и в mpd), но я не вижу в этом никакого реального консенсуса.

РЕДАКТИРОВАТЬ: Я забыл добавить это,, похоже, имеет несколько других соответствующих параметров настройки, я подумал, что параметры, связанные с dummynet, выглядят многообещающими.

Сообщите мне, что происходит, это интересная проблема ...

Решение:

deny ip from any to any dst-port 6881 out

Итак, речь шла о NAT, счетчике состояний и торренте.