2010-09-05 11 views
9

Estoy tratando de probar una condición específica que solo ocurrirá si perl tiene un malloc que falla debido a que no queda memoria. Me gustaría que perl muera lo más rápido posible. Me imaginé la forma de ayuno sería crear algunos grandes arreglos como¿Cuál es una buena manera de forzar a Perl 5 a quedarse sin memoria rápidamente en OS X?

perl -le '$_->[100_000_000_000] = 1 for \(@a, @b, @c, @d); <>'

Pero tuve que matarla después de mi intercambio golpeó 5 concierto con señales de detenerse (Estoy en OS X 10.6).

acabo probado en Linux y muere muy rápido:

time perl -le '$_->[1_000_000_000] = 1 for \(@a, @b, @c, @d); <>' 
Out of memory! 

real 0m0.023s 
user 0m0.012s 
sys  0m0.008s 

Así que el problema parece ser OS X y su dynamic_pager.

acabo intentado desactivar el dynamic_pager con

sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.dynamic_pager.plist 

y reiniciar, pero la máquina sólo se bloquea por completo. Mi próximo intento será cambiar el archivo de configuración com.apple.dynamic_pager.plist para escribir los archivos vm en una partición muy pequeña.

+1

Extraño que no has '" x "x 9e9'. – tsee

+0

@tsee Lleva tiempo construir la cadena, pero 'perl -e '@a [9e8] = 1'' es efectivamente un' malloc'. –

+0

"Tuve que matarlo después de que mi intercambio tocara 5 gigas sin signos de parar (estoy en OS X 10.6)". - Mac OS X muestra ese tipo de comportamiento a menudo, incluidos los casos como 'malloc (-1)'. Pruebe con cualquier otro sistema operativo donde pueda desactivar explícitamente el intercambio. (Nunca intenté hacer eso en mi Mac, pero de manera casual en Linux.) – Dummy00001

Respuesta

5

En una pregunta anterior "How to simulate memory allocation errors", el usuario freespace sugirió el uso de ulimit con una cuenta de usuario de prueba para limitar la cantidad de memoria que podría ser utilizado. Esto puede hacer lo que quiera sin tener que asignar grandes cantidades de memoria.

+0

Eso no parece funcionar en OS X. Intenté 'ulimit -m 64; perl -e '$ s = "x" x (1024 * 1024 * 100); <> '' y comprobó el uso de memoria y el programa Perl poseía doscientos megabytes. –

+1

IIRC debe ser 'ulimit -d', no' -m'. – Dummy00001

Cuestiones relacionadas