Hallo Forum.
Die NUMA-Konfigurierbarkeit für KVM-Gäste ist entweder schlecht oder ich bin zu blöd. Wie dem auch sei, wir finden sicher zusammen heraus, was davon zutrifft.
Ich bin noch auf 8.4.14, glaube aber, dass sich in dem Bereich nicht viel getan hat.
Wir haben 5 Server mit jeweils 2xEPYC 9375F, also 2 NUMA-Nodes pro Server, wenn wir die einzelnen CCDs ignorieren.
Relevante Konfigurationsparameter sind:
Wenn ich nun aber eine VM habe, die zwei NUMA-Nodes braucht, weil die Anwendung mehr Ressourcen benötigt als eine NUMA-Node (also eine CPU und/oder der RAM der an ihr angebunden ist) zur Verfügung stellen kann habe ich ein Problem.
Vielleicht eine kurze Zwischenfrage: Übersehe ich hier etwas oder kann man das tatsächlich nicht besser konfigurieren?
Follow-Up: Ich möchte VMs gerne lastabhängig ähnlich zu drs bei VMware (nur natürlich viel primitiver) verschieben. Dazu habe ich ein Script geschrieben, welches aus CPU%, Netzwerk und Disk I/O einen Score bildet und dann Server+NUMA-Nodes versucht "gleich" (sodass der kumulierte Score nachher möglichst gleich über alle NUMA-Nodes des Clusters ist) aufzufüllen und zwar mit so wenig wie möglich verschiebe Operationen.
Dabei gibt es folgende Herausforderungen:
PS: Ja, ich brauche wirklich eine so große VM und ja die Software in dieser ist NUMA aware.
PPS:
Die NUMA-Konfigurierbarkeit für KVM-Gäste ist entweder schlecht oder ich bin zu blöd. Wie dem auch sei, wir finden sicher zusammen heraus, was davon zutrifft.
Wir haben 5 Server mit jeweils 2xEPYC 9375F, also 2 NUMA-Nodes pro Server, wenn wir die einzelnen CCDs ignorieren.
Relevante Konfigurationsparameter sind:
affinity, numa und numa0. Wenn ich also eine VM habe, die in eine NUMA-Node (RAM sowie weniger als NUMA-Node CPU Kerne -2 oder so) passt ist das an für sich kein Problem. Ich setze affinity auf die Cores der ersten NUMA-Node, setze numa auf 1 und in numa0 hostnodes auf 0, memory auf den RAM der VM und policy auf bind und Zack läuft die VM (je nach Last) c.A. 35% schneller im Vergleich dazu, wenn ich das nicht tun würde.Wenn ich nun aber eine VM habe, die zwei NUMA-Nodes braucht, weil die Anwendung mehr Ressourcen benötigt als eine NUMA-Node (also eine CPU und/oder der RAM der an ihr angebunden ist) zur Verfügung stellen kann habe ich ein Problem.
affinity setzt nämlich die Zugehörigkeit für alle Threads des KVM-Prozesses, was bedeutet, dass ich dem Linux-Scheduling gnadenlos ausgeliefert bin und ich im Prinzip wieder die oben gewonnen ~35% Performance verliere, da die vCPU Threads von KVM auf beiden Host-CPUs umherscheduled werden.Vielleicht eine kurze Zwischenfrage: Übersehe ich hier etwas oder kann man das tatsächlich nicht besser konfigurieren?
Follow-Up: Ich möchte VMs gerne lastabhängig ähnlich zu drs bei VMware (nur natürlich viel primitiver) verschieben. Dazu habe ich ein Script geschrieben, welches aus CPU%, Netzwerk und Disk I/O einen Score bildet und dann Server+NUMA-Nodes versucht "gleich" (sodass der kumulierte Score nachher möglichst gleich über alle NUMA-Nodes des Clusters ist) aufzufüllen und zwar mit so wenig wie möglich verschiebe Operationen.
Dabei gibt es folgende Herausforderungen:
- Ich kann über einen API-Key, der alles darf keine
affinitysetzen. Ich muss dazu einen root-Login machen und kann mit dem Ticket diese Einstellung ändern. (An für sich kein Problem, nur eine Umständlichkeit.) - Wenn ich die Konfiguration ändere gehen die Einstellungen in
[PENDING]. Das ist in dem Fall schlecht, denn ich möchte diese Einstellung wenn es auch nicht gleich geht spätestens nach einer Migration übernommen wissen. Also dachte ich, dass ich mich mit dem Script per SSH einlogge und die Datei direkt auf der Disk ändere und dann die Migration anstoße. Das funktioniert auch gut, solange vorhernumaschon auf1war und anschließend migriert wird.
- Gibt es ohne hookscript eine Möglichkeit die physischen logischen CPUs vCPUs zuzuordnen, sodass ich Konfigurationen bei denen eine VM mindestens 2 NUMA-Nodes abdecken muss effizient konfiguriert werden können?
- Über sehe ich etwas? Kann ich über die API eine Konfiguration auch ohne
[PENDING]übernehmen - zur Not reicht es diese in die Config-Datei zu schreiben? - Gibt es eine Roadmap auf der evtl. bessere NUMA-Konfigurierbarkeit oder zumindest das Live-Setzen der affinity und bisherigen NUMA-Konfiguration steht?
- Gibt es schon Community-Lösungen für diese Aufgabe (drs), welche das auch gut bei großen VMs die mehrere NUMA-Nodes überdecken nachrüstet?
PS: Ja, ich brauche wirklich eine so große VM und ja die Software in dieser ist NUMA aware.
PPS:
numa_balancing ändert da nicht viel und ist keine Lösung.