Ab Kernel 6.14 wurde der Intel-Scheduler umgebaut (wie
@Falk R. schon erwähnte). Bei Dual Xeon führt das zu:
- Falscher Zuordnung von Threads zu L3-Domains
- Häufiger Migration zwischen NUMA-Nodes
- Unnötig viele „wakeups“ auf entfernten Nodes
- Memory Access über QPI/UPI
Der Kernel macht dann falsches NUMA-Balancing, sobald der Workload viel L3 + viel Websocket/HTTP/Worker-wechselseitigen Traffic erzeugt, was bei Deinem IIS dann der Fall ist. Dieser nutzt Web Core Thread Pools, Request Queues, HTTP.sys Kernel Mode Driver & Worker Processes, welche alle sehr NUMA-"sensitiv" sind. Ebenso abähngig von der L3-Cache-Lokalisierung und zudem anfällig, wenn Threads auf andere NUMA-Nodes migrieren. Wenn der 6.14er falsche balanced, dann führt das zu hoher CPU-Auslastung, vielen L3-Misses, Latenzproblemen, Einbrüche beim Web-Traffic und instabiler Performance. IIS nutzt zudem den "NUMA Node Affinity"-Mechanismus (siehe MS-Link
HIER), was normalerweise dafür sorgt, dass jeder Worker-Prozess an einen NUMA-Node gebunden wird und die Verarbeitung der Requests lokal bleibt. Innerhalb der VM funktioniert das nur dann korrekt, wenn der Hypervisor die NUMA-Topo sauber "präsentiert", was wiederum beim 6.14er genau das Gegenteil ist. Dann "denkt" der IIS: "Ich habe 2 NUMA-Nodes!", aber die Zugriffe sind nicht lokal.
Ob NUMA wirklich sauber präsentiert wird, kannst Du mit
Code:
Get-WmiObject Win32_NumaNode
abfragen. Der korrekte Output müsste so aussehen:
Code:
NodeID MemoryBlockSize AvailableMemory
------ ---------------- ---------------
0 0 XXXXXXXX
1 0 XXXXXXXX
Bei Dir aber wahrscheinlich so:
Code:
NodeID MemoryBlockSize AvailableMemory
------ ---------------- ---------------
0 0 XXXXXXXX
1 0 0
Oder aber auch mehr Nodes, als die VM eigentlich haben dürfte.
Wenn bspw. dieser Befel
Code:
wmic cpu get NumberOfCores, NumberOfLogicalProcessors, DeviceID, NodeNumber
sowas ausgibt:
Code:
DeviceID NodeNumber NumberOfCores NumberOfLogicalProcessors
-------- ---------- ------------- --------------------------
CPU0 0 12 12
CPU1 0 12 12
CPU2 1 0 0
CPU3 1 0 0
ist es offensichtlich. Dann hat NODE1 gar keine CPUs, aber Windows "denkt", sie seien vorhanden.
Ohne WMIC kannst Du das auch mit PS prüfen:
Code:
Write-Host "=== NUMA Topology Diagnosis ===" -ForegroundColor Cyan
# CPU-Infos abrufen
$cpus = Get-WmiObject Win32_Processor | Select-Object DeviceID, NumberOfCores, NumberOfLogicalProcessors, NodeNumber
$numaNodes = Get-WmiObject Win32_NumaNode | Select-Object NodeID, AvailableMemory
Write-Host "`nDetected NUMA Nodes:`n"
$numaNodes | Format-Table
Write-Host "`nDetected CPUs:`n"
$cpus | Format-Table
$errors = @()
# 1. Prüfen: Gibt es mehr als 2 NUMA Nodes?
if ($numaNodes.Count -gt 2) {
$errors += "Mehr als 2 NUMA-Nodes gefunden – VM-Topologie inkonsistent."
}
# 2. Prüfen: Haben alle Nodes Speicher?
foreach ($node in $numaNodes) {
if ($node.AvailableMemory -eq 0) {
$errors += "NUMA Node $($node.NodeID) hat 0 Bytes RAM – fehlerhafte Topologie."
}
}
# 3. Prüfen: Haben alle Nodes CPUs zugeordnet?
$nodesWithCpus = $cpus | Group-Object NodeNumber | ForEach-Object { $_.Name }
foreach ($node in $numaNodes) {
if (-not ($nodesWithCpus -contains $node.NodeID)) {
$errors += "NUMA Node $($node.NodeID) hat keine CPUs – inkonsistent."
}
}
# 4. Prüfen: Gibt es CPUs, die keinem NUMA-Node zugeordnet sind?
foreach ($cpu in $cpus) {
if ($cpu.NodeNumber -lt 0 -or $cpu.NodeNumber -ge $numaNodes.Count) {
$errors += "CPU $($cpu.DeviceID) hat ungültigen NodeNumber-Wert: $($cpu.NodeNumber)."
}
}
# Ergebnis ausgeben
Write-Host "`n=== Ergebnis ===" -ForegroundColor Cyan
if ($errors.Count -eq 0) {
Write-Host "NUMA-Topologie ist sauber und konsistent." -ForegroundColor Green
} else {
Write-Host "FEHLER GEFUNDEN:" -ForegroundColor Red
$errors | ForEach-Object { Write-Host "- $_" -ForegroundColor Red }
}
Write-Host "`nAnalyse abgeschlossen."
Workarounds für den 6.14 er wären jetzt:
- VM auf EINEN Socket setzen (dafür mit allen gewünschten vCores)
- Numa: 0 - deaktiviert NUMA in der VM
- Die CPU Affinity exakt deklarieren:
-
Code:
numa: 1
sockets: 2
cores: X
numa0: cpus=0-11,mem=0
numa1: cpus=12-23,mem=1