2009-01-21 23 views
6

Estoy usando mod perl 1.3.0 con apache 1.3.41 perl versión 5.8.6, y el tamaño de la memoria parece crecer aproximadamente 4k cada 3 o 4 solicitudes. El script Perl que se están ejecutando es simplemente:¿Cómo rastrear una fuga de memoria mod_perl?

print "Content-type: text/html\n\n"; print "baby"; 

Sin embargo, ese proceso de apache solo crece y crece cuando SLAM con referencia Apache. Estamos golpeando con:

ab -n 100000 -c 1 http://localhost/search/search.cgi &> /dev/null 

y vemos como el tamaño proceso crece desde aproximadamente 4 megabytes a 24 después de cerca de 20.000 solicitudes.

Respondiendo a la pregunta a continuación: Estamos haciendo esto en redhat enterprise 4.7. Se ha señalado así porque tocamos un archivo estático o una solicitud de CGI y la memoria no crece. Cuando usamos un PerlHandler Apache :: Registry o PerlRun, o simplemente apuntemos el PerlHandler a algún código que sea un manejador, entonces todos tienen fugas.

¿Alguien ha visto algo como esto, o sabe qué está pasando?

EDITAR:

Gracias por las respuestas chicos. He usado Devel :: Cycle y encontré una filtración, pero el problema aquí es que hemos desmantelado nuestro código para imprimir el encabezado y una declaración. No hay forma de que la función de impresión en Perl gotee (espero ...). La sección de pérdida de memoria en Practical Modperl he leído, pero se trata de problemas de codificación, y de nuevo a menos que haya un problema con la función de impresión de Perl, no es el código.

+0

Puede considerar formular esto en una pregunta concreta. :) – sharkin

+0

También podría considerar enviar un informe de error a la gente de Apache. –

+0

¿Puede por favor publicar los detalles del sistema operativo en el que está trabajando? ¿También ha intentado dejar que el proceso continúe hasta que alcanza el límite de memoria y tiene que reiniciar su servidor? Básicamente lo que quiero saber es ¿cómo has señalado que se trata de una pérdida de memoria con este módulo solamente? –

Respuesta

1

Si es posible, ejecute su código con Devel :: Cycle. Lo más probable es que tenga una pérdida de memoria en algún lugar en su código, no específicamente en mod_perl.

Una vez que haya localizado la (s) fuga (s) de memoria - puede haber varias - corrígelas.

3

Ya que está listo para imprimir, ¿está seguro de que no está cargando ningún otro módulo? Puede haber una fuga en el código de otra persona que está cargando.

¿Qué se obtiene cuando se ejecuta este:

package My::Handler; 

use strict; 
use warnings 'all'; 
use Data::Dumper; 

sub handler : method { 
    my ($class, $r) = @_; 

    print "content-type: text/html\n\n<plaintext>"; 
    print Dumper(\%INC); 
} 

1;# return true: 
0
$VAR1 = { 
    'XSLoader.pm' => '/usr/local/lib/perl5/5.8.6/i686-linux/XSLoader.pm', 
    'mod_perl.pm' => '/usr/local/lib/perl5/site_perl/5.8.6/i686-linux/mod_perl.pm', 
    'warnings/register.pm' => '/usr/local/lib/perl5/5.8.6/warnings/register.pm', 
    'Apache/DBI.pm' => '/usr/local/lib/perl5/site_perl/5.8.6/Apache/DBI.pm', 
    'List/Util.pm' => '/usr/local/lib/perl5/5.8.6/i686-linux/List/Util.pm', 
    'Test.pm' => '/home/jodonnell/fashion_2009//Test.pm', 
    'Apache/Server.pm' => '/usr/local/lib/perl5/site_perl/5.8.6/i686-linux/Apache/Server.pm', 
    'warnings.pm' => '/usr/local/lib/perl5/5.8.6/warnings.pm', 
    'DBI.pm' => '/usr/local/lib/perl5/site_perl/5.8.6/i686-linux/DBI.pm', 
    'Config.pm' => '/usr/local/lib/perl5/5.8.6/i686-linux/Config.pm', 
    'bytes.pm' => '/usr/local/lib/perl5/5.8.6/bytes.pm', 
    'Carp.pm' => '/usr/local/lib/perl5/5.8.6/Carp.pm', 
    'Exporter/Heavy.pm' => '/usr/local/lib/perl5/5.8.6/Exporter/Heavy.pm', 
    'Scalar/Util.pm' => '/usr/local/lib/perl5/5.8.6/i686-linux/Scalar/Util.pm', 
    'vars.pm' => '/usr/local/lib/perl5/5.8.6/vars.pm', 
    'Exporter.pm' => '/usr/local/lib/perl5/5.8.6/Exporter.pm', 
    'strict.pm' => '/usr/local/lib/perl5/5.8.6/strict.pm', 
    'Apache.pm' => '/usr/local/lib/perl5/site_perl/5.8.6/i686-linux/Apache.pm', 
    'constant.pm' => '/usr/local/lib/perl5/5.8.6/constant.pm', 
    'overload.pm' => '/usr/local/lib/perl5/5.8.6/overload.pm', 
    'AutoLoader.pm' => '/usr/local/lib/perl5/5.8.6/AutoLoader.pm', 
    'Apache/Constants.pm' => '/usr/local/lib/perl5/site_perl/5.8.6/i686-linux/Apache/Constants.pm', 
    'Apache/Constants/Exports.pm' => '/usr/local/lib/perl5/site_perl/5.8.6/i686-linux/Apache/Constants/Exports.pm', 
    'Apache/Connection.pm' => '/usr/local/lib/perl5/site_perl/5.8.6/i686-linux/Apache/Connection.pm', 
    'DynaLoader.pm' => '/usr/local/lib/perl5/5.8.6/i686-linux/DynaLoader.pm', 
    'Data/Dumper.pm' => '/usr/local/lib/perl5/5.8.6/i686-linux/Data/Dumper.pm' 
}; 

Parece que a mí estas cosas son todos cargados por Apache.

+0

Compruebe su httpd.conf. Algo está cargando Apache :: DBI y DBI. ¿Hay algún otro código de ejecución del que no estés enterado? – JDrago

+0

Además, edite su respuesta para que el texto se encuentre en varias líneas. – JDrago

+0

he comprobado el http conf bastante bien y he intentado eliminar todo unneseccary, pero revertí mis cambios por lo que no se refleja aquí. No pude descifrar cómo hacerlo en varias líneas, intentaré de nuevo – jacob