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:
- die
RLIMIT_NPROC
eine weiche ressourcenbegrenzung (übersetrlimit(2)
), das begrenzt die Anzahl der Prozesse und threads, für eine wirkliche Benutzer-ID, erreicht wurde - der kernel die system-weite Beschränkung für die Anzahl der Prozesse und threads,
/proc/sys/kernel/threads-max
, wurde erreicht (sieheproc(5)
) - die maximale Anzahl von PIDs,
/proc/sys/kernel/pid_max
war erreicht
Ich glaube, keine von diesen sind sehr zufrieden, da
ulimit -a
Berichte unbegrenzt wie die maximale Anzahl der Benutzer-Prozesse./proc/sys/kernel/threads-max
eingestellt ist 1031129. Ich beobachten Sie die Anzahl der Zeilen inps 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./proc/sys/kernel/pid_max
auf 32768 gesetzt. Ich beobachten Sie die Anzahl der Prozesse mit Hilfeps 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ürfork
. Also ich denke, es kommt vonwaitpid
. Kann man es auch unterstrace
?- 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 diefork()
scheitern. Korrigiert in mindestens bash-4.4. Mehr zu dem Punkt, dies legt die Vermutung nahe, dass der OP auf, was Linux-Dokumente alsfork()
Speicher Fehler gemeldet, wie EAGAIN.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Vielleicht ist es ja offensichtlich, aber ist die ulimit -a-Ausgang für Benutzer, die mit dieser Aufbau-flow? Beispiel für die Ausgabe von einem meiner Server:
In der Regel die unbegrenzte Anzahl der Prozesse ist Links nur für root in der Bestellung nicht ausführen, in eine Gabel Bombe. Hier werden alle Benutzer mit Ausnahme von root wird eine Grenze haben.
Außerdem sehe ich ein limit auf die Anzahl der geöffneten Dateien. Für einen Benutzer Sie können dies überprüfen, mit
lsof -u <user>| wc -l