TCPChimney und Receive Side Scaling (RSS) und Network Direct Memory Access

Give Microsoft’s Scalable Networking Pack Another Look
http://www.windowsitpro.com/article/networking/give-microsofts-scalable-networking-pack-140350
Sehr informativer Artikel über die Funktionen in Windows

Time to revisit recommendations around Windows networking enhancements usually called Microsoft Scalable Networking Pack
http://blogs.technet.com/b/exchange/archive/2011/11/14/time-to-revisit-recommendations-around-windows-networking-enhancements-usually-called-microsoft-scalable-networking-pack.aspx

Netzwerkkarten werden immer schnelle (Aktuell 100 Gigabit) und die Server haben immer mehr CPUs. Um mit der Geschwindigkeit weiter Schritt halten zu können, ist eine sequentielle Verarbeitung der Netzwerkpakete nicht länger angebracht. Durch die Weitverkehrsverbindungen werden wechselnde Laufzeiten von Paketen und Größen eine weitere Herausforderung an die TCP/IP-Stacks.

Schon viele Jahre haben die Netzwerkkarten schon die Aufgabe übernommen, die CRC-Prüfsumme für Ethernet-Pakete zu errechnen und zu prüfen. Diese stupide Tätigkeit muss die Host-CPU damit schon nicht mehr tun, das diese beim Versand entlastet und korrupt empfangene Pakete gar nicht erst über den PCI-Bus übertragen werden müssen. Hier am Beispiel einer Gigabit Karte:

Aber das ist erst der Anfang. Netzwerkkarten sind mittlerweile ebenfalls kleine Computer mit Firmware, Speicher und können mittlerweile auch komplexere Aufgaben übernehmen.

Wenn die Netzwerkkarte quasi auch die TCP oder UDP-Prüfsummen erstellt und schreibt, dann ist klar, dass die Host-CPU letztlich nur noch sagen muss, welchen Datenstrom wohin senden will und die Karte übernimmt den Verbindungsaufbau und die Flusssteuerung. Das ganze wurde schon länger in der NDIS-Spezifikation eingebaut

Sehr viele Hersteller von Netzwerktreibern haben diese Funktion natürlich auch in ihren Treibern aktiviert. Schließlich muss der Kunde ja auch wissen, warum es "Server-Karten" und "Consumer-Karten" gibt. Oft haben die "besseren" Karten eben auch diese Zusatzfunktionen, größere Puffer, während 10 Euro Gigabit-Karten meist auch nur für den Heimbereich sinnvoll einzusetzen sind.

Windows 2003 SP2

.. aber dann kam das Windows 2003 Service Pack 2, welches diese Funktionen erstmals per "Default" auch eingeschaltet hat. Vorher konnten die Netzwerkkartentreiber ja schön behaupten, sie könnten alles. Es ist ja niemandem aufgefallen, weil Windows die bereit gestellten Funktionen einfach noch nicht genutzt hatte. Aber nun ist alles anders. Windows 2003 SP2 hat als Standard nun die Nutzung dieser Optionen aktiviert. Und schon liefen einige Produkte und Services nicht mehr, wie gewohnt.

Schuld war daran meistens der Netzwerkkartentreiber, welche die von der Karte bereit gestellten Funktionen nicht korrekt umgesetzt hat. So konnte es passieren, dass beim TCP Offloading vergessen wurde, alte Sessions abzubauen und damit nach einigen Stunden, Tagen oder gar Wochen (je nach Last) der Server keine neuen Verbindungen mehr angenommen hat.

Eine ganze Menge von KB-Artikeln dokumentiert dieses Desaster.

Meist half einfach ein Update des Netzwerkkartentreibers, um dem Spuk ein Ende zu machen. Wer dies nicht so schnell durchführen konnte oder wollte, kann mit wenigen Befehlen die "Vor SP2-Einstellung wieder aktivieren

Sie können TCPChimney direkt per Kommandozeile abschalten.

Rem Windows 2003
Netsh int ip set chimney DISABLED
Rem Windows 2008
netsh int tcp set global chimney=disabled

Oder um alles abzuschalten

Netsh int tcp set global 
   rss=disabled 
   chimney=disabled 
   autotuninglevel=highlyrestricted 
   congestionprovider=none 
   netdma=disabled dca=disabled 
   ecncapability=disabled 
   timestamps=enabled

Die folgenden Registrierungsschlüssel wirken erst nach einen Reboot.

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters]
"EnableTCPA"=dword:00000000
"EnableRSS"=dword:00000000
"EnableTCPChimney"=dword:00000000

Wenn Sie TCPChimeny, RSS und andere Funktionen abschalten können Sie entweder folgende REG-Datei importieren oder die ADM-Datei in einer Gruppenrichtlinien einbinden:
win2003sp2tcp.adm
win2003sp2tcp.reg
Bitte die Endung .TXT nach dem Download entfernen.

Ein Windows Update im März 2008 schaltet diese Funktion auch ab
948496 An Update to turn off default SNP features is available für Windows Server 2003-based and Small Business Server 2003-based computers
950224 A Scalable Networking Pack (SNP) hotfix rollup package is available für Windows Server 2003

Es reicht übrigens wohl auch aus, auf der Netzwerkkarte z.B. das CRC Offloading abzuschalten. Da damit Windows für diese Funktion zuständig ist, werden auch alle anderen Funktionen nicht mehr abgeladen.

Abschalten oder Einschalten?

Ehe Sie nun vorschnell all diese Funktionen abschalten, sollten Sie kurz Innehalten. Microsoft hat sich natürlich etwas dabei gedacht, diese Funktion zu entwickeln und auch zu aktivieren. Wer konnte denn damit rechnen, dass viele Kunden ihre Gigabit-Treiber jahrelang nicht aktualisiert haben. Aktuelle Server mit mehreren CPUs können die Leistung nur bringen, wenn die Netzwerkkarte nicht mehr nur über die CPU0 geht, sondern Pakete und Arbeit verteilt werden. Daher sind die neuen Funktion durchaus sinnvoll und ratsam einzuschalten.

In einer Mail vom Februar 2011 hat Microsoft noch mal ganz deutlich gemacht.

  • Bitte schalten Sie TCPChimney, RSS, Network Direct Memory Access etc. ein
  • Wenn Sie Windows 2008 einsetzen und die RSS-Abschaltung löst das Problem, dann installieren Sie bitte SP2.
  • Installieren Sie aktuelle Treiber für Netzwerkkarte, Virenscanner etc.

Wenn es dann immer noch nicht funktionieren sollte, dann sollten Sie einen Support-Call bei Microsoft aufmachen. Diese neuen Funktionen sind für die Performance wichtig und es sollten allen Parteien etwas daran liegen, das Problem zu finden und zu beheben.

Hier der Auszug einer Mail zum diesem Thema:

Some Basics First …
The main purpose of RSS is spreading the processing of network interrupts across multiple processors instead of 1 CPU. This is advantageous in a variety of workloads & can be tweaked more in W2008 R2 than W2008, see the doc referenced before. 1Gb network cards can absolutely see a benefit with RSS, we’ve seen this inside Microsoft.

The main purpose of TCP Chimney is offloading all TCP/IP connection processing to the network card, when possible. It is most useful in workloads with consistent connections transmitting large amounts of data, not so much für client/server chatty applications (email, etc.). It does provide more benefit with 10Gb.

Chimney is incompatible with some features in Windows (firewall, etc.), & if they are enabled Chimney will not offload any connection. In W2008 R2, the Windows Firewall is compatible with Chimney, which was a change from previous OS.
TCP Chimney Offload is not the same thing as Checksum Offload, Large Send Offload, etc. Those Offloads have been around für since W2003 & are generally problem free.

RSS & Chimney both require the above basic checksum offloads to function, so disabling any of them (in NIC properties) will automatically keep RSS and Chimney from being used.

Details
W2003 SP2: RSS, Chimney & NetDMA are known to be problematic. Customers should disable these manually or use KB:948496. If you really need the features, install SNP roll-up (KB:912222) für W2003 and re-enable features.
W2008 RTM: RSS is on by default but Chimney is off. RSS had some issues that customers hit after installing W2008, most were resolved in SP2, & remaining were solved in KB:979614 (which brings RSS/Chimney to W2008 R2 level).
W2008 R2: RSS is on by default & Chimney is in ‘Automatic’ mode, which means the TCP connection being offloaded has to be 10Gb speed, less than 20ms latency between the 2 end points, & transmitted at least 130k. See page 6-7 of ‘W2008 R2 Networking Deployment Guide: Deploying High-Speed Networking Features
Win2008 R2 SP1 does not contain any fixes related to Chimney, and only has 1 fix für RSS that fixes a bug where RSS only uses 1 CPU when you have over 32 processors, KB:977977

Call to Action
- Standard practice of disabling these features is alarming!
- Disabling these features hurts performance badly!
- If your customer is on W2008 & disabling RSS resolves issues für them, please get them on SP2 + KB979614
- upgrade NIC drivers, filter drivers (Antivirus, Firewall, NIC-teaming, etc.) & BIOS - applies also to W2008 R2
- If that still doesn’t solve their issue, engage & escalate so that we can find the root cause of their problem & fix it! J
- If you know about Microsoft or third party documentation which provides incorrect guidance in this regard, please let us know.

Auch der folgende Artikel macht dies noch mal deutlich

Give Microsoft’s Scalable Networking Pack Another Look
http://www.windowsitpro.com/article/networking/give-microsofts-scalable-networking-pack-140350
Sehr informativer Artikel über die Funktionen in Windows

Offloading und Wireshark

Manchmal gibt es natürlich auch Verbindungsprobleme. Oft hilft dann schon ein Blick mit Wireshark und Co auf der Netzwerkkarte. Eine normale SMTP-Verbindung mit einer großen Anlage sieht z.B. wie folgt aus

Wenn Sie sich die Paketgröße anschauen, dann sind die größten Pakete ca. 1454 Bytes und solange Pakete gesendet werden, kommen immer auch wieder ein paar ACK-Quittungen zurück. Siehe dazu auch TCP SYN ACK RES.

Hier ist aber ein Mitschnitt einer Verbindung, die anscheinend Probleme hat. Es ist eine normale TCP-Verbindung zum Versand einer Mail nach extern. Wenn Sie genau hinschauen, Der TCP-Verbindungsaufbau selbst ist nicht zu sehen aber im ersten Paket finden Sie den "220 OK" des Zielsystems auf den Connect. Der lokale Host als Sender startet dann ein "EHLO" und in den weiteren Paketen auch den MAIL FROM und RCPT TO und das DATA. Nach dem DATA des Client quittiert der Server das Paket erst mal mit einem ACK, weil er nun Platz reservieren muss. Kurz darauf kommt dann aber schon das "354 2.0.0 Start Mail input" (oberer roter Kasten).

Nun ist es an dem lokalen Client die Daten zu senden. Das grün umrandete Feld enthält aber nun 13000Bytes, d.h. der SMTP-Client übergibt der Netzwerkkarte ein recht großes Paket. Das kann nur funktionieren, wenn die Netzwerkkarte zum Betriebssystem meldet, dass das Übertragungsmedium so große Pakete senden kann. Das geht natürlich nicht aber die Netzwerkkarte teilt die Pakete nun auf in kleine Happen. Die ganze Abwicklung wird auf die Netzwerkkarte "abgeladen".

Dass dabei aber etwas schief geht erkennt man am nächsten Paket. Hier kommt ein "Resend" des vorherigen Pakets noch einmal an. Mein 13000 Byte Paket hat also nicht die Gegenseite in der erwarteten Zeit erreichet. Ich habe aber das "DATA"-Paket auch nicht mit einem ACK quittiert. Also muss das Ziel davon ausgehen, dass hier ein Paket verloren gegangen ist und sendet es noch einmal. Das kann auch per Perfmon erfasst werden. (Siehe TCP Retransmit Monitoring)

Mein Client bekommt das Paket und sendet ein ACK und so weiter. Die Verbindung mit dieser Gegenstelle ist so nicht erfolgreich weiter geführt worden. Ob das Problem nun wirklich das Offloading mit einem veralteten Treiber ist, eine Firewall dazwischenfunkt oder auf der Empfängerseite ein Problem besteht, kann aus dem Trace so nicht ermittelt werden. Dazu wäre nun ein Mitschnitt auf dem richtigen Kabel über einen Mirror-Port am Switch notwendig und auf der Gegenseite wünschenswert.

Denn jeder Mitschnitt auf dem Server selbst sieht nur die Pakete, die an die Netzwerkkarte übergeben werden aber nicht, was die Netzwerkkarte mit ihrer Intelligent noch daraus macht. 

RSS und Exchange

Exchange hat sogar einen eigenen Monitor der die Konfiguration von RSS überprüft. Sollte die Einstellung nicht passen, dann finden Sie einen Eintrag im Eventlog

Protokollname: Microsoft-Exchange-ManagedAvailability/Monitoring
Quelle:        Microsoft-Exchange-ManagedAvailability
Datum:         26.09.2018 02:41:34
Ereignis-ID:   4
Aufgabenkategorie:Monitoring
Ebene:         Fehler
Schlüsselwörter:
Benutzer:      SYSTEM
Computer:      ex01.msxfaq.net
Beschreibung:
<b>Der empfangsseitige Skalierungsstatus des Netzwerkadapters sollte aktiviert sein. 
Das Festlegen von "rss" auf aktiviert konnte das Problem nicht beheben. 
Der Server sollte neu gestartet werden.</b>
<hr /> <b>Siehe letzte Testfehlermeldung:</b> 
{Die Sequenz enthält keine Elemente.}
<hr /> <b>Gesamtzahl der innerhalb der letzten 20 Minuten erfassten Netzwerkadapter-Testfehler:</b>{0}
<hr />

Hier ist der Counter für den Test aber "0". Ich tippe hier auf ein Sprachproblem, denn in einem weiteren Eventlog-Eintrag sieht man den Misch zwischen Englisch und Deutsch:

Protokollname: Microsoft-Exchange-ActiveMonitoring/ProbeResult
Quelle:        Microsoft-Exchange-ActiveMonitoring
Datum:         26.09.2019 11:35:07
Ereignis-ID:   2
Aufgabenkategorie:Probe result
Ebene:         Fehler
Schlüsselwörter:
Benutzer:      SYSTEM
Computer:      EX01.uclabor.de
Beschreibung:
Probe result (Name=NetworkAdapterRssProbe)
Ereignis-XML:
<Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
  <System>
    <Provider Name="Microsoft-Exchange-ActiveMonitoring" Guid="{ECD64F52-A3BC-47B8-B681-A11B7A1C8770}" />
    <EventID>2</EventID>
    <Version>0</Version>
    <Level>2</Level>
    <Task>2</Task>
    <Opcode>0</Opcode>
    <Keywords>0x800000000000000</Keywords>
    <TimeCreated SystemTime="2019-09-26T09:35:07.582048000Z" />
    <EventRecordID>13691487</EventRecordID>
    <Correlation ActivityID="{FE126B52-B8BE-47CD-9FE2-457957A5FEB6}" />
    <Execution ProcessID="24752" ThreadID="53184" />
    <Channel>Microsoft-Exchange-ActiveMonitoring/ProbeResult</Channel>
    <Computer>EX01.uclabor.de</Computer>
    <Security UserID="S-1-5-18" />
  </System>
  <UserData>
    <EventXML xmlns:auto-ns2="http://schemas.microsoft.com/win/2004/08/events" xmlns="myNs">
      <ResultId>9339392</ResultId>
      <ServiceName>Network</ServiceName>
      <IsNotified>0</IsNotified>
      <ResultName>NetworkAdapterRssProbe</ResultName>
      <WorkItemId>1900341052</WorkItemId>
      <DeploymentId>0</DeploymentId>
      <MachineName>EX01</MachineName>
      <Error>Die Sequenz enthält keine Elemente.</Error>
      <Exception>System.InvalidOperationException: Die Sequenz enthält keine Elemente.
   bei System.Linq.Enumerable.First[TSource](IEnumerable`1 source)
   bei Microsoft.Exchange.Monitoring.ActiveMonitoring.Local.Components.Network.Probes.NetworkAdapterRssProbe.DoWork(CancellationToken cancellationToken)
   bei System.Threading.Tasks.Task.Execute()
--- Ende der Stapelüberwachung vom vorhergehenden Ort, an dem die Ausnahme ausgelöst wurde ---
   bei System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   bei System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   bei Microsoft.Office.Datacenter.WorkerTaskFramework.WorkItem.&lt;ExecuteAsync&gt;d__b.MoveNext()
--- Ende der Stapelüberwachung vom vorhergehenden Ort, an dem die Ausnahme ausgelöst wurde ---
   bei System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   bei System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   bei Microsoft.Office.Datacenter.WorkerTaskFramework.WorkItem.&lt;StartExecutingAsync&gt;d__7.MoveNext()</Exception>
      <RetryCount>0</RetryCount>
      <StateAttribute1>TCP Global Parameters could be obtained successfully. Der aktive Status wird abgefragt...
&lt;br /&gt;

&lt;br /&gt;
Globale TCP-Parameter
&lt;br /&gt;
----------------------------------------------
&lt;br /&gt;
Zustand der empfangsseitigen Skalierung          : enabled 
&lt;br /&gt;
Chimney-Abladezustand               : disabled 
&lt;br /&gt;
NetDMA-Zustand                        : disabled 
&lt;br /&gt;
Direkter Cachezugriff (DCA)           : disabled 
&lt;br /&gt;
Autom. Abstimmungsgrad Empfangsfenster    : normal 
&lt;br /&gt;
Add-On "Überlastungssteuerungsanbieter"  : default 
&lt;br /&gt;
ECN-Funktion                      : enabled 
&lt;br /&gt;
RFC 1323-Zeitstempel                 : disabled 
&lt;br /&gt;
RTO (anfänglich)                         : 400 
&lt;br /&gt;
Zustand der Empfangssegmentzusammenfügung    : enabled 
&lt;br /&gt;
Nicht-SACK-RTT-Resilienz             : disabled 
&lt;br /&gt;
Maximale SYN-Neuübertragungen             : 2 
&lt;br /&gt;
TCP-Fastopen                       : disabled 
&lt;br /&gt;

&lt;br /&gt;
&lt;br /&gt;
</StateAttribute1>
      <StateAttribute2>[null]</StateAttribute2>
      <StateAttribute3>[null]</StateAttribute3>
      <StateAttribute4>[null]</StateAttribute4>
      <StateAttribute5>[null]</StateAttribute5>
      <StateAttribute6>0</StateAttribute6>
      <StateAttribute7>0</StateAttribute7>
      <StateAttribute8>0</StateAttribute8>
      <StateAttribute9>0</StateAttribute9>
      <StateAttribute10>0</StateAttribute10>
      <StateAttribute11>[null]</StateAttribute11>
      <StateAttribute12>[null]</StateAttribute12>
      <StateAttribute13>[null]</StateAttribute13>
     <StateAttribute14>[null]</StateAttribute14>
      <StateAttribute15>[null]</StateAttribute15>
      <StateAttribute16>0</StateAttribute16>
      <StateAttribute17>0</StateAttribute17>
      <StateAttribute18>0</StateAttribute18>
      <StateAttribute19>0</StateAttribute19>
      <StateAttribute20>0</StateAttribute20>
      <StateAttribute21>[null]</StateAttribute21>
      <StateAttribute22>[null]</StateAttribute22>
      <StateAttribute23>[null]</StateAttribute23>
      <StateAttribute24>[null]</StateAttribute24>
      <StateAttribute25>[null]</StateAttribute25>
      <ResultType>4</ResultType>
      <ExecutionId>63228499</ExecutionId>
      <ExecutionStartTime>2019-09-26T09:35:07.5454306Z</ExecutionStartTime>
      <ExecutionEndTime>2019-09-26T09:35:07.5814583Z</ExecutionEndTime>
      <PoisonedCount>0</PoisonedCount>
      <ExtensionXml>[null]</ExtensionXml>
      <SampleValue>0</SampleValue>
      <ExecutionContext>[null]</ExecutionContext>
      <FailureContext>[null]</FailureContext>
      <FailureCategory>-1</FailureCategory>
      <ScopeName>[null]</ScopeName>
      <ScopeType>[null]</ScopeType>
      <HealthSetName>[null]</HealthSetName>
      <Data>[null]</Data>
      <Version>0</Version>
    </EventXML>
  </UserData>
</Event>

Also wieder ein Argument für englische Server.

Weitere Links