2017-05-20 3 views
1

Ich habe ein Perl-Skript geerbt, das je nach Maschinenkonfiguration bei Aufrufen von fork mit $? == 11 fehlschlägt.Fork schlägt mit "Ressource vorübergehend nicht verfügbar" fehl. Welche Ressource?

Nach errno.h und variousposts, 11 EAGAIN, das heißt „versuchen Sie es erneut“, weil einige Ressource vorübergehend nicht verfügbar war.

Gibt es eine Möglichkeit, um zu bestimmen, welche Ressource die Gabel verursacht auszufallen, andere als verschiedene Systemgrenzen eine nach der anderen zu erhöhen (open file descriptors, swap space oder Anzahl von allowable threads)?

+0

Ein gegabelter Prozess ist ein vollständiger Klon des ursprünglichen Prozesses. Wenn Sie Ihren Prozess vor der Verzweigung profilieren, erhalten Sie einen Hinweis darauf, wie viele Ressourcen er verwendet. – alvits

+0

Meinst du $! = 11? – ikegami

+0

'Meinst du $! = 11?'. Eigentlich habe ich etwas falsch verstanden. Was ich hätte sagen sollen, ist, dass die Verzweigung erfolgreich ist, aber sofort mit dem Statuscode 11 endet, wie von "wait" gemeldet. – phonybone

Antwort

2

Angenommen, Sie bedeuten $! ist EAGAIN, die fork Mann Seite auf meinem System sagt:

EAGAIN: fork() kann nicht genügend Speicher zuweisen der Eltern Seite Tabellen zu kopieren und eine Aufgabenstruktur für das Kind zuzuweisen.

EAGAIN: Es war nicht möglich, einen neuen Prozess zu erstellen, weil das Ressourcenlimit des Aufrufers RLIMIT_NPROC erreicht wurde. Um diese Grenze zu überschreiten, muss der Prozess entweder über die Fähigkeit CAP_SYS_ADMIN oder CAP_SYS_RESOURCE verfügen.

Versuchen Sie, eine Menge Prozesse zu erstellen? Ernten Sie Ihre Kinder, wenn sie fertig sind?

+0

Siehe oben meinen Kommentar für eine Klarstellung der ursprünglichen Frage, die eine Übervereinfachung meinerseits war. Der tatsächliche Ablauf der Ereignisse ist folgender: Nach der Initialisierung bereitet das Programm eine große Datei (8 GB) mittels einiger Aufrufe von system() vor. Dann gibt das Programm einen Prozess für jeden CPU-Kern auf der Maschine aus. Also versucht das Programm möglicherweise, einen sehr großen Speicherplatz zu duplizieren, wenn es sich verzweigt (aber Linux ist copy-write, also sollte das in Ordnung sein?). Es gibt eine große Menge an RAM (184 GB), und ich erhöhte die Anzahl der zulässigen offenen Dateien und erhöhte Swap-Speicherplatz. – phonybone

+0

Einige der Forks sind erfolgreich und einige scheitern, und wenn ich die Anzahl der Gabeln insgesamt einschränke, kann ich das Programm oft normal laufen lassen. – phonybone

+0

Re "* die Gabel ist erfolgreich *", & "* Einige der Gabeln gelingen und einige scheitern *", welches ist es? Welcher Anruf ist fehlgeschlagen? Warum prüfen Sie nicht, mit welchem ​​Fehler es versagt? – ikegami

Verwandte Themen