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
- Receive-Side Scaling Enhancements in Windows Server
2008
http://msdn.microsoft.com/en-us/windows/hardware/gg463253
http://download.microsoft.com/download/a/d/f/adf1347d-08dc-41a4-9084-623b1194d4b2/RSS_Server2008.docx - High-Performance Networking With NDIS 6.0, TCP
Chimney Offload
http://download.microsoft.com/download/5/b/9/5b97017b-e28a-4bae-ba48-174cf47d23cd/net097_wh06.ppt
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.
- http://blogs.technet.com/b/exchange/archive/2007/07/18/446400.aspx
- Scalable Networking: Network Protocol Offload - Introducing TCP Chimney http://www.microsoft.com/whdc/device/network/TCP_Chimney.mspx
- 936594 You may experience network-related problems after you install Windows Server 2003 SP2 or the Scalable Networking Pack on a Windows Small Business Server 2003-based computer that has an advanced network adapter
- 925815 An Exchange 2007 server stops responding to a MAPI client and logs event ID 9646 in the Application log
- 945977 Some problems occur after installing Windows Server 2003 SP2
- 936541 Exchange services do not start after you install Windows Server 2003 Service Pack 2
- Windows Server 2003 Scalable Network Pack
http://blogs.technet.com/dmelanchthon/archive/2008/03/13/windows-server-2003-scalable-network-pack.aspx - 948496 An Update to turn off default SNP features is available für Windows Server 2003-based and Small Business Server 2003-based computers
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.<ExecuteAsync>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.<StartExecutingAsync>d__7.MoveNext()</Exception> <RetryCount>0</RetryCount> <StateAttribute1>TCP Global Parameters could be obtained successfully. Der aktive Status wird abgefragt... <br /> <br /> Globale TCP-Parameter <br /> ---------------------------------------------- <br /> Zustand der empfangsseitigen Skalierung : enabled <br /> Chimney-Abladezustand : disabled <br /> NetDMA-Zustand : disabled <br /> Direkter Cachezugriff (DCA) : disabled <br /> Autom. Abstimmungsgrad Empfangsfenster : normal <br /> Add-On "Überlastungssteuerungsanbieter" : default <br /> ECN-Funktion : enabled <br /> RFC 1323-Zeitstempel : disabled <br /> RTO (anfänglich) : 400 <br /> Zustand der Empfangssegmentzusammenfügung : enabled <br /> Nicht-SACK-RTT-Resilienz : disabled <br /> Maximale SYN-Neuübertragungen : 2 <br /> TCP-Fastopen : disabled <br /> <br /> <br /> </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
- TCP Offloading/Chimney & RSS…What is it and should I
disable it?
https://blogs.technet.microsoft.com/onthewire/2014/01/21/tcp-offloadingchimney-rsswhat-is-it-and-should-i-disable-it/ - Receive-Side Scaling Enhancements in Windows Server
2008
http://msdn.microsoft.com/en-us/windows/hardware/gg463253
http://download.microsoft.com/download/a/d/f/adf1347d-08dc-41a4-9084-623b1194d4b2/RSS_Server2008.docx - High-Performance Networking With NDIS 6.0, TCP
Chimney Offload
http://download.microsoft.com/download/5/b/9/5b97017b-e28a-4bae-ba48-174cf47d23cd/net097_wh06.ppt - W2008 R2 Networking Deployment Guide: Deploying High-Speed Networking Features
- KB:977977 RSS network throughput performance decreases on Windows Server 2008 R2-based computers that have more than 32 processors
- KB:948496 An Update to turn off default SNP features is available für Windows Server 2003-based and Small Business Server 2003-based computers
- KB:979614 Description of a reliability Update für the TCP Chimney Offload feature in Windows Server 2008 and in Windows Vista
- How to Enable or Disable the Receive Window Auto
Tuning Level in Vista
http://www.vistax64.com/tutorials/72308-auto-tuning-tcp-ip-receive-level.html - Kurz notiert: TCP Offload Engines Entlaster
https://www.heise.de/select/ix/2016/9/1472712874061267 - Using NetDMA
https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2008-R2-and-2008/gg162716(v=ws.10) - TCP-Offload – Fluch oder Segen?
https://www.comconsult-research.de/tcp-offload-fluch-2/