Windows Server 2008 UDP Multicast-Leistungsproblem

7

Bei 2008 R2 Enterprise SP1 tritt ein seltsames Leistungsproblem auf.

Hier ist das Setup:

  • Viele Prozesse, die unterschiedliche Multicast-UDP-Streams abhören (5 Multicasts hören pro Prozess ab), sind an eine einzelne Netzwerkkarte gebunden
  • Prozessübergreifend verwenden alle Multicasts denselben Portbereich, aber unterschiedliche Multicast-IPs (wichtiges Detail, da jeder Multicast-Empfänger für einen bestimmten Port ein Server des REUSED-Server-Sockets ist).
  • Jede Prozess-Multicast-Bandbreite beträgt 10 Mbit
  • RSS auf NIC eingestellt, maximale Offload-Einstellungen auf NIC & OS eingestellt, MSI aktiviert

Verhalten:

  • Bei 17 Abhörprozessen (ca. 85 verbundene UDP-Multicasts) ist die Auswirkung der Kernel-CPU vernachlässigbar.
  • Zwischen 17 und 22 Listenern (ca. 110 verbundene UDP-Multicasts) wächst die CPU-Auslastung des Kernels langsam, ist aber akzeptabel
  • Ab 25 Jahren hat jeder verbundene Multicast enorme Auswirkungen auf die Kernel-CPU-Zeit. Dies wirkt sich auf alle RSS-gebundenen CPUs aus
  • Die pro Abhörprozess verwendete CPU-Zeit liegt nahe 0 (normal, da Prozesse nur das Multicast lesen), sodass das eigentliche Problem in der Betriebssystemkomponente liegt

Was wir gefunden haben:

  • Das Ändern der NIC-Hardware hat keine Auswirkungen auf das Verhalten (Getestet auf HP NC382i, Broadcom-basierter NIC und HP NC365T, Quad Gigabit, Intel-basiert).
  • Die globale Empfangsbandbreite ist nicht der begrenzende Faktor (ein einzelner 500-Mbit-Stream löst keine CPU-Last aus).
  • Das Lesen am Multicast-Socket scheint nicht der einschränkende Faktor zu sein (wir haben den Test mit nur dummen JOIN-Prozessen für die Multicast-Streams und dem Problem der reproduzierten CPU-Auslastung durchgeführt).
  • Das Aufteilen von Multicast-Verkehr auf zwei Netzwerkkarten scheint die CPU-Auslastung und -Verbreitung besser zu begrenzen. Dies ist jedoch kein Anwendungsfall für uns.

Problem:

  • Wir müssen mindestens 500 Multicast-Streams und vielleicht bis zu 750 hören können
  • Dieselbe Hardware unter XP OS weist dieses Verhalten in der CPU-Kernel-Zeit nicht auf

Ausgewählte Komponente:

  • NDIS.sys scheint ein guter Kandidat für die Erklärung des Anstiegs der CPU-Auslastung zu sein.

Hat einer von Ihnen auf solche Probleme gestoßen und könnte eine Richtung zur Untersuchung geben. Ich habe alles gelesen, was ich über die Verbesserung der Netzwerkleistung von Win Server 2008 wissen konnte, aber alle scheinen mit dem TCP-Verkehr verbunden zu sein. Ich habe auch alle möglichen Optimierungen getestet, die über die Registrierung oder den Befehl netsh durchgeführt werden können.

Dweeves
quelle
Bearbeiten: Die Verwendung verschiedener Ports zum Abhören von Multicast-Streams verringert die CPU-Auslastung, jedoch nicht. Ein Teil des Problems scheint also an die Wiederverwendung von Server-Sockets gebunden zu sein. Selbst bei unterschiedlichen Ports scheinen die Kosten für den Verbrauch von nur 250 Multicast-Streams etwas
hoch zu sein
Sie müssen für jeden Stream separate Ports verwenden, andernfalls wird WinSock jedes Paket an jeden Teilnehmer-Socket multiplexen und dann herausfiltern. Dies unterscheidet sich von Unix und Linux, die keine zusätzliche Filterung durchführen und bei jedem Socket alle Pakete sehen.
Steve-o
Vergessen Sie auch nicht, dass die Einschränkungen für die Zuordnung von Multicast-MAC-Adressen 238.1.1.1 und 239.1.1.1 praktisch identisch sind.
Steve-o
@dweeves Wie verbinden sich Server und Clients? Verbinden sie sich mit einem Layer 2-Switch? Dieser Switch unterstützt IGMP-Snooping?
Ricardo Polo Jaramillo
@dweeves, ich kann bestätigen, dass alle eindeutigen Zielports das Problem lösen. Nicht, dass dies eine vollständige Situation ist, hoffen Sie, dass jemand anderes eine bessere Lösung hat? Ich habe mit> 100 udp-Streams getestet, mit eindeutigen Quellports und eindeutigen Multicast-Adressen. Das einzige, was zu funktionieren scheint, sind einzigartige Endports.
GizMoCuz

Antworten:

2

Das sind viele Multicast-Streams. In der Regel haben NICs eine niedrige Grenze für die Hardwarefilterung. Wenn Sie diese überschreiten, löschen sie entweder alles (schlechte Implementierung auf billigen NICs) oder leiten alles an das Betriebssystem weiter, damit es stattdessen gefiltert wird. Wenn das Betriebssystem die Filterung durchführt, wird Ihre Prozessorauslastung in die Höhe schnellen.

Abgesehen von der Untersuchung verschiedener Hardware, von denen Sie einige auflisten, können Sie auch auf 10GigE-Basis erweitern. Die einzige Option ist die Verwendung von Proxyservern.

Durch Experimentieren finden Sie eine Reihe von Multicast-Streams, die zuverlässig verwaltet werden können, und leiten die Streams dann über TCP an einen zentralen Server oder eine Reihe von Servern weiter. Dieser zentrale Server kann dann die TCP-Segmentierungsbeschleunigung oder den vollständigen ToE verwenden, um die eingehende Netzwerklast für den Prozessor unbedeutend zu machen.

Aufgrund der sehr schlechten Windows-Treiber kann ich mit Broadcom-Hardware überhaupt keine angemessenen Multicast-Raten erzielen. Es wäre interessant zu sehen, wie Linux auf derselben Hardware funktioniert, was Ihnen einen guten Hinweis auf die Hardware- und IP-Stack-Qualität geben sollte.

Sie listen Windows XP als einwandfrei auf. Der Hauptunterschied zwischen Windows Server und Windows XP ist die Quantenzeit. Windows Server bietet längere Quantenzeiten. Es könnte sich lohnen, zu untersuchen, ob ein kürzeres Quantum erzwungen werden soll (wenn Sie es überhaupt festlegen können).

Steve-o
quelle
@dweeves, also warte, wie ist die Verteilung der Ports und Adressen in der Frage? Adressen werden von der Netzwerkkarte gefiltert, Ports vom Betriebssystem.
Steve-o
Die letzte Untersuchung, die ich durchgeführt habe, hat es geschafft, 250 Streams bei 0% CPU zu erreichen, aber mit einer einzelnen Multicast-Adresse und 250 verschiedenen Ports. Es scheint also, dass zu viele Multicast-Adressen Probleme mit dem Betriebssystem verursachen (wahrscheinlich aufgrund einiger Filterbeschränkungen). Es gibt keine Möglichkeit , mehrere Server und Proxy, der Kern Interesse der Entwickler ist , ich mache mit einer Masse ne zu erreichen
dweeves