Используется следующая схема прохождения трафика:
LAN -> FreeBSD -> Inet -> PPTPServer Т.е. пользователи из сети (примерно 500-700 человек) подрубаются через Фрю (на которой ipfw + ng_nat с alias_pptp.ko) к PPTP Серверу и пользуют Интернет через Фрю.
Работает все стабильно, пока в какой-то момент не появляется высокая задержка трафика (любого) при прохождении ноды ng_nat в нетграфе, в цифрах: 300-400мс против 3-5мс нормальных. В это время один из процессов ng_queue (всего их 4 согласно 4-м ядрам процессора) загружается на 100%.
Чтобы вернуть задержку в норму, единственное найденное решение это удаление ноды ng_nat и создание ее заново, но при этом уничтожаются все созданные PPTP тоннели, которые проходят через фрю на впн-сервер - это очень плохо.
Кто подскажет где посмотреть в чем может быть дело?
Доп. инфа:
Основная нагрузка на интерфейсе 90% из 100мбит это PPTP тоннели, в момент появления проблемы необязательно что канал загружен максимально.
Процессы ng_queue разнесены на разные ядра через cpuset.
Для поиска этой проблемы строение нод в системе нетграф было упрощено максимально: к netgraph подключается одна нода ng_nat и все.
Правил ipfw для прохождения созданных тоннелей всего штук 5:
Код: Выделить всё
00050 allow ip from серые_ИП to ВПН_Серверы in
00052 netgraph 3 ip from серые_ИП to ВПН_серверы out xmit em2
00054 allow ip from внешний_ИП to ВПН_серверы out xmit em2
00056 netgraph 10 ip from ВПН_серверы to внешний_ИП in recv em2
00058 allow ip from ВПН_серверы to серые_ИП
Код: Выделить всё
vmstat -z | grep tG
NetGraph items: 72, 16425, 0, 810, 154483843, 0
NetGraph data items: 72, 16425, 2, 5038, 19970851356, 0
Код: Выделить всё
netstat -s -p udp
udp:
70579151 datagrams received
0 with incomplete header
0 with bad data length field
0 with bad checksum
110034 with no checksum
[b]641719 dropped due to no socket
1310676 broadcast/multicast datagrams undelivered[/b]
171 dropped due to full socket buffers
0 not for hashed pcb
68626585 delivered
67564424 datagrams output
0 times multicast source filter matched
Код: Выделить всё
net.inet.tcp.recvbuf_max=262144
net.inet.tcp.sendbuf_max=262144
net.inet.tcp.recvbuf_inc=16384
net.inet.tcp.sendbuf_inc=8192
kern.ipc.shmall=8388608
kern.ipc.somaxconn=8192
net.local.stream.recvspace=65535
net.local.stream.sendspace=65535
Код: Выделить всё
alias_pptp_load="YES"
if_em_load="YES"
Внешний интерфейс:
em2: <Intel(R) PRO/1000 Network Connection 6.9.6> port 0x5000-0x501f mem 0xb8800000-0xb881ffff,0xb8000000-0xb83fffff irq 19 at device 0.1 on pci4
em2: Using MSI interrupt
Что делать? Где смотреть?