Fileserver-Performance-Probleme (insb. Branchensoftware wie DS-Win, Datev, BDE-basierte Anwendungen) in physischen und Hyper-V-Umgebungen unter Windows Server 2016/2019/2022/2025.
Vorbedingung: Die häufigsten Ursachen wurden bereits ausgeschlossen:
- Defekte Hardware (Kabel, Switch-Port, NIC)
- Virenscanner / EDR (Ausschlüsse für Datenbank-/Freigabepfade)
- DNS-Konfiguration (nur interne DNS, keine öffentlichen Forwarder auf Clients)
- Netzwerk-Auslastung / Duplex-Mismatch
- Ausreichend RAM/CPU auf Host und VM
Hinweis: Änderungen schrittweise durchführen, zwischen den Schritten jeweils testen. Nicht alle Maßnahmen pauschal anwenden.
1. NIC-Offloading deaktivieren (LSO/RSC)
Ursache
Large Send Offload (LSO) und Receive Segment Coalescing (RSC) lassen die Netzwerkkarte Paket-Segmentierung bzw. -Zusammenführung übernehmen. In virtualisierten Umgebungen (Hyper-V) führt dies häufig zu Re-Segmentierung im vSwitch, erhöhter Latenz und Paketverlusten – besonders spürbar bei vielen kleinen SMB-Requests.
Durchführung – Physischer Host / Fileserver (Bare Metal)
Gerätemanager → Netzwerkadapter → physische NIC → Rechtsklick → Eigenschaften → Reiter "Erweitert"
Folgende Einträge auf Deaktiviert setzen:
- Large-Send-Offload V2 (IPv4)
- Large-Send-Offload V2 (IPv6)
Durchführung – Virtuelle Maschine (Hyper-V Gast)
Gerätemanager → Netzwerkadapter → Hyper-V Virtual Ethernet Adapter → Rechtsklick → Eigenschaften → Reiter "Erweitert"
Folgende Einträge auf Deaktiviert setzen:
- Large Send Offload Version 2 (IPv4)
- Large Send Offload Version 2 (IPv6)
- Recv Segment Coalescing (IPv4)
- Recv Segment Coalescing (IPv6)
Alternativ via PowerShell (schneller, reproduzierbar)
powershell
# Aktuelle Einstellungen anzeigen
Get-NetAdapterAdvancedProperty -Name "Ethernet" | Where-Object DisplayName -like "*Offload*"
# LSO deaktivieren
Disable-NetAdapterLso -Name "Ethernet"
# RSC deaktivieren (nur im Gast relevant)
Disable-NetAdapterRsc -Name "Ethernet"
Verifikation
powershell
Get-NetAdapterLso -Name "Ethernet"
Get-NetAdapterRsc -Name "Ethernet"
Erwartet: V2IPv4Enabled : False, V2IPv6Enabled : False, IPv4Enabled : False, IPv6Enabled : False.
Rollback
powershell
Enable-NetAdapterLso -Name "Ethernet"
Enable-NetAdapterRsc -Name "Ethernet"
Oder im Gerätemanager die Einträge wieder auf „Aktiviert“ setzen.
2. Software-RSC im Hyper-V vSwitch deaktivieren
Ursache
RSC im vSwitch ist seit Server 2019 standardmäßig aktiv. Es bündelt eingehende Pakete, bevor sie an die VM durchgereicht werden. Bei Workloads mit vielen kleinen Requests (SMB, Branchen-DBs) führt das zu erhöhter CPU-Last und Latenz-Spitzen.
Quelle: Microsoft Docs – RSC im vSwitch
Durchführung (am Hyper-V-Host, PowerShell als Administrator)
powershell
# Alle vSwitches auflisten (Name ermitteln)
Get-VMSwitch
# Software-RSC auf dem gewünschten vSwitch deaktivieren
Set-VMSwitch -Name "vSwitchName" -EnableSoftwareRsc $false
Verifikation
powershell
Get-VMSwitch -Name "vSwitchName" | Select-Object Name, EnableSoftwareRsc
Erwartet: EnableSoftwareRsc : False
Rollback
powershell
Set-VMSwitch -Name "vSwitchName" -EnableSoftwareRsc $true
3. SMB-AutoDisconnect abschalten
Ursache
Der SMB-Server trennt Idle-Sessions standardmäßig nach 15 Minuten. Anwendungen, die Handles dauerhaft offen halten oder sporadisch zugreifen, müssen dadurch ständig neu verbinden – das erzeugt merkliche Verzögerungen und im schlimmsten Fall Lock-Probleme.
Durchführung (am Fileserver, CMD oder PowerShell als Administrator)
cmd
net config server /autodisconnect:-1
Der Wert -1 deaktiviert das automatische Trennen vollständig.
Verifikation
cmd
net config server
Erwartet in der Ausgabe: Leerlaufzeit einer Serversitzung (Min): -1
Rollback
cmd
net config server /autodisconnect:15
(15 Minuten = Windows-Standardwert)
4. SMB-Leases auf kritischen Freigaben deaktivieren
Ursache
SMB-Leases cachen Datei-Handles clientseitig, um Round-Trips zum Server zu sparen. Bei Multi-User-Zugriff auf dieselben Dateien (z. B. geteilte Datenbanken wie BDE, Paradox, proprietäre Branchenformate) führen Leases zu Invalidierungs-Kaskaden und Locking-Problemen. Das Abschalten zwingt jeden Zugriff zum direkten Server-Round-Trip – langsamer im Einzelzugriff, aber deutlich stabiler und oft schneller bei konkurrierendem Zugriff.
Achtung: Nur auf Freigaben anwenden, bei denen das Verhalten dokumentiert problematisch ist (z. B. DS-Win). Nicht pauschal auf alle Freigaben.
Durchführung (am Fileserver, PowerShell als Administrator)
powershell
# Beispiel: Freigabe "H" (Freigabename, nicht Laufwerksbuchstabe)
Set-SmbShare -Name "H" -LeasingMode None
# Rückfrage mit "J" bestätigen
Verifikation
powershell
Get-SmbShare -Name "H" | Select-Object *
Erwartet: LeasingMode : None
Rollback
powershell
Set-SmbShare -Name "H" -LeasingMode Full
5. Optionale weitere Stellschrauben
Diese Punkte nur gezielt prüfen, wenn die obigen Maßnahmen nicht ausreichen:
NIC-Ebene
- VMQ (Virtual Machine Queues): Bei älteren Broadcom-NICs bekannt problematisch – testweise deaktivieren (
Disable-NetAdapterVmq). - Interrupt Moderation: Bei latenzsensiblen Workloads auf „Low“ oder „Off“ stellen.
- Flow Control: Auf Switch- und NIC-Seite abgleichen (beide an oder beide aus).
- Jumbo Frames (MTU 9000): Nur wenn End-to-End durchgängig unterstützt (NIC, Switch, Gegenstelle). Sonst kontraproduktiv.
- SR-IOV: Bei unterstützter Hardware im Hyper-V aktivieren für minimale Overhead-Pfade.
SMB-Ebene
- SMB-Signing: Sicherheitsrelevant – nicht leichtfertig abschalten. Falls via GPO erzwungen und Performance-kritisch, Auswirkungen bewusst abwägen.
- Oplocks:
Set-SmbClientConfiguration -OplocksDisabled $truenur als Ausnahme bei nachweislichen Problemen. Pauschales Deaktivieren verschlechtert die Performance in den meisten Fällen. - SMB-Multichannel: Prüfen, ob sinnvoll nutzbar (mehrere NICs oder RSS-fähige Adapter).
Server-Ebene
- Energieoptionen: Auf „Höchstleistung“ stellen (
powercfg -setactive SCHEME_MIN). Balanced-Profile drosseln CPU-Takt. - Receive Side Scaling (RSS): Aktiv halten, mehrere CPU-Kerne für NIC-Interrupts konfigurieren.
6. Dokumentation nach Änderung
Nach jedem Eingriff dokumentieren:
- Datum, Uhrzeit, durchführende Person
- Betroffener Server / VM / Freigabe
- Ausgangszustand (Ausgabe der
Get-*-Cmdlets) - Durchgeführte Änderung
- Neuer Zustand (Verifikations-Ausgabe)
- Wahrgenommene Auswirkung (subjektiv + ggf. Messung)
