Grundsatzfrage: CPU Limit, Swap, min. Speicher

martin17

New Member
Feb 17, 2023
8
1
3
Hallo zusammen,

auf der Suche nach der optimalen Ressourcenverteilung von CPU und Speicher bin ich auf die 3 o.g. Parameter gestoßen.

Folgende Fragen:
Ist es sinnvoll, eine wenig ausgelastete Maschine in CPU-Limit zu beschneiden, um so mehr Ressourcen für andere Maschinen frei zu halten? Oder trägt die Einstellung dazu bei, dass bei der Ressourcenverteilung "mehr gerechnet" werden muss?

Swap - in welchen Fällen ist es sinnvoll Swap zu deaktivieren. Auch wieder bei gering ausgelasteten Containern - bringt es etwas, Maschinen aus dem Swap auszuschließen?

min. Speicher - wird durch heruntersetzen dieses Speichers/dieser Einstellung der Grundanteil des RAMs weniger genutzt. Aber im Bedarfsfall kann sich die Maschine den Anteil bis zur Einstellung Speicher gönnen. z.B. ordne ich einer Windows Maschine 16GB Speicher zu mit der Einstellung min. Speicher 8GB. Sind für diesen Fall mehr RAM Ressourcen für weitere Maschinen vorhanden, wenn die Windows Maschine nur eine geringe RAM-Auslastung hat?

Ich danke für eure Hilfe.
Martin
 
Ist es sinnvoll, eine wenig ausgelastete Maschine in CPU-Limit zu beschneiden, um so mehr Ressourcen für andere Maschinen frei zu halten? Oder trägt die Einstellung dazu bei, dass bei der Ressourcenverteilung "mehr gerechnet" werden muss?
Kann man machen und nein, die Ressourcenverteilung an sich verbrutzelt keine Leistung in dem Sinne. Denke aber dran, dass du immer ein paar Cores mehr für den Host übrig (hast du z.B. 8 Kerne, dann nicht mehr als 6 insgesamt für VMs zuweisen) lassen solltest, denn der Host braucht immer Luft zum Atmen. Also 6 VMs * 1 Core, 3 VMs * 2 Cores oder 2 VMs * 3 Cores wäre im grünen Bereich. Alles 'überkonfigurierte', quasi zugewiesene Cores die physisch dann nicht da sind, erzwingen einen Kampf um die Ressourcen. Das geht klar, wenn die Maschinen idlen, aber treibt den delay nach oben wenn auch nur eine Maschine auf Vollgas läuft.

Swap - in welchen Fällen ist es sinnvoll Swap zu deaktivieren.
Aus langjähriger Erfahrung: gar nicht. Swap ist immer als Rettungsanker zu sehen, nicht als Ressource mit der man kalkuliert. Also ganz deaktivieren würde ich das nicht.
Wenn du willst, dass weniger im swap landet, dann würde ich swappiness=0 setzen.

min. Speicher - wird durch heruntersetzen dieses Speichers/dieser Einstellung der Grundanteil des RAMs weniger genutzt. Aber im Bedarfsfall kann sich die Maschine den Anteil bis zur Einstellung Speicher gönnen. z.B. ordne ich einer Windows Maschine 16GB Speicher zu mit der Einstellung min. Speicher 8GB. Sind für diesen Fall mehr RAM Ressourcen für weitere Maschinen vorhanden, wenn die Windows Maschine nur eine geringe RAM-Auslastung hat?
Du setzt z.B. für eine VM min. 8192 und max 16384 + den Haken bei ballooning device. Damit das dann auch funktioniert muss der guest agent in der VM laufen und der ballooning Treiber z.B. für Windows. Dann wird dynamisch die Differenz von min bis max freigegeben, je nach Auslastung des hosts und ja, wenn da was frei ist, kommt das dann auch anderen VMs zugute, wenn die das brauchen.
 
  • Like
Reactions: martin17
Du setzt z.B. für eine VM min. 8192 und max 16384 + den Haken bei ballooning device. Damit das dann auch funktioniert muss der guest agent in der VM laufen und der ballooning Treiber z.B. für Windows. Dann wird dynamisch die Differenz von min bis max freigegeben, je nach Auslastung des hosts und ja, wenn da was frei ist, kommt das dann auch anderen VMs zugute, wenn die das brauchen.
Aber nicht vergessen, dass sich Ballooning nicht darum schert, ob die VM den RAM braucht oder nicht. Hast du 8GB Min und 16GB max RAM gesetzt und brauchen deine Services z.B. 12GB, dann wird dir Windows 4GB an Services killen müssen, damit es noch mit den 8GB RAM auskommt, nachdem Ballooning 8GB RAM entfernt hat. Min RAM sollte also über dem liegen, was deine VM abzüglich Cache maximal verwendet.
Und nutzt die VM PCI Passthrough, dann klappt kein Ballooning.
 
  • Like
Reactions: martin17
Erst einmal vielen Dank für die umfangreiche Beantwortung.

Denke aber dran, dass du immer ein paar Cores mehr für den Host übrig (hast du z.B. 8 Kerne, dann nicht mehr als 6 insgesamt für VMs zuweisen) lassen solltest, denn der Host braucht immer Luft zum Atmen. Also 6 VMs * 1 Core, 3 VMs * 2 Cores oder 2 VMs * 3 Cores wäre im grünen Bereich
Ist an dieser Stelle nur die VM gemeint oder setzt Du VM mit CT gleich? Die CT hängen ja quasi mehr am Host. Ich verstehe sie sogar fast als ein Teil des Hosts. Um bei dem Beispiel mit 8 Kernen zu bleiben, denn das trifft genau auf meine Konstellation zu.
VMs: 1 * 1 Core + 1 * 2 Core
CT: 4 * 1 Core
Wäre ohne die Differenzierung zwischen CT und VM schon hart am Limit? Mit diesen "Maschinen" decke ich meine Netzwerkbedürfnisse ab. Da die CPU und RAM Auslastung dennoch niedrig sind, wollte ich ein paar Maschinen zum lernen aufsetzen. Klar, die Ziehen Ressourcen, aber das wäre bei mir zweitrangig.

Das geht klar, wenn die Maschinen idlen, aber treibt den delay nach oben wenn auch nur eine Maschine auf Vollgas läuft.
Wie bekommt man es dann hin, dass die "langsamen Maschinen" die trotz ihrer bringen Anforderungen diese immer bekommen, auch wenn eine Maschine gerade Vollgas gibt?

Wenn du willst, dass weniger im swap landet, dann würde ich swappiness=0 setzen.
An welcher Stelle wird das gesetzt? Und wenn ich den Hinweis von @Dunuin lese, dann würde ich die Option so verstehen, dass der Host der Machine eher nicht gestattet mehr RAM zu nehmen.

brauchen deine Services z.B. 12GB, dann wird dir Windows 4GB an Services killen müssen, damit es noch mit den 8GB RAM auskommt, nachdem Ballooning 8GB RAM entfernt hat.
Unter Ballooning verstehe ich den Effekt, dass der Maschine zwischen min. RAM und max. RAM dieser dynamisch zugewiesen wird. Und so wie ich jetzt deine Antwort lese, Das Kriterium der Zuweisung nicht von der Maschine selbst bestimmt wird, sondern vom Host?
 
Last edited:
Ist an dieser Stelle nur die VM gemeint oder setzt Du VM mit CT gleich?
Das ist gleichzusetzen, quasi alles was auf einem Host läuft, erzeugt Last. Egal ob das proxmox (es ist ein Päckchen aus zusammengeschnürten Diensten) an sich ist, ein weiterer Dienst auf dem Host oder eine VM, CT oder Dienste in einem der beiden ist. Der Trick ist, die vorhanden Ressourcen so zu verteilen und zu delegieren, dass du das so gut wie möglich für deinen zu erwartenden Einsatzzweck verteilst, aber die Grundregel ist dennoch dem Host immer was übrig zu lassen. Mit dicken CPUs und vielen Kernen ist das einfacher, meist rennt man aber eher durch den RAM ins Limit.
Wenn du 8 Kerne hast, dann behalte ich das für die Beispiele bei:
Hast du eine VM und dieser alle 8 Kerne zugewiesen, dann läuft das ok solange die Maschine idlet oder die Dienste darin nicht anspruchsvoll sind. Sobald darin aber ein Dienst alle Kerne in Beschlag nimmt, kämpfen VM und Host um die Ressourcen. Das bremst sich dann unnötig gegeneinander aus, da der Host die VM ausführen will, die VM dem Host aber die Butter vom Brot zieht. Quasi 8 Rentner am Rockzipfel eines Erwerbstätigen. ;)
Ideal wäre, wenn eine VM ausreicht, 1x4 Kerne zugewiesen. -> Die VM kann Vollgas abrufen, nimmt die 4 Kerne in Beschlag aber dem Host bleiben immer 4 Kerne frei.

Hast du jetzt zwei VMs und beiden jeweils 1*8 Kerne zugewiesen (das geht!), dann geht das auch klar, solange alle idle sind. Ruft jetzt eine VM Vollgas ab, dann gehen alle VMs inkl. host in die Knie ...alles bremst sich gegeneinander aus.
Man kann jetzt jeder VM 4 Kerne zuweisen und dann safe Vollgas abwechselnd in den VMs abrufen. Laufen aber beide VMs gleichzeitig Vollgas, hat der Host wieder nichts für sich und der Kampf geht los.
Ideal hier wäre dann für zwei VMs: jeweils 1x2 Kerne. Eklig wird es dann, wenn man mehr als zwei VMs fahren will oder die Leistung bei 2 Kernen in der VM einfach nicht ausreicht. Dann kann man 6 Kerne aufteilen, damit dem Host 2 bleiben, aber drunter würde ich nicht gehen. Im Zweifel oder am Limit eher Abstriche bei der VM machen als beim Host, denn wenn der nicht atmen kann, 'strafst' du alle VMs ab.
Ob du das jetzt aufteilst nach Kernen, Threads oder prozentual, das gibt sich nichts und wenn, dann nur marginal und allenfalls mit Benchmarks feststellbar.
Mit der Verteilung vom RAM wäre ähnlich zu verfahren (primär mal 50% für den Host lassen und nicht 'verplanen') und dann gucken wie sich das so entwickelt. Gerade nach ein paar Tagen uptime sieht man dann schon mehr und meist wird man dann auf den Boden der Tatsachen geschleudert. Z.B. dass 64GB RAM doch nicht so gigantisch sind, wie gedacht. :p

VMs: 1 * 1 Core + 1 * 2 Core
CT: 4 * 1 Core
Wäre ohne die Differenzierung zwischen CT und VM schon hart am Limit? Mit diesen "Maschinen" decke ich meine Netzwerkbedürfnisse ab. Da die CPU und RAM Auslastung dennoch niedrig sind, wollte ich ein paar Maschinen zum lernen aufsetzen. Klar, die Ziehen Ressourcen, aber das wäre bei mir zweitrangig.
Wie gesagt, solange alles idle ist und bleibt, passt das. Wichtig ist, dass du keiner VM die 'Macht' gegeben hast, dass sie alle Kerne auf einmal abrufen könnte.
Wie bekommt man es dann hin, dass die "langsamen Maschinen" die trotz ihrer bringen Anforderungen diese immer bekommen, auch wenn eine Maschine gerade Vollgas gibt?
Die Zuweisung der Kerne bilden das Limit je VM, an den freien bedienen sich dann die anderen.

An welcher Stelle wird das gesetzt? Und wenn ich den Hinweis von @Dunuin lese, dann würde ich die Option so verstehen, dass der Host der Machine eher nicht gestattet mehr RAM zu nehmen.
vm.swappiness=0 in /etc/sysctl.conf auf dem Host + reboot.
Das setzt aber eine vorhandene swap-Partition voraus und ich bin mir jetzt gerade aber nicht sicher ob deine Frage auf swap auf dem Host oder in einer VM abzielte.
Unter Ballooning verstehe ich den Effekt, dass der Maschine zwischen min. RAM und max. RAM dieser dynamisch zugewiesen wird.
So ist es. Das geht aber nur, wenn der Host den RAM auch in 'frei' vorliegen hat. Nicht vorhandes kann auch nicht zugewiesen werden. ;)
Und so wie ich jetzt deine Antwort lese, Das Kriterium der Zuweisung nicht von der Maschine selbst bestimmt wird, sondern vom Host?
Der Host bestimmt wo es langgeht und ist der Boss, nicht die VM. Das klingt jetzt verwirrend, weil ich oben schrieb, dass die VM Leistung zieht (nicht selbstbestimmt, obwohl es so klingt), aber das eigentliche scheduling läuft dennoch auf dem Host ab. Eine VM ist technisch auch nur ein Dienst, den der Host ausführt.

Hast du 8GB Min und 16GB max RAM gesetzt und brauchen deine Services z.B. 12GB, dann wird dir Windows 4GB an Services killen müssen, damit es noch mit den 8GB RAM auskommt, nachdem Ballooning 8GB RAM entfernt hat.
Richtig, das muss man noch erwähnen! Daher lieber generöser den RAM verteilen als Kerne oder anders: lieber ein paar Sekunden Wartezeit in Kauf nehmen, als abgeschossene Dienste.

Und nutzt die VM PCI Passthrough, dann klappt kein Ballooning.
Ich hatte das zwar aufgeschnappt, aber war der Meinung, dass das nur für GPU passthrough + den VRAM galt? Ich nutze das nämlich mit einem HBA und die VM rennt mit ballooning...
 
Last edited:
  • Like
Reactions: martin17
Ich hatte das zwar aufgeschnappt, aber war der Meinung, dass das nur für GPU passthrough + den VRAM galt? Ich nutze das nämlich mit einem HBA und die VM rennt mit ballooning...
Soweit ich weiß immer wenn man PCI Passthrough nutzt. Geht ja nicht um den VRAM, sondern darum, dass da jedes PCI Gerät Direct Memory Access (DMA) nutzen kann, was heißt, dass da das PCI Gerät jederzeit auf den kompletten RAM-Bereich zugreifen können muss, ohne sich vorher an die CPU zu wenden. Dann kann man Ballooning zwar aktiv haben, der Host sollte aber der VM permament den vollen RAM zuteilen. Deshalb starten VMs mit PCI Passthrough dann auch so langsam, da dort erst der volle RAM zugeteilt werden muss.

Du kannst dir ja mal mit top/htop am PVE Host den KVM Prozess deiner VM mit PCI Passthrough angucken. "RES", also der unausgelagerte RAM, sollte dann eigentlich immer mindestens so groß sein wie der RAM deiner VM.

Unter Ballooning verstehe ich den Effekt, dass der Maschine zwischen min. RAM und max. RAM dieser dynamisch zugewiesen wird. Und so wie ich jetzt deine Antwort lese, Das Kriterium der Zuweisung nicht von der Maschine selbst bestimmt wird, sondern vom Host?
Ist eigentlich ganz einfach. Ballooning startet sobald der Host über 80% RAM nutzt. Dann klaut der Host den VMs soviel RAM bis...:
1.) der RAM des Hosts wieder unter 80% fällt oder
2.) alle VMs der RAM bis zum Limit von "Min RAM" geklaut wurden.

Ist also vollkommen egal ob der Gast den RAM braucht oder nicht. D gibt es keinerlei Kommunikation. Der Host klaut dem Gast einfach langsam den RAM von Max RAM bis runter zu Min RAM und der Gast muss dann sehen wie er damit klar kommt. Erst wird er Caches droppen und hat er nichts mehr zum Droppen wird er anfangen Dienste zu killen.

RAM-Overprovisioning sollte man also vermeiden.
 
Last edited:
  • Like
Reactions: mr44er
Du kannst dir ja mal mit top/htop am PVE Host den KVM Prozess deiner VM mit PCI Passthrough angucken. "RES", also der unausgelagerte RAM, sollte dann eigentlich immer mindestens so groß sein wie der RAM deiner VM.
1896816 root 20 0 26.5g 16.1g 18476 S 5.0 12.8 344:00.44
Jup, das passt.
 
Wie gesagt, solange alles idle ist und bleibt, passt das. Wichtig ist, dass du keiner VM die 'Macht' gegeben hast, dass sie alle Kerne auf einmal abrufen könnte.

Werden die Kerne statisch oder dynamisch zugewiesen? Wenn eine Maschine 4 Kerne hat und diese voll ausnutzt. Werden dann meine Container, die jeweils nur einen Kern haben von den 4 übrigen dynamisch genutzt oder kann es sein, dass genau der Kern, der dem Container zugewiesen ist gerade voll von der 4-Kern VM gebremst wird?

...auf dem Host + reboot.
Das setzt aber eine vorhandene swap-Partition voraus und ich bin mir jetzt gerade aber nicht sicher ob deine Frage auf swap auf dem Host oder in einer VM abzielte.

Ist die von dir erwähnte Swap-Partition das, was im Knoten unter Übersicht - bei mir aktuell mit "SWAP-Auslastung 0.19% (15.25 MiB von 8.00 GiB)" angezeigt wird. Oder muss man diese Swap-Partition separat erstellen.

Und, woher weiß ich, wer den genannten SWAP mit 12MBye nutzt. Ich hätte gedacht, dass diese Speicher nur genutzt wird, wenn auf irgendeiner VM der RAM knapp wird. Es sehen aber alle gut aus.

Ich hatte das zwar aufgeschnappt, aber war der Meinung, dass das nur für GPU passthrough + den VRAM galt? Ich nutze das nämlich mit einem HBA und die VM rennt mit ballooning...

An dieses Thema hatte ich gar nicht gedacht. Wie verhält es sich mit dem RAM, der für die GPU genutzt wird? Wird dieser automatisch in die RAM Anzeige integriert oder muss ich dafür auch etwas zusätzlich vorsehen?

Ist eigentlich ganz einfach. Ballooning startet sobald der Host über 80% RAM nutzt. Dann klaut der Host den VMs soviel RAM bis...:
1.) der RAM des Hosts wieder unter 80% fällt oder
2.) alle VMs der RAM bis zum Limit von "Min RAM" geklaut wurden.
D.h. erst einmal versucht die VM mit RAM min klar zu kommen, wenn von der VM dann mehr Speicher genutzt wird, wird auch mehr zugewiesen. In meinem Fall habe ich eine Windows VM, mit der ich nur ab und zu mal etwas nachsehen muss. Hier habe ich 4GB min und 8GB max zugewiesen - für den Fall, dass ich dort mein Aminen größere Anwendung nutzen muss. Bemerkenswert finde ich, dass im der Systemsteuerung immer 8GB RAM angezeigt werden. Im Idle im Moment RAM Nutzung 25.78% (2.06 GiB von 8.00 GiB). das müsste doch dann passen...
Den zweiten Punkt verstehe ich so: wenn andere Maschinen viel Speicher brauchen, wird ggf. von der Windows Maschine RAM geklaut. Nämlich ggf. bis zum Minimum 4GB.

Sehr spannende Themen. Cool.
 
D.h. hier sieht man die 5 laufenden Container, denen auch jeweils 1GB RAM zugewiesen sind nicht. Oder fließen die in die 5. Zeile mit ein?
 
Wenn du keine weiteren Argumente angibst wird top nach CPU% sortiert. LXCs sind nicht virtualisiert, haben also auch keinen KVM-Prozess wegen simulierter Hardware. Wenn du da z.B. einen apache2 in einem LXC laufen hast, dann wird der apache2 prozess ganz normal im Host bei top aufgeführt. Da kannst du also nicht sehen wieviel RAM der ganze LXC verbraucht, sondern nur was die einzelnen Prozesse die im LXC laufen benutzen.
Musst du in top mal runter scrollen. Prozesse von unprivilegierten LXCs sollten dort leicht zu identifizieren sein, weil der User eine UID von 100000 oder höher hat.
 
Last edited:
  • Like
Reactions: martin17
Werden die Kerne statisch oder dynamisch zugewiesen?
Dynamisch. In der Übersicht sieht man auch den Kernel angezeigt: Kernel Version Linux 6.1.2-1-pve #1 SMP PREEMPT_DYNAMIC PVE 6.1.2-1 (2023-01-10T00:00Z)
Das SMP steht für symmetric multiprocessing und der wikilink erklärt das besser, als ich das könnte ;)
https://de.wikipedia.org/wiki/Symmetrisches_Multiprozessorsystem
Die Last wird also immer möglichst gleich verteilt, sodass sich da kein Kern langweilt. :)

Ist die von dir erwähnte Swap-Partition das, was im Knoten unter Übersicht - bei mir aktuell mit "SWAP-Auslastung 0.19% (15.25 MiB von 8.00 GiB)" angezeigt wird.
Ja, die meinte ich. Das ist der swap auf dem Host.

Und, woher weiß ich, wer den genannten SWAP mit 12MBye nutzt.
Das bezieht sich nur auf den Host. Wenn man trotz bereits vollem RAM noch eine weitere VM startet, wird der Host das dahin ausswappen müssen, eine VM selbst darf das nicht.
Was sie aber hingegen darf: Ihren eigenen swap nutzen, sofern man einen eingerichtet hat. (Um die Verwirrung mal zu komplettieren :) )

Wie verhält es sich mit dem RAM, der für die GPU genutzt wird? Wird dieser automatisch in die RAM Anzeige integriert oder muss ich dafür auch etwas zusätzlich vorsehen?
Bei onboard-GPUs und deren dedicated RAM ist der im Vorfeld schon 'weg' und proxmox bzw. jedes andere OS hat den gar nicht zur Verfügung. Dh. hast du 16384 MB RAM und 512 MB diese GPU, dann hat das OS nur 15872 MB. So kommen obendrein die teilweise krummen Werte zusammen, wo man sich manchmal am Kopf kratzt. Mal rundet eine GUI kaufmännisch auf oder es wird nicht ersichtlich, ob jetzt MB oder MiB (https://hoegerl.com/mebibyte-oder-megabyte-was-ist-der-unterschied/) gezeigt werden.
Bei GPU-Karten fließt deren RAM nicht mit in die Anzeige, da muss man auch weiter nichts beachten, bis auf das was Dunuin sagte.

Den zweiten Punkt verstehe ich so: wenn andere Maschinen viel Speicher brauchen, wird ggf. von der Windows Maschine RAM geklaut.
Es muss nicht die win-vm treffen, der Host klaut da wo er Lust hat ohne Rücksicht auf die VM, aber eben nur 'bis zu' was du gesetzt hast.
 
  • Like
Reactions: martin17

About

The Proxmox community has been around for many years and offers help and support for Proxmox VE, Proxmox Backup Server, and Proxmox Mail Gateway.
We think our community is one of the best thanks to people like you!

Get your subscription!

The Proxmox team works very hard to make sure you are running the best software and getting stable updates and security enhancements, as well as quick enterprise support. Tens of thousands of happy customers have a Proxmox subscription. Get yours easily in our online shop.

Buy now!