Ich habe also 4 GB RAM + 4 GB Swap. Ich möchte einen Benutzer mit eingeschränktem RAM und Swap erstellen: 3 GB RAM und 1 GB Swap. Ist so etwas möglich? Ist es möglich, Anwendungen mit begrenztem RAM zu starten und diese auszutauschen, ohne einen separaten Benutzer zu erstellen (und keine speziellen Anwendungen zu installieren - nur mit einer Standard-Debian / CentOS-Serverkonfiguration und ohne sudo)?
Aktualisieren:
Also öffnete ich terminall und tippte den Befehl ulimit ein : ulimit -v 1000000
das soll wie eine 976,6Mb
Einschränkung sein. Als nächstes rief ich an ulimit -a
und sah, dass die Einschränkung "an" ist. Dann habe ich ein Bash-Skript gestartet, das kompiliert und meine App startet nohup
, ein langes nohup ./cloud-updater-linux.sh >& /dev/null &
... aber nach einiger Zeit sah ich:
(Das wäre in Ordnung, wenn keine Einschränkungen angewendet würden - es hat eine große Bibliothek heruntergeladen und mit dem Kompilieren begonnen.)
Aber ich dachte, ich hätte Einschränkungen auf die Shell und alle Prozesse angewendet, die mit / von ihr gestartet wurden ulimit -v 1000000
? Was habe ich falsch gemacht? Wie kann ein Terminal und alle Subprozesse, die es startet, auf die RAM-Nutzung beschränkt werden?
quelle
Antworten:
ulimit
ist dafür gemacht. Sie können Standardeinstellungen für einzelneulimit
Benutzer oder Gruppen in festlegenulimit -v KBYTES
Legt die maximale Größe des virtuellen Speichers fest. Ich glaube nicht, dass Sie einen maximalen Betrag an Swap geben können. Es ist nur eine Begrenzung der Größe des virtuellen Speichers, den der Benutzer verwenden kann.Du hättest
limits.conf
also die Leitung (maximal4G
Speicher)UPDATE - CGroups
Die von
ulimit
und auferlegten Grenzen geltenlimits.conf
pro Prozess. In diesem Punkt war mir definitiv nicht klar.Wenn Sie die Gesamtspeichermenge begrenzen möchten, die ein Benutzer verwendet (was Sie gefragt haben). Sie möchten cgroups verwenden .
In
/etc/cgconfig.conf
:Dadurch wird ein
cgroup
Speicher mit einer maximalen Speicherkapazität von 4 GB erstellt.In
/etc/cgrules.conf
:Dadurch werden alle von ausgeführten Prozesse
luser
in den inmemlimit
erstellten Gruppen ausgeführtcgconfig.conf
.quelle
useradd
?Sie können die Speichernutzung nicht auf Benutzerebene begrenzen, ulimit kann dies jedoch für einen einzelnen Prozess tun.
Selbst bei Verwendung von
/etc/security/limits.conf
Benutzerbegrenzungen kann ein Benutzer den gesamten Speicher verwenden, indem er mehrere Prozesse ausführt.Wenn Sie Ressourcen wirklich begrenzen möchten, müssen Sie ein Ressourcenverwaltungstool wie rcapd verwenden, das von Projekten und Zonen unter Solaris verwendet wird.
Es gibt etwas, das unter Linux ähnliche Funktionen zu bieten scheint, die Sie untersuchen könnten: cgroups .
quelle
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
undmemory.limit_in_bytes
Grenzwerte einschließlich bzw. ohne Swap festlegen. Der Nachteilmemory.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 istsbrk
, 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 .quelle