nice, renice und ulimit: Prozessen Grenzen setzen
Kurz: Mit nice steuert man, wie wichtig ein Prozess dem Scheduler ist; mit ulimit begrenzt man Ressourcen wie offene Dateien oder Speicher.
Genauer: Auf einem Rechner laufen viele Prozesse um die Rechenzeit. Der Scheduler des Kernels verteilt sie nach Priorität. Mit nice lässt sich beeinflussen, wie freundlich sich ein Prozess verhält, und mit ulimit (Resource Limits) verhindert man, dass ein Programm zu viele Ressourcen verbraucht.
Im Detail
nice und renice
Der Nice-Wert reicht von −20 (höchste Priorität) bis +19 (niedrigste, „nett zu anderen“). Normal ist 0. Normale Benutzer dürfen den Wert nur erhöhen, also ihre Prozesse ausbremsen; nur root darf niedrigere Werte setzen.
nice -n 10 ./langer-job.sh # mit niedriger Priorität starten
renice -n 15 -p 1234 # laufenden Prozess ändern
ionice -c3 tar czf backup.tgz /daten # niedrige Festplatten-Priorität
So läuft ein Backup im Hintergrund, ohne den Rechner zu verlangsamen. Die Spalte NI in top und htop zeigt den Wert.
ulimit: Ressourcenlimits
ulimit -a # alle aktuellen Limits
ulimit -n # max. offene Dateien (Standard oft 1024)
ulimit -n 65535 # für diese Shell erhöhen
ulimit -v 2000000 # max. virtueller Speicher in KiB
ulimit -u 500 # max. Prozesse
Soft-Limits gelten aktuell und dürfen bis zum Hard-Limit angehoben werden. Dauerhaft setzt man sie in /etc/security/limits.conf bzw. limits.d/, für Dienste über LimitNOFILE= in der systemd-Unit. Server mit vielen Verbindungen (Webserver, Datenbanken) brauchen ein hohes Dateilimit, sonst erscheint „Too many open files“.
cgroups: moderne Begrenzung
Für feinere und gruppenweise Grenzen (CPU-Anteil, Speicherobergrenze, I/O) nutzt man cgroups, bequem über systemd: systemd-run --scope -p MemoryMax=500M -p CPUQuota=50% befehl. Container-Laufzeiten verwenden dieselbe Technik.
Hinweise
Der Nice-Wert ändert nur das Gewicht beim Scheduler, er gibt keine Garantie. Echtzeit-Prozesse (SCHED_FIFO, chrt) haben eigene Prioritäten. Ein zu niedriges Speicherlimit lässt Programme abstürzen statt langsamer zu werden; der OOM-Killer greift bei Speichermangel des Gesamtsystems ein.
Siehe auch: Prozesse und Signale, Prozess-Scheduling, Namespaces und cgroups, Speicherverwaltung und OOM-Killer