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
¿Es posible ejecutar el proceso en [Devel :: NYTProf] (http://search.cpan.org/perldoc?Devel::NYTProf)? –
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. –