Ursache der Gabel: Wiederholung: Keine Kind-Prozesse`

Wenn ich eine bestimmte kommerzielle build-flow in OpenSuse habe ich die folgende Fehlermeldung auftreten:

fork: retry: No child processes

Ich auf diesen Fehler stoßen, die an verschiedenen Orten in der Strömung entspricht, mit verschiedenen ausführbaren Dateien, also glaube ich, dass das tool selbst ist nicht das problem. Allerdings betreibe ich mehrere Instanzen (bis zu 16) von diesem build Strömung bei der gleichen Zeit. Der build ausgelöst, die auf verschiedene Server nach zu laden, also auch mal ein paar erstellt, auf der gleichen Maschine laufen. Ich vermute, dass die server laden, hat irgendwie mit diesem zu tun, aber ich kann nicht herausfinden, wie genau.

Ich vermute, dass die Fehlermeldung entspricht der EAGAIN Fehler fork. Die fork Handbuch gibt mehrere mögliche Ursachen für diesen Fehler:

  1. die RLIMIT_NPROC eine weiche ressourcenbegrenzung (über setrlimit(2)), das begrenzt die Anzahl der Prozesse und threads, für eine wirkliche Benutzer-ID, erreicht wurde
  2. der kernel die system-weite Beschränkung für die Anzahl der Prozesse und threads, /proc/sys/kernel/threads-max, wurde erreicht (siehe proc(5))
  3. die maximale Anzahl von PIDs, /proc/sys/kernel/pid_max war erreicht

Ich glaube, keine von diesen sind sehr zufrieden, da

  1. ulimit -a Berichte unbegrenzt wie die maximale Anzahl der Benutzer-Prozesse.
  2. /proc/sys/kernel/threads-max eingestellt ist 1031129. Ich beobachten Sie die Anzahl der Zeilen in ps auxH, sollte die Anzahl der threads (plus die header-Zeile, die ps-Ausgänge, die ich denke), bei einem 1-Sekunden-Granularität, aber es wird nie höher als der 917.
  3. /proc/sys/kernel/pid_max auf 32768 gesetzt. Ich beobachten Sie die Anzahl der Prozesse mit Hilfe ps aux, aber es wird nie höher als 726.

Ich glaube, ich habe irgendwo gelesen, dass es auch eine Möglichkeit, dass der kernel lief der andere (Speicher?) Ressourcen. Wie kann ich das überprüfen? Oder ist etwas anderes falsch in meiner Argumentation?

Den Ausgang form ulimit -a ist:

core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 515564
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 5120
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) unlimited
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited
  • sind Sie beginnen threads mit fork nur? Oder mit pthreads?
  • Mehr wahrscheinlich, als das laufen von Prozessen, das system könnte laufen out of stack space (bei der Verwendung von threads) oder Datei-Deskriptoren
  • Vielen Dank für Ihre Anregungen. Ich weiß nicht, ob threads gestartet, mit Gabel oder pthreads. Angesichts der Komplexität des Tools, ich denke, es verwendet eine Kombination von beidem. Ich denke, ich könnte die Verwendung von strace um zu bestimmen, welche verwendet wird.Ich erstellt ein einfaches C-Anwendung, die zählt, wie viele Gabeln kann es tun, und es erreicht 12272 Prozesse, bevor es ausfällt.
  • I überwachen Sie die Menge des freien Speichers, während ich der build-flow (mit dem Linux - free - Befehl), und es ist immer noch etwa 63 GB zur Verfügung (es ist ein server mit über 126 GB DRAM). Ich würde sagen, dass die Regeln aus Mangel an Stackspeicher. Ich nehme an, die Datei-Deskriptoren sind gehalten, im kernel-space beschränkt ist. Nach /proc/sys/fs/file-nr bei den meisten 14144 Datei-Deskriptoren sind in Verwendung. Nach /proc/sys/fs/file-max ist, kann ich nicht mehr als 13164302 von Ihnen, die ausreichend ist. Ich denke, kernel-space läuft aus vor dass. Haben Sie eine Ahnung, ob bzw. wie kann ich die Größe des kernel-space Links?
  • kannst du eine Ausgabe von ulimit -a so können wir sehen, alle Grenzen zu setzen? BTW Stack-Speicherplatz pro user begrenzen, nicht eine Allgemeine. Ich würde davon ausgehen, was Sie schlagen ist ein Benutzer-limit - kernel sind in der Regel sehr großzügig.
  • Ich fügte hinzu, die Ausgabe zu die Frage.
  • ECHILD ist nicht in der Fehler-Liste für fork. Also ich denke, es kommt von waitpid. Kann man es auch unter strace?
  • Stack-Größe 8 M könnte eng werden, je nach Anzahl von threads ausgeführt wird. Vielleicht könnten Sie versuchen, und heben Sie dieses ein wenig?
  • das ist richtig. Jedoch, die jobs.c:make_child() Umsetzung von mindestens bash-4.2 versuche zur correctively reap Kinder nach der Begegnung mit EAGAIN, aber es nicht sicher zu bewahren errno dabei. Die Ernte endet mit ECHLD, natürlich, und bash fälschlicherweise berichtet, dass als die fork() scheitern. Korrigiert in mindestens bash-4.4. Mehr zu dem Punkt, dies legt die Vermutung nahe, dass der OP auf, was Linux-Dokumente als fork() Speicher Fehler gemeldet, wie EAGAIN.

InformationsquelleAutor Gyzuh | 2017-08-04
Schreibe einen Kommentar