Das Anhalten von ng_nat durch FreeBSD leitet die Pakete regelmäßig weiter

7

Ich habe einen FreeBSD-Router:

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

Es ist ein leistungsstarker Computer mit viel Speicher

#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

Seine Aufgaben sind: NAT über ng_nat und PPPoE-Server über mpd5.

Verkehr durch - ungefähr 300 Mbit / s, ungefähr 40 kpps in der Spitze. Pppoe-Sitzungen erstellt - max. 350

ng_nat wird vom Skript konfiguriert:

 /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

Es gibt 20 solcher ng_nat-Knoten mit ungefähr 150 Clients.

Manchmal stoppt der Verkehr über nat. In diesem Fall meldet vmstat viele FAIL-Zählungen

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

Ich wurde versucht zu erhöhen

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

aber das funktioniert nicht.

Es ist ein neues Problem (1-2 Wochen). Die Konfiguration funktionierte seit ungefähr 5 Monaten gut und es wurden keine Konfigurationsänderungen vorgenommen, die zu den beginnenden Problemen führten.

In den letzten Wochen haben wir den Verkehr leicht erhöht (von 270 auf 300 MBit) und etwas mehr Pppoe-Sitzungen (300-> 350).

Helfen Sie mir bitte, wie ich mein Problem finde und löse?

Update: Infos zu Netzwerkkarten:

# 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: Es gibt 2 "Top" -Ausgaben https://gist.github.com/korjavin/9190181

wenn ich net.isr.dispatch auf hybrid umschalte. Danach habe ich Tonnen von mpd-Prozessen (weiß nicht warum) und eine CPU zu 100% der Unterbrechung, und nach 10 Minuten Arbeit wurde es aufgrund eines großen Paketverlusts neu gestartet.

UPD: erneut aufgetreten Vor dem Neustart und nach https://gist.github.com/korjavin/9254734 wird die Ausgabe "top" ausgegeben

sieht aus wie ein Problem im ng_queue-Prozess, der die CPU zu stark verschlingt. Seit meinem ersten Beitrag gibt es viel mehr Sitzungen und Traffics. Etwa 400 pppoe und 450 Mbit / s

Korjavin Ivan
quelle
Können Sie ein netstat -m posten und "ipfw -d list | wc" sehen, wenn dies geschieht? Und ngctl-Liste?
Quadruplebucky
Oh, und welchen Kartentreiber verwenden Sie?
Quadruplebucky
#ipfw -d Liste | wc -l 42 # ngctl list | wc -l 4044 #ngctl Typen Es gibt insgesamt 25 Typen: Auto, Äther, Socket, pppoe ungefähr 500 und 32 nat Knoten, und ich aktualisiere Post mit Karteninfo
Korjavin Ivan
Sie scheinen viel Zeit damit zu verbringen, Interrupts zu verarbeiten. Was gibt Ihnen "vmstat -i"?
quadruplebucky
vmstat: gist.github.com/9019910
Korjavin Ivan

Antworten:

1

Ich würde versuchen, net.link.ifqmaxlen in /boot/loader.conf auf 10240 zu erhöhen. Nach meinem Verständnis wird dies der Treiber em (4) (und igp, die Intel 10g-Karte) (oder zumindest Ihr 82574L) nicht tun Gleicht den Nicht-IP-Verkehr (Ihr Pppoe) aus, sodass alles in einer ng_queue eingeht.

Ich verstehe nicht, warum eine Ihrer Schnittstellen (em0) einen IRQ verwendet, während die andere (em1) separate IRQs für tx, rx und link verwendet. Befinden sich beide NIC-Karten in MSI-X-fähigen Steckplätzen?

Sie können wahrscheinlich mehr Sinn daraus machen als ich (ich kann kein Russisch und Google Übersetzer hilft nicht viel):

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

Dieser Thread aus den FreeBSD-Foren enthält einige Vorschläge

Das FreeBSD-Wiki zur Netzwerkleistungsoptimierung erklärt ein wenig das Single-Threading in ng_nat und einige Problemumgehungen

Einige Leute haben berichtet, dass es erfolgreich war, IPv6 im Kernel (und in mpd) zu deaktivieren, aber ich sehe dort keinen wirklichen Konsens.

EDIT: Ich habe vergessen, diesen hinzuzufügen , scheint einige andere relevante Tuning-Parameter zu haben, ich fand die Dummynet-bezogenen vielversprechend.

Lassen Sie mich wissen, was passiert, das ist ein interessantes Problem ...

Vierbeiner
quelle
em1 82574L haben kein pppoe, es ist alles nur auf em0. Ich kann Russisch und Ihre Links sind brillant. Ich werde Sie über alle Dinge informieren.
Korjavin Ivan
Beide Netzwerkkarten sind intern für das Motherboard.
Korjavin Ivan
Heute war dies wieder passiert und ich füge net.link.ifqmaxlen = 10240 in loader.conf hinzu. Außerdem aktualisiere ich den Beitrag mit Informationen über net.isr
Korjavin Ivan
Und wieder. OH MEIN GOTT. Ich aktualisiere den Beitrag mit Info
Korjavin Ivan
Und wieder; (Ich ändere Netzwerkkarten in igb. Bot nichts. Ich werde versuchen, den gesamten Server zu ändern.
Korjavin Ivan
0

Lösung ist:

deny ip from any to any dst-port 6881 out

Es ging also um NAT und State Count und Torrent

Korjavin Ivan
quelle