Fork / Windows / Perl / Resource temporarily unavailable
Fork / Windows / Perl / Resource temporarily unavailable
am 07.12.2006 16:21:18 von ronny.kluge
Hallo zusammen,
mit folgenden Zeilen hatte ich eigentlich vor 100 Childs auf einem W2K3
System zu erstellen :
____________________________________________________________ _______________=
______
$clients =3D 100;
for ($i=3D0;$i< $clients;$i++)
{
&childs();
}
sub childs
{
if ($pid =3D fork)
{
# Parent
}
else
{
die "Fork-Error: $!\n" unless defined $pid;
# Child
print "$i\n";
exit;
}
}
____________________________________________________________ _______________=
______
Problem :
Das Programm kann nach dem 63. gestartetem Child kein fork mehr
anwenden , $pid ist dann nicht mehr definiert, das Programm bricht mit
folgender Fehlermeldung ab :
Fork-Error: Resource temporarily unavailable
Der Versuch über "sleep(1); " in der For-Schleife das ganze etwas
ruhiger angehen zu lassen ging ebenfalls schief ..
Habt ihr dafür eine Erklärung ?
Gruß, Ronny.
Re: Fork / Windows / Perl / Resource temporarily unavailable
am 08.12.2006 11:06:38 von Thomas Wittek
ronny.kluge@barmenia.de schrieb:
> Hallo zusammen,
>
> mit folgenden Zeilen hatte ich eigentlich vor 100 Childs auf einem W2K3
> System zu erstellen :
>
> ...
>
> Das Programm kann nach dem 63. gestartetem Child kein fork mehr
> anwenden , $pid ist dann nicht mehr definiert, das Programm bricht mit
> folgender Fehlermeldung ab :
>
> Fork-Error: Resource temporarily unavailable
Hast du mal den Speicherverbrauch des Prozesses beobachtet? Forking ist
afaik ziemlich speicherhungrig. Evtl. ists etwas zu viel für das System?
Alternativ finde ich es interessant, dass genau der 65. Prozess nicht
gestartet werden kann.
Vielleicht gibts ja ein internes Limit von 64 Prozessen.
--
Thomas Wittek
http://gedankenkonstrukt.de/
Jabber: streawkceur@jabber.i-pobox.net
Re: Fork / Windows / Perl / Resource temporarily unavailable
am 08.12.2006 19:05:05 von Wolf Behrenhoff
Thomas Wittek schrieb:
> ronny.kluge@barmenia.de schrieb:
>> Hallo zusammen,
>>
>> mit folgenden Zeilen hatte ich eigentlich vor 100 Childs auf einem W2K3
>> System zu erstellen :
>>
>> Das Programm kann nach dem 63. gestartetem Child kein fork mehr
>> anwenden , $pid ist dann nicht mehr definiert, das Programm bricht mit
>> folgender Fehlermeldung ab :
>>
>> Fork-Error: Resource temporarily unavailable
>
>
> Hast du mal den Speicherverbrauch des Prozesses beobachtet? Forking ist
> afaik ziemlich speicherhungrig. Evtl. ists etwas zu viel für das System?
>
> Alternativ finde ich es interessant, dass genau der 65. Prozess nicht
> gestartet werden kann.
> Vielleicht gibts ja ein internes Limit von 64 Prozessen.
>
Am Speicherhunger liegt es nicht. Das Script braucht etwa 2 MB, frei
sind 700 MB. Auch bei mir bricht es an derselben Stelle ab. Es scheint
also ein internes Limit zu sein. Die Frage ist nur, wo es herkommt.
Vielleicht durch die Art, wie fork für Windows implementiert ist? Oder
hat diese Art der Implementation vielleicht Grenzen von Windows
gesprengt? Aber komisch ist es eigentlich schon, denn die Kind-Prozesse
beenden sich ja sofort, sobald die die Zahl ausgegeben haben,
insbesondere, wenn man vor dem forken jeweils eine Sekunde wartet - und
selbst dann ich bei 63 Ende!
Aber eine völlig andere Frage: Wozu brauchst man so viele
Child-Prozesse? Und was passiert, wenn man threads verwendet? Ist nicht
fork irgendwie mit threads nachgebaut? Ich kenne da die Interna leider
nicht.
Wolf
Re: Fork / Windows / Perl / Resource temporarily unavailable
am 08.12.2006 21:52:52 von Slaven Rezic
Wolf Behrenhoff writes:
[...]
> Aber eine völlig andere Frage: Wozu brauchst man so viele
> Child-Prozesse? Und was passiert, wenn man threads verwendet? Ist nicht
> fork irgendwie mit threads nachgebaut? Ich kenne da die Interna leider
> nicht.
Ja, unter Windows wird mit fork() einfach ein neuer Interpreter-Thread
gestartet.
Gruß,
Slaven
--
Slaven Rezic - slaven rezic de
tkrevdiff - graphical display of diffs between revisions (RCS, CVS or SVN)
http://ptktools.sourceforge.net/#tkrevdiff
Re: Fork / Windows / Perl / Resource temporarily unavailable
am 08.12.2006 23:36:00 von MH
ronny.kluge@barmenia.de [ronny.kluge@barmenia.de] schrieb:
>Hallo zusammen,
>mit folgenden Zeilen hatte ich eigentlich vor 100 Childs auf einem W2K3
>System zu erstellen :
[...]
>Problem :
>Das Programm kann nach dem 63. gestartetem Child kein fork mehr
>anwenden , $pid ist dann nicht mehr definiert, das Programm bricht mit
>folgender Fehlermeldung ab :
>Fork-Error: Resource temporarily unavailable
>Der Versuch über "sleep(1); " in der For-Schleife das ganze etwas
>ruhiger angehen zu lassen ging ebenfalls schief ..
>Habt ihr dafür eine Erklärung ?
Ob das fuer Perl wirklich so gilt, weiss ich nicht, aber es sieht so
aus:
Intern wird da wohl ein WaitForMultipleObjects gemacht und der kann "by
design" nur gleichzeitig 63 "Kinderchen". Da du nie einen wait fuer
deine Kinder aufrufst, bleiben die 63 Kinder auch als "zombies" bestehen
und blocken die Ressourcen. Erst wenn du im Parent einen wait machst,
werden die abgeraeumt und die Ressourcen wieder frei.
>Gruß, Ronny.
Ciao.
Michael.
--=20
Michael Hirmke | Telefon +49 (911) 557999
Wilhelm-Spaeth-Strasse 52 | FAX +49 (911) 557664
90461 Nuernberg | E-Mail mailto:mh@mike.franken.de
| WWW http://www.hirmke.de/
Re: Fork / Windows / Perl / Resource temporarily unavailable
am 11.12.2006 20:41:27 von hjp-usenet2
On 2006-12-08 18:05, Wolf Behrenhoff wrote:
> Thomas Wittek schrieb:
>> ronny.kluge@barmenia.de schrieb:
>>> Hallo zusammen,
>>>
>>> mit folgenden Zeilen hatte ich eigentlich vor 100 Childs auf einem W2K3
>>> System zu erstellen :
>>>
>>> Das Programm kann nach dem 63. gestartetem Child kein fork mehr
>>> anwenden , $pid ist dann nicht mehr definiert, das Programm bricht mit
>>> folgender Fehlermeldung ab :
>>>
>>> Fork-Error: Resource temporarily unavailable
[...]
> Aber komisch ist es eigentlich schon, denn die Kind-Prozesse beenden
> sich ja sofort, sobald die die Zahl ausgegeben haben,
Das ist ein Irrtum. Zumindest unter Unix kann ein Prozess nicht
endgültig sterben, bevor sein Exitcode nicht vom Vaterprozess ausgelesen
wurde (mittels wait oder waitpid). Bis dahin existieren sie als
sogenannte Zombie-Prozesse: Der Prozess läuft zwar nicht mehr und hat
alle Resourcen (Memory, Filedescriptoren, etc.) freigegeben, belegt aber
immer noch einen Slot in der Prozesstabelle. Ich nehme an, dass für
Threads unter Windows ähnliches gilt. Deine Kindprozesse bestehen also
bis zum Tod ihres Vaterprozesses (danach werden sie vom System
eingesammelt).
hp
--
_ | Peter J. Holzer | > Wieso sollte man etwas erfinden was nicht
|_|_) | Sysadmin WSR | > ist?
| | | hjp@hjp.at | Was sonst wäre der Sinn des Erfindens?
__/ | http://www.hjp.at/ | -- P. Einstein u. V. Gringmuth in desd