En el trabajo, una de nuestras plataformas de destino es un mini servidor con recursos limitados que ejecuta Linux (núcleo 2.6.13, distribución personalizada basada en un viejo núcleo de Fedora). La aplicación está escrita en Java (Sun JDK 1.6_04). El asesino OOM de Linux está configurado para matar procesos cuando el uso de memoria excede los 160MB. Incluso durante cargas elevadas, nuestra aplicación nunca supera los 120 MB y junto con algunos otros procesos nativos que están activos, nos mantenemos dentro del límite de OOM.¿De qué versión de Linux kernel/libc es Java Runtime.exec() seguro con respecto a la memoria?
Sin embargo, resulta que el método Java Runtime.getRuntime(). Exec(), la forma canónica de ejecutar procesos externos desde Java, tiene un particularly unfortunate implementation on Linux que hace que los procesos secundarios generados (temporalmente) requieran la misma cantidad de memoria como el proceso principal ya que el espacio de direcciones se copia. El resultado neto es que nuestra aplicación es asesinada por el asesino OOM en cuanto hacemos Runtime.getRuntime(). Exec().
Actualmente trabajamos en esto teniendo un programa nativo separado para ejecutar todos los comandos externos y nos comunicamos con ese programa a través de un socket. Esto es menos que óptimo.
Después de posting about this problem online obtuve algunos comentarios que indican que esto no debería ocurrir en versiones "más nuevas" de Linux ya que implementan el método posix fork() usando copy-on-write, lo que significa que solo copiará las páginas que necesita modifique cuando se requiera en lugar de todo el espacio de direcciones inmediatamente.
Mis preguntas son:
- Es esto cierto?
- ¿Esto es algo en el núcleo, la implementación de libc o en otro lugar completamente?
- ¿De qué versión de kernel/libc/whatever está disponible copy-on-write para fork()?
Es memoria * virtual *, no * física * que se necesita entre la llamada fork() y la siguiente ejecución(). Dudo mucho que se esté quedando sin memoria virtual, dado el tamaño del espacio de direcciones en comparación con su límite de memoria física. –
Absolutamente, no nos estamos quedando sin memoria física, pero una parte de Linux parece pensar que sí. –