cgroups
sind der richtige Weg, wie andere Antworten gezeigt haben. Leider gibt es keine perfekte Lösung für das Problem, wie wir weiter unten sehen werden. Es gibt eine Reihe von Möglichkeiten, die Speicherverwendungsbeschränkungen für Gruppen festzulegen. Wie man die Anmeldesitzung eines Benutzers automatisch zu einer cgroup macht, ist von System zu System unterschiedlich. Red Hat hat einige Tools und systemd auch .
memory.memsw.limit_in_bytes
und memory.limit_in_bytes
Grenzwerte einschließlich bzw. ohne Swap festlegen. Der Nachteil memory.limit_in_bytes
ist, dass Dateien, die vom Kernel im Auftrag von Prozessen in der cgroup zwischengespeichert werden, gegen das Kontingent der Gruppe gezählt werden. Weniger Caching bedeutet mehr Festplattenzugriff, sodass Sie möglicherweise Leistungseinbußen hinnehmen müssen, wenn auf dem System ansonsten Speicher verfügbar ist.
memory.soft_limit_in_bytes
Ermöglicht andererseits der cgroup, die Quote zu überschreiten. Wenn jedoch der Kernel-OOM-Killer aufgerufen wird, werden logischerweise zuerst die cgroups getötet, deren Quoten überschritten sind. Der Nachteil dabei ist jedoch, dass in bestimmten Situationen sofort Speicherplatz benötigt wird und der OOM-Killer nicht die Zeit hat, nach Prozessen zu suchen, die beendet werden müssen. In diesem Fall schlägt möglicherweise etwas fehl, bevor die Prozesse des überquotierten Benutzers ausgeführt werden getötet.
ulimit
ist aber absolut das falsche werkzeug dafür. ulimit schränkt die Nutzung des virtuellen Speichers ein, was mit ziemlicher Sicherheit nicht Ihren Vorstellungen entspricht. Viele reale Anwendungen verwenden wesentlich mehr virtuellen Speicher als physischen Speicher. Die meisten durch Speicherbereinigung gesammelten Laufzeiten (Java, Go) funktionieren auf diese Weise, um eine Fragmentierung zu vermeiden. Ein triviales "Hallo Welt" -Programm in C kann, wenn es mit Address Sanitizer kompiliert wird, 20 TB virtuellen Speicher verwenden. Allokatoren, auf die nicht angewiesen ist sbrk
, wie jemalloc (der Standardallokator für Rust) oder tcmalloc, wird auch die Nutzung des virtuellen Speichers erheblich über ihre physische Nutzung hinausgehen. Aus Gründen der Effizienz werden viele Tools Dateien mit MMAP-Dateien versehen, was die virtuelle Nutzung erhöht, jedoch nicht unbedingt die physische Nutzung. Alle meine Chrome-Prozesse verwenden jeweils 2 TB virtuellen Speicher. Ich habe einen Laptop mit 8 GB physischem Speicher. Jeder Versuch, hier virtuelle Speicherkontingente einzurichten, würde entweder Chrome beschädigen, Chrome dazu zwingen, einige Sicherheitsfunktionen zu deaktivieren, die auf der Zuweisung (aber nicht der Verwendung) großer Mengen an virtuellem Speicher beruhen, oder einen Benutzer davon abhalten, das System zu missbrauchen .