Verwalten von Systemressourcen mit dem `ulimit`-Befehl unter Linux
Der `ulimit`-Befehl ist ein integriertes Shell-Dienstprogramm auf Unix- und Linux-Systemen, das ressourcenbeschränkungen pro Prozess und pro Benutzer durchsetzt und verhindert, dass ein einzelner Prozess oder Benutzer Systemressourcen wie CPU-Zeit, Arbeitsspeicher, offene Dateideskriptoren und Prozessanzahl erschöpft. Es arbeitet auf Kernel-Ebene über den `setrlimit()`-Systemaufruf und ist damit einer der direktesten und ressourcenschonendsten Mechanismen, die Systemadministratoren für die Ressourcenverwaltung zur Verfügung stehen.
Für jeden Server, der Produktions-Workloads ausführt – sei es eine stark frequentierte Webanwendung, eine Datenbank-Engine oder ein containerisierter Microservice-Stack – sind falsch konfigurierte oder fehlende `ulimit`-Einstellungen eine häufige Ursache für Kaskadenausfälle, unkontrollierte Prozesse und vollständige Systemausfälle. Diese Limits richtig einzustellen ist keine Option, sondern grundlegende Infrastrukturhygiene.
Wie `ulimit` intern funktioniert
Wenn ein Shell-Prozess `ulimit` aufruft, werden die im POSIX-Standard definierten Systemaufrufe `getrlimit()` und `setrlimit()` ausgeführt. Jedes Limit wird als Wertepaar dargestellt: ein Soft-Limit und ein Hard-Limit. Diese werden pro Prozess im Prozessdeskriptor des Kernels gespeichert und zum Zeitpunkt von `fork()` an untergeordnete Prozesse vererbt.
Dieses Vererbungsmodell ist entscheidend zu verstehen. Wenn Sie `ulimit`-Werte in einer Shell-Sitzung setzen, erbt jeder aus dieser Shell gestartete Prozess – einschließlich Daemons, die über Init-Skripte gestartet werden – diese Limits. Umgekehrt gelten Limits, die in `/etc/security/limits.conf` gesetzt werden, zum Zeitpunkt der PAM-Anmeldung, nicht zur Laufzeit, was bedeutet, dass sie nur für neue Anmeldesitzungen wirksam werden, nicht für bereits laufende Dienste.
Soft-Limits vs. Hard-Limits
| Eigenschaft | Soft-Limit | Hard-Limit |
|---|
| — | — | — |
|---|
| Wer kann es erhöhen | Jeder nicht privilegierte Benutzer (bis zum Hard-Limit) | Nur root (`CAP_SYS_RESOURCE`) |
|---|
| Wer kann es senken | Jeder Benutzer | Jeder Benutzer (ohne root nicht umkehrbar) |
|---|
| Durchsetzung | Vom Kernel durchgesetzt | Dient als Obergrenze für das Soft-Limit |
|---|
| Typischer Anwendungsfall | Betriebliche Grenze im Tagesgeschäft | Absolutes Maximum für Sicherheitsrichtlinien |
|---|
| Flag in `ulimit` | `-S` | `-H` |
|---|
Ein häufiger Betriebsfehler ist das Setzen des Hard-Limits gleich dem Soft-Limit. Dadurch wird jegliche Flexibilität für einen Prozess entfernt, seine eigenen Limits vorübergehend zu erhöhen, was einige Anwendungen (wie bestimmte JVM-Implementierungen und Datenbank-Engines) beim Start legitim tun.
Vollständige Referenz: `ulimit`-Ressource-Flags
| Flag | Ressource | Einheit | Üblicher Produktionswert |
|---|
| — | — | — | — |
|---|
| `-t` | CPU-Zeit | Sekunden | `unlimited` für Daemons |
|---|
| `-f` | Maximale Dateigröße | 512-Byte-Blöcke | `unlimited` oder spezifische Begrenzung |
|---|
| `-d` | Datensegment (Heap)-Größe | KB | `unlimited` für Java-Apps |
|---|
| `-s` | Stack-Größe | KB | `8192` (Standard) |
|---|
| `-c` | Core-Dump-Dateigröße | 512-Byte-Blöcke | `0` (in Produktion deaktiviert) |
|---|
| `-m` | Maximale Resident-Set-Größe | KB | Selten durchgesetzt (cgroups verwenden) |
|---|
| `-v` | Virtueller Speicher (Adressraum) | KB | `unlimited` für die meisten Dienste |
|---|
| `-n` | Offene Dateideskriptoren | Anzahl | `65536` oder höher für stark ausgelastete Server |
|---|
| `-u` | Maximale Benutzerprozesse | Anzahl | `4096`–`65536` je nach Rolle |
|---|
| `-l` | Gesperrter Speicher (mlock) | KB | Hoch für Redis, Elasticsearch |
|---|
| `-i` | Ausstehende Signale | Anzahl | Systemstandard in der Regel ausreichend |
|---|
| `-q` | POSIX-Nachrichtenwarteschlangen-Bytes | Bytes | Systemstandard |
|---|
| `-r` | Echtzeit-Scheduling-Priorität | Priorität | `0` außer bei RT-Workloads |
|---|
| `-e` | Maximale Scheduling-Priorität (nice) | Nice-Wert | Systemstandard |
|---|
Praktische `ulimit`-Verwendung mit realem Kontext
Aktuelle Limits anzeigen
“`bash
ulimit -a # All soft limits for the current shell
ulimit -aH # All hard limits for the current shell
“`
Um Limits für einen bestimmten laufenden Prozess (PID) zu überprüfen, lesen Sie direkt aus dem proc-Dateisystem – dies ist die maßgebliche Quelle und umgeht die Berichterstattung auf Shell-Ebene:
“`bash
cat /proc/<PID>/limits
“`
Dies ist unschätzbar wertvoll bei der Fehlerbehebung eines Dienstes, der von systemd oder einem Init-Skript gestartet wurde, wo `ulimit -a` auf Shell-Ebene nicht die tatsächlichen Limits des Prozesses widerspiegelt.
Soft- und Hard-Limits setzen
“`bash
Set soft limit for open file descriptors
ulimit -Sn 65536
Set hard limit for open file descriptors
ulimit -Hn 131072
Set both simultaneously (soft = hard = value)
ulimit -n 65536
“`
Core-Dumps in der Produktion deaktivieren
“`bash
ulimit -c 0
“`
Core-Dumps können innerhalb von Sekunden Gigabytes an Festplattenspeicher verbrauchen, wenn ein speicherintensiver Prozess abstürzt. Das Deaktivieren in der Produktion ist gängige Praxis, es sei denn, Sie debuggen aktiv. Für Entwicklungsumgebungen legen Sie einen dedizierten Pfad mit `sysctl kernel.core_pattern` zusammen mit einem Core-Limit ungleich null fest.
CPU-Zeit für nicht vertrauenswürdige Prozesse einschränken
“`bash
ulimit -t 30
“`
Dies sendet `SIGXCPU` an den Prozess, wenn er das Soft-CPU-Zeitlimit erreicht, und `SIGKILL` beim Hard-Limit. Dies ist besonders nützlich in Shared-Hosting-Umgebungen oder beim Ausführen von benutzerübermittelten Skripten.
Das Limit für offene Dateideskriptoren für hochgradig parallele Dienste erhöhen
Nginx, HAProxy, PostgreSQL und Redis benötigen unter Last eine hohe Anzahl offener Dateideskriptoren. Der systemweite Standard von 1024 ist für die Produktion gefährlich niedrig:
“`bash
ulimit -n 65536
“`
Dies betrifft jedoch nur die aktuelle Shell-Sitzung. Für eine dauerhafte Konfiguration verwenden Sie die im nächsten Abschnitt beschriebenen Methoden.
`ulimit`-Einstellungen dauerhaft machen
Methode 1: `/etc/security/limits.conf`
Dies ist der standardmäßige PAM-basierte Ansatz für dauerhafte Limits auf Benutzerebene:
“`
/etc/security/limits.conf
<domain> <type> <item> <value>
- soft nofile 65536
- hard nofile 131072
nginx soft nproc 4096
nginx hard nproc 8192
postgres soft nofile 65536
postgres hard nofile 65536
postgres soft memlock unlimited
postgres hard memlock unlimited
“`
Der Platzhalter `*` gilt für alle Benutzer, gilt jedoch nicht für root. Root erfordert einen expliziten Eintrag:
“`
root soft nofile 65536
root hard nofile 131072
“`
Stellen Sie sicher, dass das PAM-Modul geladen ist. Überprüfen Sie, ob `/etc/pam.d/common-session` (Debian/Ubuntu) oder `/etc/pam.d/system-auth` (RHEL/CentOS) Folgendes enthält:
“`
session required pam_limits.so
“`
Methode 2: `/etc/security/limits.d/`-Drop-in-Dateien
Für eine übersichtlichere Verwaltung, insbesondere in Konfigurationsmanagementsystemen wie Ansible oder Puppet, platzieren Sie dienstspezifische Limit-Dateien im Drop-in-Verzeichnis:
“`bash
/etc/security/limits.d/99-nginx.conf
nginx soft nofile 65536
nginx hard nofile 131072
“`
Dateien in diesem Verzeichnis werden nach `limits.conf` verarbeitet und überschreiben diese, was sie ideal für anwendungsspezifische Anpassungen macht, ohne die Basiskonfiguration zu ändern.
Methode 3: systemd-Service-Units (Der moderne Standard)
Für Dienste, die von systemd verwaltet werden – was die Mehrheit moderner Linux-Distributionen betrifft – wird `limits.conf` standardmäßig nicht angewendet. systemd verwaltet seine eigenen Ressourcenlimits pro Service-Unit:
“`ini
/etc/systemd/system/nginx.service.d/limits.conf
[Service]
LimitNOFILE=65536
LimitNPROC=4096
LimitCORE=0
LimitMEMLOCK=infinity
“`
Nach der Bearbeitung neu laden und neu starten:
“`bash
systemctl daemon-reload
systemctl restart nginx
“`
Die angewendeten Limits überprüfen:
“`bash
cat /proc/$(systemctl show -p MainPID nginx | cut -d= -f2)/limits
“`
Dies ist die zuverlässigste Methode für Produktionsdienste und sollte der Standardansatz auf jedem System sein, das systemd ausführt (Ubuntu 16.04+, CentOS 7+, Debian 8+).
Methode 4: Shell-Profildateien
Für Limits auf Benutzersitzungsebene, die interaktiv gelten, fügen Sie `ulimit`-Befehle zu `/etc/profile` (systemweit) oder `~/.bashrc` / `~/.profile` (pro Benutzer) hinzu. Dieser Ansatz eignet sich für Entwickler-Workstations, ist jedoch für Daemon-Prozesse ungeeignet.
Rollenbasierte `ulimit`-Konfigurationsprofile
Verschiedene Serverrollen erfordern grundlegend unterschiedliche Ressourcenlimit-Profile. Die Anwendung generischer Standardwerte auf alle Servertypen ist eine häufige Quelle subtiler, schwer zu diagnostizierender Fehler.
Webserver (Nginx / Apache)
“`
nofile: 65536–131072 # High concurrency requires many open sockets + files
nproc: 4096 # Worker processes + threads
core: 0 # Disable core dumps in production
“`
Relationale Datenbank (PostgreSQL / MySQL)
“`
nofile: 65536 # Many concurrent connections = many file descriptors
memlock: unlimited # Required for shared memory and huge pages
nproc: 4096
stack: 8192 KB
core: 0
“`
Java-Anwendungsserver (Tomcat / Spring Boot)
“`
nofile: 65536
nproc: 65536 # JVM thread-per-connection models spawn many threads
data: unlimited # JVM heap is allocated from the data segment
stack: 512 KB # Reduce stack size to fit more threads in memory
“`
Redis / In-Memory-Datenspeicher
“`
nofile: 65536
memlock: unlimited # Prevents swapping of memory-mapped data
“`
Kritische Fallstricke und Sonderfälle
Das `nproc`-Limit zählt Threads, nicht nur Prozesse. Unter Linux werden Threads als leichtgewichtige Prozesse implementiert (`clone()` mit gemeinsamem Speicher). Eine Java-Anwendung mit 500 Threads zählt als 500 gegen das `nproc`-Limit. Dies überrascht viele Administratoren, die konservative `nproc`-Werte setzen und sich dann fragen, warum ihre JVM mit `OutOfMemoryError: unable to create new native thread` abstürzt.
`ulimit -v` begrenzt den virtuellen Adressraum, nicht den physischen RAM. Viele Administratoren setzen `-v` in der Annahme, die Speichernutzung zu begrenzen. In Wirklichkeit begrenzen sie den virtuellen Adressraum, der speicherzugeordnete Dateien, gemeinsame Bibliotheken und JVM-Metaspace umfasst. Ein zu niedriger Wert führt zu `mmap()`-Fehlern und kryptischen Anwendungsfehlern.
`ulimit` gilt nicht rückwirkend. Das Ändern von Limits in `limits.conf` oder einer systemd-Unit-Datei betrifft bereits laufende Prozesse nicht. Sie müssen den Dienst neu starten, damit neue Limits wirksam werden.
Container-Umgebungen umgehen `ulimit` auf unerwartete Weise. In Docker werden `ulimit`-Standardwerte auf Daemon-Ebene gesetzt (`/etc/docker/daemon.json`) und können pro Container mit `–ulimit` überschrieben werden. Die Limits des Containers sind jedoch durch die Limits des Host-Kernels begrenzt. Das Setzen von `nofile=1048576` in einem Container, während der Host `nofile=65536` hat, fällt stillschweigend auf das Host-Limit zurück.
Die systemweite `nofile`-Obergrenze ist von den prozessspezifischen Limits getrennt. Der Kernel-Parameter `fs.file-max` (gesetzt über `sysctl`) steuert die Gesamtanzahl der Dateideskriptoren im gesamten System. Selbst wenn das prozessspezifische `nofile` hoch gesetzt ist, führt das Erreichen von `fs.file-max` zu systemweiten `ENFILE`-Fehlern. Überprüfen und optimieren Sie beides:
“`bash
sysctl fs.file-max
sysctl -w fs.file-max=2097152
“`
`ulimit` vs. cgroups: Das richtige Werkzeug wählen
| Fähigkeit | `ulimit` / `setrlimit` | cgroups v2 |
|---|
| — | — | — |
|---|
| Geltungsbereich | Pro Prozess (von Kindprozessen geerbt) | Pro Prozessgruppe |
|---|
| Speicherbegrenzung | Nur virtueller Adressraum (`-v`) | Tatsächliche RSS + Swap-Durchsetzung |
|---|
| CPU-Drosselung | CPU-Zeitbudget (`-t`) | CPU-Bandbreitenregler (präzise %) |
|---|
| I/O-Begrenzung | Nicht unterstützt | Block-I/O-Gewichtung und Ratenlimits |
|---|
| Netzwerkbegrenzung | Nicht unterstützt | Erfordert tc + cgroup-Integration |
|---|
| Persistenz | Über PAM oder systemd | Über systemd-Slices oder cgroupfs |
|---|
| Container-Kompatibilität | Begrenzt | Nativ (Docker, Kubernetes verwenden cgroups) |
|---|
| Granularität | Grob | Feinkörnig |
|---|
`ulimit` bleibt das richtige Werkzeug für schnelle, sitzungsspezifische Limits, Dateideskriptor-Obergrenzen und Core-Dump-Kontrolle. Für umfassende Ressourcenisolierung – insbesondere in mandantenfähigen Umgebungen oder containerisierten Workloads – ist cgroups v2 der überlegene Mechanismus. In einer gut konfigurierten VPS Hosting– oder Dedicated Server-Umgebung werden beide Mechanismen typischerweise in Kombination verwendet: `ulimit` für prozessspezifische Schutzmaßnahmen und cgroups für aggregierte Ressourcenbudgets.
Ressourcenlimits überwachen und validieren
Proaktive Überwachung verhindert, dass limitbedingte Ausfälle zu Produktionsvorfällen werden.
Aktuelle systemweite Dateideskriptor-Nutzung überprüfen:
“`bash
cat /proc/sys/fs/file-nr
Output: <allocated> <unused> <max>
“`
Prozesse finden, die sich ihrem `nofile`-Limit nähern:
“`bash
for pid in /proc/[0-9]*; do
pid_num=${pid##*/}
limit=$(awk '/Max open files/{print $4}' /proc/$pid_num/limits 2>/dev/null)
current=$(ls /proc/$pid_num/fd 2>/dev/null | wc -l)
[ -n "$limit" ] && [ "$limit" != "unlimited" ] &&
awk -v c=$current -v l=$limit -v p=$pid_num
'BEGIN{if(c/l>0.8) printf "PID %s: %d/%d (%.0f%%)n",p,c,l,c/l*100}'
done
“`
Werkzeuge für die laufende Überwachung:
- `lsof -u <username>` — alle offenen Dateien für einen Benutzer auflisten
- `ss -s` — Socket-Statistiken (korreliert mit `nofile`-Druck)
- `htop` mit Prozessbaumansicht — Prozessanzahl pro Benutzer visualisieren
- `sar -v` — historische Dateideskriptor- und Inode-Nutzung über sysstat
- Prometheus `node_exporter` — stellt `node_filefd_allocated`- und `node_filefd_maximum`-Metriken für Alarme bereit
Für Umgebungen, die VPS mit cPanel oder andere Kontrollpanels betreiben, werden viele dieser Limits vom Panel-Installer vorkonfiguriert, müssen jedoch häufig nach oben angepasst werden, wenn der Datenverkehr zunimmt. Überprüfen Sie immer die tatsächlichen Limits anhand von `/proc/<PID>/limits`, anstatt der Panel-Dokumentation zu vertrauen.
Sicherheitsimplikationen von `ulimit`
Ressourcenlimits sind auch eine Sicherheitskontrolle. Ohne sie kann ein kompromittierter oder fehlerhafter Prozess eine Fork-Bombe ausführen (`:(){ :|:& };:`), alle verfügbaren Prozessslots erschöpfen und das System unresponsiv machen. Ein konservatives `nproc`-Limit pro Benutzer ist die primäre Gegenmaßnahme:
“`
- hard nproc 4096
“`
Ebenso verhindert das Deaktivieren von Core-Dumps (`-c 0`), dass sensible Speicherinhalte – einschließlich Verschlüsselungsschlüssel, Passwörter und Sitzungstoken – in eine weltweit lesbare Datei auf der Festplatte geschrieben werden.
Für Shared-Hosting-Umgebungen oder jeden Server, auf dem mehrere Benutzer Shell-Zugang haben, ist `ulimit` eine obligatorische Sicherheitsschicht. Auf Shared Web Hosting-Infrastruktur werden diese Limits typischerweise auf Plattformebene durchgesetzt, aber Administratoren, die ihren eigenen Mehrbenutzер-VPS betreiben, sollten sie explizit konfigurieren.
Wenn Ihr Server SSL-Terminierung oder Zertifikatsverwaltung durchführt, stellen Sie sicher, dass der Prozess, der TLS verarbeitet (z. B. Nginx, HAProxy), ausreichende `nofile`-Limits hat, da jede TLS-Verbindung mehrere Dateideskriptoren benötigt. Kombinieren Sie dies mit ordnungsgemäß konfigurierten SSL Certificates, um zu vermeiden, dass zertifikatsbezogene Verbindungsfehler Ressourcenprobleme verschlimmern.
Für Mail-Server-Deployments sind Postfix und Dovecot besonders empfindlich gegenüber `nofile`-Limits, da jede gleichzeitige E-Mail-Verbindung und jeder Postfachzugriff Dateideskriptoren verbraucht. Wenn Sie Ihre eigene Mail-Infrastruktur betreiben, anstatt verwaltetes Email Hosting zu nutzen, ist die Anpassung von `nofile` auf mindestens 65536 für den Mail-Benutzer auf jedem mäßig ausgelasteten Server unverhandelbar.
Entscheidungsmatrix: Was konfigurieren und wo
| Szenario | Empfohlene Methode | Schlüsselparameter |
|---|
| — | — | — |
|---|
| Interaktive Benutzersitzungen | `/etc/security/limits.conf` | `nofile`, `nproc`, `core` |
|---|
| Von systemd verwalteter Dienst | systemd-Unit `[Service]`-Abschnitt | `LimitNOFILE`, `LimitNPROC`, `LimitCORE` |
|---|
| Docker-Container | `–ulimit`-Flag oder `daemon.json` | `nofile`, `nproc` |
|---|
| Einmaliges Shell-Testen | `ulimit`-Befehl direkt | Beliebiges Flag |
|---|
| Mandantenfähiger gemeinsamer Server | `limits.conf` + PAM-Durchsetzung | `nproc`, `nofile`, `fsize`, `cpu` |
|---|
| Kubernetes-Pod | Pod-Sicherheitskontext + cgroups | Vom kubelet verwaltet |
|---|
| Anwendungsspezifische Anpassung | `limits.d/`-Drop-in-Datei | Dienstspezifische Parameter |
|---|
Technische Schlüssel-Checkliste
- Überprüfen Sie angewendete Limits immer über `/proc/<PID>/limits`, nicht über `ulimit -a` auf Shell-Ebene, für laufende Dienste.
- Konfigurieren Sie für systemd-Dienste Limits in der Unit-Datei mit `Limit*`-Direktiven — `limits.conf` wird von systemd standardmäßig nicht gelesen.
- Setzen Sie `nofile` auf mindestens `65536` für jeden Dienst, der Netzwerkverbindungen verarbeitet; `131072` oder höher für hochgradig parallele Workloads.
- Setzen Sie das Hard-Limit niemals gleich dem Soft-Limit, es sei denn, Sie haben eine spezifische Sicherheitsanforderung — Anwendungen benötigen Spielraum zur Selbstanpassung.
- Deaktivieren Sie Core-Dumps (`LimitCORE=0`) in der Produktion; aktivieren Sie sie mit einem kontrollierten Pfad in der Staging-Umgebung.
- Das `nproc`-Limit zählt Threads unter Linux — berücksichtigen Sie dies bei der Konfiguration von JVM- oder Go-Runtime-Anwendungen.
- Passen Sie `fs.file-max` über `sysctl` zusammen mit prozessspezifischen `nofile`-Limits an, um systemweite `ENFILE`-Erschöpfung zu vermeiden.
- In containerisierten Umgebungen sind die Host-Kernel-Limits die harte Obergrenze — `ulimit`-Einstellungen auf Container-Ebene können diese nicht überschreiten.
- Verwenden Sie cgroups v2 für Speicher- und I/O-Durchsetzung; verwenden Sie `ulimit` für Dateideskriptor-Obergrenzen, Prozessanzahlen und Core-Dump-Kontrolle.
- Starten Sie nach jeder Limitänderung in `limits.conf` oder systemd-Unit-Dateien den betroffenen Dienst neu und überprüfen Sie mit `/proc/<PID>/limits`.
FAQ
Gilt `ulimit` für Root-Prozesse?
Der Platzhalter `*` in `/etc/security/limits.conf` schließt root explizit aus. Root-Prozesse umgehen auch die Hard-Limit-Durchsetzung für die meisten Ressourcentypen — root kann seine eigenen Hard-Limits erhöhen. Um Limits auf root anzuwenden, fügen Sie einen expliziten `root`-Eintrag in `limits.conf` hinzu, obwohl viele Systemdienste, die als root laufen, PAM-angewendete Limits ignorieren, wenn sie außerhalb einer Anmeldesitzung gestartet werden.
Warum hat meine `limits.conf`-Änderung keine Auswirkung auf einen laufenden Dienst?
`limits.conf` wird von PAM zum Anmeldezeitpunkt angewendet. Dienste, die von systemd, SysVinit oder Upstart gestartet werden, durchlaufen PAM nicht und erben daher keine `limits.conf`-Einstellungen. Konfigurieren Sie Limits direkt in der systemd-Unit-Datei mit `LimitNOFILE` und verwandten Direktiven, und führen Sie dann `systemctl daemon-reload && systemctl restart <service>` aus.
Was ist der maximale Wert, den ich für `nofile` setzen kann?
Das prozessspezifische Maximum ist durch den `fs.nr_open`-Kernel-Parameter begrenzt (Standard: 1.048.576 auf den meisten Kerneln). Das systemweite Gesamtlimit ist durch `fs.file-max` begrenzt. Sie können `fs.nr_open` über `sysctl` erhöhen, aber Werte über 1.048.576 erfordern eine Kernel-Neukompilierung auf älteren Kerneln. Praktisch gesehen decken 524.288 oder 1.048.576 nahezu alle Produktionsanwendungsfälle ab.
Wie überprüfe ich, ob ein Prozess seine `ulimit`-Grenze erreicht hat?
Überprüfen Sie das Kernel-Protokoll mit `dmesg | grep -i "ulimit|RLIMIT|too many open|cannot allocate"`. Anwendungsprotokolle zeigen typischerweise `EMFILE` (zu viele offene Dateien), `ENOMEM` (Speicherzuweisungsfehler) oder `EAGAIN` (Ressource vorübergehend nicht verfügbar). Vergleichen Sie mit `/proc/<PID>/limits` und der aktuellen Deskriptoranzahl über `ls /proc/<PID>/fd | wc -l`.
Ist `ulimit` für die Ressourcenisolierung in einer mandantenfähigen Umgebung ausreichend?
Nein. `ulimit` bietet Schutzmaßnahmen pro Prozess und pro Benutzer, erzwingt jedoch keine Speicherbandbreiten-, Festplatten-I/O- oder Netzwerkdurchsatzlimits. Für echte mandantenfähige Isolierung kombinieren Sie `ulimit` mit cgroups v2-Ressourcenreglern und erwägen Sie Namespace-Isolierung (Benutzer-Namespaces, PID-Namespaces) für stärkere Sicherheitsgrenzen. Auf verwalteter Infrastruktur werden diese Kontrollen typischerweise auf Hypervisor- und Container-Runtime-Ebene geschichtet.
