Performance Netzwerk mit Braodcom

kira12

Well-Known Member
Hallo Leute,

meine BSDrechner haben meist Broadcom Nics. die Linuxrechner meist intelNICs. Wenn ich per netio teste haben die Linuxrechner volle Netzwerkleistung und CPU 1-2% und die BSDrechner etwas weniger bis runter zur Hälfte und CPU 30-40%. Leider habe ich keinen BSDrechner mit intelNIC, darum kann ich das nicht testen. Die meisten Rechner haben die selben oder ähnliche Architekturen/CPU.
Kann ich da etwas tunen?

Gruß ré
 
CPU-Last hoch und weniger Durchsatz? Das klingt doch ganz nach nicht genutzter Hardwarebeschleunigung... FreeBSD unterstützt die natürlich, bei den meisten NICs ist der Kram aber standardmäßig ausgeschaltet, da man prinzipbedingt einige höhere Funktionen wie z.B. Teile von tcpdump verliert.

Die Optionen setzt du mit "ifconfig $nic option" und entfernst du wieder mit "ifconfig $nic -option":

- rxcsum, txcsum: Prüfsummen in Hardware erstellen und abgleichen. rcxsum ist für empfangene Pakete, txcsum für gesendete. Viele Treiber können nur beide oder gar nichts. Bringt nicht wahnsinnig viel, ist aber durchaus messbar.

- tso: TCP Segment Offloading, verarbeitet größere Teile des Pakets in Hardware. Bringt einiges, gerade in Sachen CPU-Last und damit indirekt auch im Durchsatz. Sollte man einschalten, kann aber auf billigen NICs (Realtek, u.a.) Probleme machen. Wird gerade von älterer Hardware nicht unterstützt.

- lro: Large Receive Offloading, fast Payload in größere Blöcke zusammen, bevor der Kram an obere Ebenen geschickt wird. Spart umkopieren, damit CPU-Last und bringt gerade bei hohen Übertragungsraten merklich mehr Durchsatz. Auch hier, längst nicht von allen NICs unterstützt und kann auf schlechteren Modellen Ärger machen.
 
kurze Rückmeldung, rxcsum und txcsum lassen sich aktivieren, tso und lro nicht. Das ist eine Onboard NIC, ich werde das die Tage mal testen mit einer PCI-X NIC, mal sehen ob das einen unterschied macht.

Gruß ré
 
Die Optionen setzt du mit "ifconfig $nic option" und entfernst du wieder mit "ifconfig $nic -option":

Als Beispiel: ifconfig vge0 lro
richtig?

Sollte, wenn keine Fehlermeldung kommt, dann nicht irgendwo bei "ifconfig vge0" die angeschaltete Option zu sehen sein? Wenn nicht, unterstützt die Karte das nicht, richtig?

Gruß
 
Genau, hier meine Broadcom im Laptop:
Code:
root@maka:pts/4 ~> ifconfig bge0                                    [19:35:32]
bge0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
	options=c019b<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM,TSO4,VLAN_HWTSO,LINKSTATE>
	ether 00:22:68:1f:4a:36
	inet6 fe80::222:68ff:fe1f:4a36%bge0 prefixlen 64 scopeid 0x2 
	inet 0.0.0.0 netmask 0xff000000 broadcast 0.255.255.255
	nd6 options=3<PERFORMNUD,ACCEPT_RTADV>
	media: Ethernet autoselect (none)
	status: no carrier

Sie kann neben diversen anderen Kram:
RXCSUM, TXCSUM -> Die Prüfsummenberechnung
TSO4 -> TCP Segment Offloading für IPv4

P.S.: Das bedeutet natürlich nicht, dass jeder Broadcom-Chip den Kram kann. :)
 
Hoi,

die einfachere Lösung wäre wohl eine sinnvolle Netzwerkkarte oifach zu verbauen - da gibts so Stress nedda. Kosten tut sowas ja heut zu Tage nimmer die Welt. Bei Notebookbären kann ich den Affentanz ja noch verstehen, da is des ned so oifach ne andere NIC zu nehmen - abär bei Workstations oder Server muss mer sich so en Stress ned wirklich geben.

Gruß Bummibär
 
Machen TXCSUM und TXCSUM die Verbindung durch die Prüfsummenberechnung nicht eher langsamer statt schneller?
 
Die findet ja immer statt, der Unterschied ist bloß ob die von der Netzwerkkarte oder der CPU erledigt wird.
 
Hallo Leute,

ich habe heute mal eine intel-NIC eingebaut, die Broadcom mag der Rechner nicht. Die CPU Last bleibt gleich, egal ob Broadcom oder intel. Ich habe mit rxcsum/txcsum und ohne rxcsum/txcsum probiert, mit dem selben Erfolg. Die Performance von netio:
Packet size 1k bytes: 105760 KByte/s Tx, 41075 KByte/s Rx.
Packet size 2k bytes: 78857 KByte/s Tx, 22549 KByte/s Rx.
Packet size 4k bytes: 89674 KByte/s Tx, 92855 KByte/s Rx.
Packet size 8k bytes: 89925 KByte/s Tx, 91173 KByte/s Rx.
Packet size 16k bytes: 82753 KByte/s Tx, 88360 KByte/s Rx.
Packet size 32k bytes: 87700 KByte/s Tx, 98237 KByte/s Rx.

Gruß ré

P.S. die Gegenstelle ist eine PCI-e intel Gbit NIC.
 
Hallo oenone,

ich hoffe nicht das netio auf die Festplatte zugreift? Die anderen Server haben alle langsamer CPUs und laufen unter Linux, dort habe ich das Problem nicht. Da ist CPU Last ein einstelligen Bereich.

Vom FreBSD-Fileserver zu Linux:

Packet size 1k bytes: 114257 KByte/s Tx, 85342 KByte/s Rx.
Packet size 2k bytes: 114285 KByte/s Tx, 98006 KByte/s Rx.
Packet size 4k bytes: 114270 KByte/s Tx, 24746 KByte/s Rx.
Packet size 8k bytes: 114264 KByte/s Tx, 18374 KByte/s Rx.
Packet size 16k bytes: 114234 KByte/s Tx, 3177 KByte/s Rx.
Packet size 32k bytes: 114028 KByte/s Tx, 13016 KByte/s Rx.

von Linux zum FreBSD-Fileserver:

Packet size 1k bytes: 4414 KByte/s Tx, 85232 KByte/s Rx.
Packet size 2k bytes: 99775 KByte/s Tx, 114226 KByte/s Rx.
Packet size 4k bytes: 12510 KByte/s Tx, 114213 KByte/s Rx.
Packet size 8k bytes: 6358 KByte/s Tx, 113561 KByte/s Rx.
Packet size 16k bytes: 14464 KByte/s Tx, 114181 KByte/s Rx.
Packet size 32k bytes: 12325 KByte/s Tx, 113874 KByte/s Rx.


das ist schon komisch, das BSD da weniger Durchsatz bringt und Linux mehr. Die Rechner sind ähnlich aufgebaut. Ich habe im BSD Rechner mit intel- und Broadcom-NIC versucht.

Gruß ré
 
FreeBSD sollte schon die Geschwindigkeit von Linux erreichen. Stochern wir also mal weiter im Dunkeln. Da wir die NIC ja nun weitgehend ausschließen können, wenden wir uns man dem eigentelichen Netzwerkstack zu. Der kommt - typisch für FreeBSD - in einer konservativen Vorkonfiguration, die Leistung kostet. Daher eine Sysctl für /etc/sysctl.conf:

Erhöhe die Socketbuffer. Das kostet Speicher, aber davon hat man heute eh genug. Durch größere Buffer ersparen wir der CPU unnütze Kontextwechsel und der Anwendung unnütze Arbeit. 16 Megabyte sind für 1Gbit genug, für 10GBit sollten es dann mindestens 32 sein.
Code:
kern.ipc.maxsockbuf=16777216

Gleiches gilt für die kerneleigenen Buffer, sie sind geradezu lächerlich niedrig. Daher heben wir erst einmal den Grundwert drastisch an. Auch hier 16 Megabyte.
Code:
net.inet.tcp.sendbuf_max=16777216 
net.inet.tcp.recvbuf_max=16777216

Diese Buffer können vom Kernel automatisch angepasst werden. Allerdings ist in Standardeinstellung die Schrittweite recht gering. Daher erhöhen wir die deutlich:
Code:
net.inet.tcp.sendbuf_inc=16384  
net.inet.tcp.recvbuf_inc=524288

Dann hat FreeBSD das legendäre BSD Inflight Limiting, was unter Umständen den Durchsatz an maximalen Paketen beschränkt, um Überlastsituationen zu vermeiden. Das ist in LANs und bei modernen Gigabit-Verbindungen eher hinderlich, daher schalten wir es ab:
Code:
net.inet.tcp.inflight.enable=0

FreeBSD hat außerdem die Angewihnheit Verbindungen automatisch zu tunen und sich die so ermittelten Werte zu merken. Das ist gut und schön, aber verfälscht deine Messergebnisse. Schalten wir es also ab, bzw. limitieren es auf die von der RFC geforderten 5 Minuten. Je nachdem was die Magie will.
Code:
net.inet.tcp.hostcache.expire=1

Ich hoffe, dass hilft dir ein wenig. :) Wenn nicht, müsste man sich die mbufs vornehmen. Prüfen, wie viele genutzt werden, ob genügend vorhanden sind und sonst dafür sorgen, dass es mehr gibt. Das kann man dann sehen.
 
worship.gif
Yamagi

Danke für die ausführliche Info! :)
 
Ich muss ja nochmal den Vorschlag ein Danke-Buttons hervorkramen. :D Vielleicht hat ja die nächste Forensoftware einen.

Solange sage ich ganz konventionell: Danke Yamagi!

c.
 
Hallo oenone,

ich hoffe nicht das netio auf die Festplatte zugreift? Die anderen Server haben alle langsamer CPUs und laufen unter Linux, dort habe ich das Problem nicht. Da ist CPU Last ein einstelligen Bereich.

Vom FreBSD-Fileserver zu Linux:

Packet size 1k bytes: 114257 KByte/s Tx, 85342 KByte/s Rx.
Packet size 2k bytes: 114285 KByte/s Tx, 98006 KByte/s Rx.
Packet size 4k bytes: 114270 KByte/s Tx, 24746 KByte/s Rx.
Packet size 8k bytes: 114264 KByte/s Tx, 18374 KByte/s Rx.
Packet size 16k bytes: 114234 KByte/s Tx, 3177 KByte/s Rx.
Packet size 32k bytes: 114028 KByte/s Tx, 13016 KByte/s Rx.

von Linux zum FreBSD-Fileserver:

Packet size 1k bytes: 4414 KByte/s Tx, 85232 KByte/s Rx.
Packet size 2k bytes: 99775 KByte/s Tx, 114226 KByte/s Rx.
Packet size 4k bytes: 12510 KByte/s Tx, 114213 KByte/s Rx.
Packet size 8k bytes: 6358 KByte/s Tx, 113561 KByte/s Rx.
Packet size 16k bytes: 14464 KByte/s Tx, 114181 KByte/s Rx.
Packet size 32k bytes: 12325 KByte/s Tx, 113874 KByte/s Rx.


das ist schon komisch, das BSD da weniger Durchsatz bringt und Linux mehr. Die Rechner sind ähnlich aufgebaut. Ich habe im BSD Rechner mit intel- und Broadcom-NIC versucht.

Gruß ré

Hi,


also wenn ich das richtig sehe ist die Beasty Box eindeutig besser.
Du sendest mehr als Du empfängst.

Ich würd mal die Linux Box prüfen.
 
Hi,


also wenn ich das richtig sehe ist die Beasty Box eindeutig besser.
Du sendest mehr als Du empfängst.

Ich würd mal die Linux Box prüfen.

Hallo Bofh,

jein, das ist nur ein kurzer Ausschnitt. Generell ist von Linux zu Linux super Performance, von Linux zu BSD wie du siehst und von BSD zu BSD sind TX und RX sehr schwankend. Ich habe leider nur einen Server in dieser Konfiguration unter BDS und ein paar Desktoprechner mit BSD. Die Server sind alle Xeon 2,8Ghz bis 3,6Ghz mit mind. 2G Ram, die CPU Last bei Linux von netio liegt bei 1-2%, bei BSD geht Sie bis zu 36%.

Gruß ré
 
Zuletzt bearbeitet:
Code:
kern.ipc.maxsockbuf=16777216
Code:
net.inet.tcp.sendbuf_max=16777216 
net.inet.tcp.recvbuf_max=16777216
Code:
net.inet.tcp.sendbuf_inc=16384  
net.inet.tcp.recvbuf_inc=524288
Code:
net.inet.tcp.inflight.enable=0
Code:
net.inet.tcp.hostcache.expire=1

Hallo Yamagi,

für genau solche Antworten kennt und liebt man dich! So habe ich mir das vorgestellt ;-) Wenn meine Nachtschicht vorbei ist werde ich mal testen..

danke ré
 
Hallo,

nun getestet, der Durchsatz in selbiger Kombination wie vorher:
TCP connection established.
Packet size 1k bytes: 114279 KByte/s Tx, 55287 KByte/s Rx.
Packet size 2k bytes: 114287 KByte/s Tx, 62325 KByte/s Rx.
Packet size 4k bytes: 114264 KByte/s Tx, 19150 KByte/s Rx.
Packet size 8k bytes: 114273 KByte/s Tx, 5401 KByte/s Rx.
Packet size 16k bytes: 114232 KByte/s Tx, 10675 KByte/s Rx.
Packet size 32k bytes: 114047 KByte/s Tx, 10667 KByte/s Rx.

CPU bis zu 60% :-( das habe ich in der Form nicht erwartet..

Gruß ré
 
Scheiße. Das ist was ganz und gar nicht so, wie es sein soll. Leider bin ich hier mit meinem Latein am Ende. Eigentlich kann ich dir nur noch raten, das Problem mal auf freebsd-net@ anzusprechen... Da ist eher das Personal, was dir helfen kann, als hier.
 
Hallo Bofh,

jein, das ist nur ein kurzer Ausschnitt. Generell ist von Linux zu Linux super Performance, von Linux zu BSD wie du siehst und von BSD zu BSD sind TX und RX sehr schwankend. Ich habe leider nur einen Server in dieser Konfiguration unter BDS und ein paar Desktoprechner mit BSD. Die Server sind alle Xeon 2,8Ghz bis 3,6Ghz mit mind. 2G Ram, die CPU Last bei Linux von netio liegt bei 1-2%, bei BSD geht Sie bis zu 36%.

Gruß ré

Hi,

Moment, wie ist denn NetIo compiled oder auch gestartet ?
unter Linux wird es IMHO Threaded gestartet und unter BSD nicht.

Gib mal die Parameter mit denen du Testest und welche Versionen mit Compiler Optionen durch.
Eventuell liegt es daran.

Welche Load haben deine Systeme ?
 
Hallo Herr Leisch,

ich habe netio per pkg_add installiert, kann ich mit compilieren optimieren? Mit welchen Optionen muß ich kompilieren? Den Versuch ist es auf jeden Fall Wert.

Gruß ré
 
Zurück
Oben