Die Verwaltung von Unix-Servern kann eine Herausforderung sein, besonders wenn die von Ihnen verwalteten Systeme stark ausgelastet sind und Leistungsprobleme die Verfügbarkeit einschränken. Glücklicherweise können Sie bestimmte Ressourcen begrenzen, um sicherzustellen, dass die wichtigsten Prozesse auf Ihren Servern weiterlaufen können und konkurrierende Prozesse nicht weit mehr Ressourcen verbrauchen, als für das Gesamtsystem gut ist. Der ulimit-Befehl kann eine Katastrophe verhindern, aber Sie müssen vorhersehen, wo Limits sinnvoll sind und wo sie Probleme verursachen.
Es passiert vielleicht nicht so oft, aber ein einzelner Benutzer, der zu viele Prozesse startet, kann ein System für alle anderen unbrauchbar machen. Eine Fork-Bombe – ein Denial-of-Service-Angriff, bei dem sich ein Prozess ständig repliziert, bis die verfügbaren Ressourcen erschöpft sind – ist der schlimmste Fall davon. Aber auch freundliche Benutzer können mehr Ressourcen verbrauchen, als für ein System gut ist – oft ohne es zu beabsichtigen. Gleichzeitig können legitime Prozesse manchmal scheitern, wenn sie an Grenzen stoßen, die für durchschnittliche Benutzer ausgelegt sind. In diesem Fall müssen Sie dafür sorgen, dass diesen Prozessen mehr Systemressourcen zugewiesen werden, damit sie ordnungsgemäß ausgeführt werden können, ohne dass die gleichen Ressourcen für alle verfügbar sind.
Um die mit Ihrer Anmeldung verbundenen Grenzen zu sehen, verwenden Sie den Befehl ulimit -a. Wenn Sie ein normales Benutzerkonto verwenden, werden Sie wahrscheinlich so etwas sehen:
$ ulimit -acore file size (blocks, -c) 0data seg size (kbytes, -d) unlimitedscheduling priority (-e) 0file size (blocks, -f) unlimitedpending signals (-i) 32767max locked memory (kbytes, -l) 32max memory size (kbytes, -m) unlimitedopen files (-n) 1024pipe size (512 bytes, -p) 8POSIX message queues (bytes, -q) 819200real-time priority (-r) 0stack size (kbytes, -s) 10240cpu time (seconds, -t) unlimitedmax user processes (-u) 50virtual memory (kbytes, -v) unlimitedfile locks (-x) unlimited
Eine Sache, die Ihnen vielleicht sofort auffällt, ist, dass Sie keine Core-Dumps erstellen können – weil Ihre maximale Core-Dateigröße 0 ist. Ja, das bedeutet nichts, keine Daten, kein Core-Dump. Wenn ein Prozess, den Sie ausführen, abbricht, wird keine Core-Datei in Ihrem Home-Verzeichnis abgelegt. Solange die Core-Dateigröße auf Null gesetzt ist, sind Core-Dumps nicht erlaubt. Dies ist für die meisten Benutzer sinnvoll, da sie wahrscheinlich nichts weiter mit einem Core-Dump tun würden, als ihn zu löschen, aber wenn Sie einen Core-Dump benötigen, um Probleme mit einer Anwendung zu debuggen, möchten Sie vielleicht Ihre Core-Dateigröße auf unbegrenzt setzen – und vielleicht können Sie das.
$ ulimit -c ulimited$ ulimit -cunlimited
Wenn Sie einen Server verwalten und die Möglichkeit einschalten wollen, Core-Dumps für alle Ihre Benutzer zu erzeugen – vielleicht sind es Entwickler, die diese Core-Dumps wirklich analysieren müssen -, müssen Sie den Benutzer auf root umstellen und Ihre /etc/security/limits bearbeiten.conf (Linux) wechseln oder Änderungen in der Datei /etc/system (Solaris) vornehmen.
Wenn Sie andererseits einen Server verwalten und nicht möchten, dass einer Ihrer Benutzer Core-Dumps generiert, egal wie sehr er sich daran festbeißen möchte, können Sie in der Datei limits.conf ein Limit von 0 setzen.
Ein weiteres Limit, das oft durchgesetzt wird, ist ein Limit, das die Anzahl der Prozesse begrenzt, die eine Person ausführen kann. Die dafür verwendete Option ulimit lautet -u. Sie können sich Ihr Limit wie oben mit dem Befehl ulimit -a ansehen oder nur das „nproc“-Limit mit dem Befehl ulimit -u anzeigen lassen.
$ ulimit -u50
Auch hier können Ihre Benutzer ihre Limits mit einem anderen ulimit-Befehl ändern — ulimit -u 100 — es sei denn, sie können es nicht. Wenn Sie sie in der Datei limits.conf oder der Systemdatei auf 50 Prozesse beschränkt haben, erhalten sie eine Fehlermeldung wie diese, wenn sie versuchen, ihre Limits zu erhöhen:
$ ulimit -u 100-bash: ulimit: max user processes: cannot modify limit: Operation not permitted
Limits können auch nach Gruppen eingerichtet werden, so dass Sie beispielsweise Entwicklern die Möglichkeit geben können, mehr Prozesse laufen zu lassen als Manager. Zeilen wie diese in der Datei limits.conf würden dies ermöglichen:
@managers hard nproc 50@developers hard nproc 200
Wenn Sie die Anzahl der offenen Dateien begrenzen wollen, verwenden Sie einfach eine andere Einstellung:
@managers hard nofile 2048@developers hard nofile 8192sbob hard nofile 8192
Hier haben wir zwei Gruppen und einer Einzelperson höhere Limits für ihre offenen Dateien gegeben. Das sind alles harte Grenzwerte. Wenn Sie auch weiche Grenzen setzen, erhalten die Benutzer Warnungen, wenn sie die untere Grenze erreichen.
@developers soft nofile 2048@developers hard nofile 8192
Eine Liste der ulimit-Optionen finden Sie in der Manpage (man ulimit). Sie werden feststellen, dass ulimit in die Bash integriert ist – zumindest unter Linux – und dass die folgenden Optionen zur Verfügung stehen:
-a All current limits are reported-c The maximum size of core files created-d The maximum size of a process's data segment-e The maximum scheduling priority ("nice")-f The maximum size of files written by the shell and its children-i The maximum number of pending signals-l The maximum size that may be locked into memory-m The maximum resident set size (has no effect on Linux)-n The maximum number of open file descriptors (most systems do not allow this value to be set)-p The pipe size in 512-byte blocks (this may not be set)-q The maximum number of bytes in POSIX message queues-r The maximum real-time scheduling priority-s The maximum stack size-t The maximum amount of cpu time in seconds-u The maximum number of processes available to a single user-v The maximum amount of virtual memory available to the shell
Wenn die Datei limits.conf es zulässt, können Sie solche Limits für bestimmte Anwendungen einrichten, die die zusätzliche Kapazität wirklich benötigen. In diesem Beispiel wird dem Oracle-Benutzer die Möglichkeit gegeben, bis zu 16.384 Prozesse auszuführen und 65.536 Dateien zu öffnen. Diese Zeilen würden im .bash_profile des Orakel-Benutzers eingerichtet werden.
if ; then if ; then ulimit -p 16384 ulimit -n 65536 else ulimit -u 16384 -n 65536 fifi