Thread Enorme Speicherauslastung
(11 answers)
Opened by Knochen at 2011-01-25 10:47
Der eine, der nur faul im Speicher rumliegt, überwacht den anderen. Beendet sich dieser aus Versehen, wird ein neuer Prozess gestartet.
Zu modperl mit einem threaded MPM ist viel geschrieben worden. Fazit, Du brauchst VIEL RAM. Der Grund: modperl verwaltet einen Pool von Perl-Interpretern. In deinem Worker-Prozess läuft also nicht nur ein Perl sondern mehrere. Jeder Perl Interpreter lädt und kompiliert nun alle Module, die Deine Programme benötigen. Kompilierter Perl Code ist groß. Unter Linux kannst Du das ganz gut mit Linux::Smaps messen. Als Beispiel-Code eignet sich CGI.pm. Das kompiliert die meisten Funktionen nämlich on-demand. Auf meinem aktuellen System ergibt das folgendes: Code (perl): (dl
)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 $ perl -MLinux::Smaps -Mstrict -le ' my $s=Linux::Smaps->new; my $p; sub p { $s->update; my $c=$s->private_dirty+$s->private_clean; print $_[0], ": ", $c-$p; $p=$c; } p "start"; p "start2"; require CGI; p "required"; CGI->compile(":all"); p "compiled"; p "end" ' start: 1296 start2: 8 required: 1036 compiled: 2240 end: 0 Die Angaben sind in Kilobytes. Nach dem Start belegt der Perl Prozess also fast 1.3 MB. Für die erste Ausgabe kommen nochmal 8 kB dazu. Das Einbinden des CGI Moduls braucht ca. 1 MB, der kompilierte Code jedoch 2.2 MB. Nun multipliziere ein wenig und schon kommen Dir Deine Zahlen realistischer vor. |