Ressourcenverwendung kontrollieren

ulimit

Ulimit sollte in der Datei „/etc/profile“ konfiguriert werden. Die entsprechende Zeile sieht meistens ungefähr so aus:

ulimit -n 100 -u 20 -m 200000 -d 200000 -s 8192 -c 200000 -v 200000 2>/dev/null

Anzeigen der aktuellen Einstellungen auf einem Debian7 System (User root):

ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 63590
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 63590
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

Auf einem Fedora20-System sehen die Werte ähnlich aus. Zum Vergleich hier die Einstellungen eines normalen Benutzers (user) und des Administrators (root). Was sofort auffällt ist, dass der Benutzer root viel mehr Prozesse starten darf. Dies liegt natürlich auch daran, dass viele Systemprozesse als root gestartet werden.

[user@fedora20]$ ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 14931
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 1024
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

[root@fedora20]$# ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 14931
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 14931
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

Für die aktuelle Shell (nicht Systemweit) kann ein Wert temporär geändert werden. Da lsof bereits in der Auflistung (-a) die weiteren Optionen anzeigt, kann man auf die Hilfe verzeichten. Wenn die erlaubten, maximal gleichzeitig geöffneten Dateien geändert werden sollen, kann dies mit folgendem Befehl erledigt werden.

ulimit -n 3000

Wenn der Benutzer nun erneut „ulimit -a“ ausführt, wird er die Änderung unter „Open Files“ finden. Dieser Wert sollte nun nämlich auf 3000 gesetzt sein.

Natürlich hat nicht jeder Benutzer genügend Rechte um alle Werte zu modifizieren. Entsprechend wird dann eine Fehlermeldung ausgegeben.

Normale Benutzer können ihr Limit jeweils bis zum definierten Hard-Limit erhöhen.

ulimit -u 14931
bash: ulimit: max user processes: Kann die Grenze nicht ändern: Die Operation ist nicht erlaubt

ulimit Hard- und Soft-Limits

Aus ulimit kann mit Hard- und Soft-Limits umgehen. Die Hard-Limits können nur vom root gesetzt werden.

  • ulimit -aS (Soft-Limit)
  • ulimit -aH (Hard-Limit)

Diese Kommandos zeigen entsprechend die aktuellen Hard-Limits (-aH) oder entsprechend die Soft-Limits (-aS).

  • ulimit -c 30000 – die Maximalgrösse für core-files ist 30 MB.
  • ulimit -d 12000 – die maximale Datengrösse eines Programms ist 12 MB.
  • ulimit -Sd $(ulimit -Hd) limitiert die Grösse des Softlimits für die maximale
    Datengrösse eines Programms auf die Grösse des korrespondierenden Hard-
    limits.

Geöffnete Dateien überwachen mit lsof

Manchmal ist es nötig festzustellen, welche Dateien von welchem Benutzer gerade geöffnet sind. Dazu wird der Befehl „lsof“ verwendet. Um die Anzahl der offenen Dateien anzuzeigen, kann lsof mit dem Befehl „wc -l“ kombiniert werden.

lsof |wc -l

Kann ein Laufwerk nicht abgemeldet (umount) werden, kann mit lsof auch festgestellt werden, welche Dateien auf dem Datenträger noch geöffnet sind:

umount /media/005E-0549 
Unmount failed: Cannot unmount because file system on device is busy
lsof /media/005E-0549/
COMMAND    PID      USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
bash      2777 operating  cwd    DIR   8,97    16384    1 /media/005E-0549
ristretto 3168 operating  cwd    DIR   8,97    16384    1 /media/005E-0549

Zwei Prozesse greifen noch auf den Datenträger zu. Zum einen läuft eine Bash (die wäre unkritisch, was das Entfernen des Datenträgers angeht) und zum Andern ist „ristretto“ geöffnet, was hier der Bildbetrachter unter Ubuntu darstellt.
In der zweiten Spalte wird auch immer die betreffende PID angezeigt. Entsprechend kann man die blockierenden Dienste (wenn daraus kein Datenverlust resultieren kann) mit „kill“ beenden.

kill -s 9 2777

Oder um direkt alle betroffenen Dienste zu beenden (man sollte wissen was man tut):

kill -s 9 $(lsof -t /media/005E-0594)

Wobei hier die Option -t nur die PID’s ausgibt. So wird jede PID aus lsof dem Befehl kill übergeben, der dann den Prozess mit SIGKILL (Signal 9) beendet.

lsof zur Netzwerkanalyse

Bei der Überprüfung von Netzwerkdiensten kann lsof ebenfalls wertvolle Dienste leisten. Mit einem einfachen Befehl kann beispielsweise angezeigt werden, welche Verbindungen momentan auf dem Port 80 (Webserver) aktiv sind.

lsof -i :80
COMMAND    PID     USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
/usr/sbin 3387     root    5u  IPv6   4058      0t0  TCP *:http (LISTEN)
/usr/sbin 3868 www-data    5u  IPv6   4058      0t0  TCP *:http (LISTEN)
/usr/sbin 3869 www-data    5u  IPv6   4058      0t0  TCP *:http (LISTEN)
/usr/sbin 3871 www-data    5u  IPv6   4058      0t0  TCP *:http (LISTEN)
/usr/sbin 3873 www-data    5u  IPv6   4058      0t0  TCP *:http (LISTEN)
/usr/sbin 3874 www-data    5u  IPv6   4058      0t0  TCP *:http (LISTEN)
/usr/sbin 4303 www-data    5u  IPv6   4058      0t0  TCP *:http (LISTEN)
/usr/sbin 5289 www-data    5u  IPv6   4058      0t0  TCP *:http (LISTEN)
/usr/sbin 5600 www-data    5u  IPv6   4058      0t0  TCP *:http (LISTEN)

Auf Port 80 scheint niemand verbunden zu sein. Alle Dienste sind im Modus (LISTEN), also am „lauschen“ und Warten auf Verbindungen.

lsof -i :443
COMMAND    PID     USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
/usr/sbin 3387     root    7u  IPv6   4062      0t0  TCP *:https (LISTEN)
/usr/sbin 3868 www-data    7u  IPv6   4062      0t0  TCP *:https (LISTEN)
/usr/sbin 3869 www-data    7u  IPv6   4062      0t0  TCP *:https (LISTEN)
/usr/sbin 3869 www-data   18u  IPv6  22012      0t0  TCP backuppc01.local:https->84.dclient.npn.ch:17088 (ESTABLISHED)
/usr/sbin 3871 www-data    7u  IPv6   4062      0t0  TCP *:https (LISTEN)
/usr/sbin 3873 www-data    7u  IPv6   4062      0t0  TCP *:https (LISTEN)
/usr/sbin 3874 www-data    7u  IPv6   4062      0t0  TCP *:https (LISTEN)
/usr/sbin 4303 www-data    7u  IPv6   4062      0t0  TCP *:https (LISTEN)
/usr/sbin 5289 www-data    7u  IPv6   4062      0t0  TCP *:https (LISTEN)
/usr/sbin 5600 www-data    7u  IPv6   4062      0t0  TCP *:https (LISTEN)

Auf Port 443 (https) lauscht ebenfalls der Apache Webserver. Hier gibt es jedoch bereits eine aktive Verbindung (ETABLISHED). Übrigens ist es normal, dass die erste Instanz von Apache jeweils als root gestartet wird. Dies hat mit den nötigen Rechten zum öffnen von priorisierten Ports zu tun.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

*

Diese Seite verwendet Akismet, um Spam zu reduzieren. Erfahre, wie deine Kommentardaten verarbeitet werden..