GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie kann ich feststellen, auf welches Benutzerlimit ich stoße?

nproc war das Problem:

[[email protected] ~]# ps -eLf | grep pascal | wc -l
4068
[[email protected] ~]# cat /etc/security/limits.d/20-nproc.conf
# Default limit for number of user's processes to prevent
# accidental fork bombs.
# See rhbz #432903 for reasoning.

*          soft    nproc     4096
root       soft    nproc     unlimited
[[email protected] ~]#

man limits.conf besagt:

   Also, please note that all limit settings are set per login. They are
   not global, nor are they permanent; existing only for the duration of
   the session. One exception is the maxlogin option, this one is system
   wide. But there is a race, concurrent logins at the same time will not
   always be detected as such but only counted as one.

Es scheint mir, dass nproc nur pro Anmeldung erzwungen wird, aber global zählt. Eine Anmeldung mit nproc 8192 und 5000 Threads hätte also keine Probleme, aber eine gleichzeitige Anmeldung der gleichen UID mit nproc 4096 und 50 Threads würde keine weiteren erstellen können, da die globale Anzahl (5050) über ihrer nproc-Einstellung liegt.

[[email protected] ~]# ps -eLf | grep pascal | grep google/chrome | wc -l
3792

Wenn Sie überhaupt nicht auf das Konto zugreifen können, wird es Ihnen schwer fallen, herauszufinden, was das Problem ist. Aber überprüfen Sie System- oder Anwendungsprotokolle, hoffentlich hat irgendein Programm dort einen Hinweis hinterlassen (insbesondere für einen fehlgeschlagenen Anmeldeversuch).

Wenn Sie Programme zum Experimentieren ausführen können, können Sie feststellen, welche Grenze erreicht wurde, indem Sie versuchen, jeden begrenzten Wert zu erhöhen und mit EAGAIN zu sehen, wann es funktioniert und wann der Versuch fehlschlägt . Es ist auch möglich, die für jeden Wert verwendeten Ressourcen aufzulisten; Ich kann mir kein Dienstprogramm vorstellen, das die Daten für alle Grenzwerte sammelt, aber es könnte durchaus eines geben.

Unter der Annahme, dass das Problem ein Kernel-Limit ist, sind diese in setrlimit aufgeführt Manpage. Diejenigen, die pro Benutzer-ID gelten, sind:

  • RLIMIT_MEMLOCK — Größe des nicht austauschbaren Speichers. Sollte die Anmeldung nicht verhindern, nur sehr wenige Programme fordern nicht austauschbaren Speicher an.
  • RLIMIT_MSGQUEUE — Größe der Nachrichtenwarteschlangen. Sollte die Anmeldung nicht verhindern, verwenden nur sehr wenige Programme Nachrichtenwarteschlangen.
  • RLIMIT_NPROC — maximale Anzahl von Prozessen. Dieser hier wird absolut Anmeldungen verhindern, wenn es erreicht ist. Erhöhung des Limits in /etc/security/limits.conf wirkt sich nicht auf die bestehenden Sitzungen aus, aber auf neue Prozesse. Wenn der Systemadministrator also den Wert dort erhöht, kann sich der Benutzer anmelden.
  • RLIMIT_SIGPENDING — maximale Anzahl anstehender Signale. Sollte die Anmeldung nicht verhindern, verwenden nur sehr wenige Programme sigqueue um Signale einzureihen.

Die Begrenzung auf Prozesse ist also die wahrscheinlichste. Wenn Sie Zugriff auf eine laufende Shell haben, können Sie dies bestätigen, indem Sie versuchen, ein Programm auszuführen. der Fehler sollte ziemlich eindeutig sein:

$ ls
bash: fork: retry: No child processes
bash: fork: retry: No child processes
bash: fork: retry: No child processes
bash: fork: retry: No child processes
bash: fork: Resource temporarily unavailable

Dieses Limit können Sie mit ulimit -u ausdrucken . Wenn Sie Zugriff auf eine Shell haben, die als problematischer Benutzer ausgeführt wird, und der Benutzer kein setuid-Programm ausgeführt hat, können Sie mit set /proc/*/task/*/cwd/.; echo $# die Prozesse auflisten, die auf dieses Limit angerechnet werden (Listet die Kernel-Threads auf, für die der Benutzer den cwd lesen kann Link, was bedeutet, dass der Benutzer die volle Kontrolle über den Prozess hat).


Linux
  1. So beenden Sie laufende Prozesse in Linux

  2. Wie erhöht man das Limit für offene Dateien in Ubuntu?

  3. Wie teste ich, auf welchem ​​Port MySQL läuft und ob eine Verbindung möglich ist?

  4. Wie kann ich sehen, in welchem ​​CPU-Kern ein Thread läuft?

  5. Wie kann ich unter Linux feststellen, welcher Prozess meinem Prozess ein Signal gesendet hat?

So listen Sie laufende Prozesse in Linux auf

So finden Sie die am häufigsten ausgeführten Prozesse nach Speichernutzung

Wie kann man Xargs sagen, welches Argument es wählen soll?

So beschränken Sie den Root-Benutzer in CentOS

Wie kann ich unter Linux einen Benutzernamen anhand der ID suchen?

Wie hoch darf die Systemlast gehen?