2011-06-14 9 views
5

tl; dr: Cómo volcar un seguimiento de pila perl cuando un proceso httpd de Perl se queda sin memoria.Obtención de seguimiento de pila de Perl Error "Memoria insuficiente"

Tenemos un servidor mod_perl 2, Perl 5.8.8, RHEL 5.6, Linux 2.6.18.

Muy ocasionalmente e impredeciblemente, un proceso httpd infantil comienza a consumir toda la memoria disponible a un ritmo alarmante. Al menos hemos usado BSD :: Resource :: setrlimit (RLIMIT_VMEM, ...), de modo que el proceso muera con "Sin memoria" antes de cerrar el servidor.

No sabemos en qué parte del código está pasando esto, y es difícil reproducirlo sin horas de pruebas de carga.

Lo que realmente nos gustaría es una forma de obtener Perl stack trace justo antes de que el proceso se quede sin memoria, por lo que sabemos qué código está causando esto. Desafortunadamente, "Sin memoria" es untrappable error.

Estas son las opciones que estoy considerando, cada uno con sus inconvenientes:

1) utilizar el $^M emergency memory pool. Requiere que recompilemos perl con -DPERL_EMERGENCY_SBRK y -Dusemymalloc.

2) Escriba toneladas de instrucciones de registro, luego analice los registros para ver dónde se detiene el proceso.

3) Escriba un script externo que escanea constantemente el grupo de procesos httpd, y si ve que usa mucha memoria, envía una señal USR2 (que hemos arreglado para volcar un seguimiento de la pila).

4) De alguna manera haga que el proceso supervise su propia memoria de forma continua, y descargue un seguimiento de la pila cuando la memoria se vuelve alta pero antes del error de "Memoria insuficiente".

Gracias!

Jon

+0

¿Es posible ejecutar el proceso en [Devel :: NYTProf] (http://search.cpan.org/perldoc?Devel::NYTProf)? –

+0

Como dije, el problema ocurre muy raramente, digamos después de una hora de pruebas de carga, por lo que tendríamos que recopilar una gran cantidad de datos si ejecutamos perfiles o registros intensos. También sería bueno tener una solución que funcionaría en producción, donde obviamente no podemos ejecutar Devel :: NYTProf. –

Respuesta

2

Usted podría intentar usar LD_PRELOAD para cargar una versión personalizada de malloc/libre. No debería ser necesario volver a vincular o recompilar nada. Simplemente configure LD_PRELOAD para que tenga un .so que tenga la misma interfaz que malloc, y esta versión precargada de malloc se cargará en lugar del malloc del sistema normal cuando ejecute el ejecutable. Por ejemplo, esta es una estrategia común para detectar errores de memoria con efence.

No creo que efence te funcione aquí, ya que es para detectar sobreescrituras de memoria, no para eliminar errores de memoria (no sé lo que hace en OOM). Creo que es posible que desee consultar failmalloc. Nunca he usado este, pero parece que podría hacer lo que quieras (solo pasé por la página principal).

+0

Interesante. Entonces teóricamente podría crear un gancho malloc (http://www.gnu.org/s/hello/manual/libc/Hooks-for-Malloc.html) que llama malloc, y si ocurre un OOM, 1) levantar el límite VMEM suave 2) volver a llamar a malloc con los mismos argumentos (que ahora debería tener éxito con el límite superior) 3) obtener el proceso para volcar un seguimiento de la pila Perl (por ejemplo, al enviarse un SIGUSR2) –

3

Puede obtener una traza inversa con mod_backtrace, consulte Andy Millar's introduction. La traza está en el nivel C, así que o bien necesita

  • un poco de Perl partes internas conocimiento para inferir el Perl pila con sólo mirar la traza o
  • ejecutar gdb, establece un punto de interrupción en la función crashy y examine la pila Perl y las variables léxicas con las macros gdb del libro mod_perl.
+0

Gracias. ¿Hay realmente suficiente información en un rastreo de nivel C para determinar dónde estamos en la pila de Perl, no solo la línea de código en la que estábamos pero las personas que llaman, etc.? –

+0

Jonathan: Hay, en alguna parte, pero no es necesariamente fácil ni público. Podrías usar call_sv/etc (ver perlcall) para volver a llamar a Perl para hacer un Carp :: cluck de tus restricciones de memoria para eso. – tsee

Cuestiones relacionadas