jueves, 15 de octubre de 2009

Because size matters

Porque digan lo que digan el tamaño importa, pero también es necesario saber usar ese tamaño, me dedico a hablaros de java. Hoy toca post tecnológico. He estado comiendo con ¿a que no sabéis quien? pues eso XD y me ha estado contando que tuvieron movida en el currele porque los servidores no hacían más que caérseles por que se quedaban sin memoria y empezaba a swapear eso que da gusto. Total, que empiezan a hacer un estudio de qué pasa.
Todos somos más o menos conscientes (bueno, todos es una exageración, pero si unos cuantos de nosotros) de que hay algo llamado memoria virtual, que es un kanteo, pero que requiere soporte hardware (MMU) y software (por parte del sistema operativo, tabla de paginas, y manejo de los fallos de pagina y seguro que algo mas que me olvido). El mecanismo se inventó hace largo, y en aquel entonces 16KB era un tamaño de pagina razonable. Cuando tu sistema tiene 16GB de memoria tienes 2^20 marcos de pagina, lo que es un jodido kanteo, y la tabla de paginas adquiere un tamaño demasiado grande, y dado que la tabla de paginas tiene que estar en RAM, no la puedes swapear, pues estas follado. Lo que se inventaron son las Huge Pages, porque tenerla grande mola, y si tu OS sabe usar sus enormes paginas, ya flipas. Así que lo que hicieron fue poner al arranque que se reservase una gran zona de memoria en huge pages para la javavm. Las huge pages nunca son swapeadas, asi que decidieron que se quedasen unos 300MB de ram fisica libre y el resto en hugepages. Ya que midieron cuanto ocupa el proceso de la JVM con sus librerias y todo eso, y estaba por debajo de 40MB asi que quedaban unos 260 MB para el resto de procesos. Dado que corren solo un linux sin X ni demasiadas cosas esto es mas que de sobra.
El caso es que se dieron cuenta de que el sistema necesitaba 400MB de más, que podrían haberlos puesto y a tirar, pero como somos científicos, primero queremos saber qué coño pasa, así que a ello fueron, y resulta que cuando lanzas la jvm le especificas el tamaño del texto y el del heap, que son regiones separadas y le puedes indicar que lo ponga en las hugepages. ¿Qué pasaba pues? Pues que el inútil del java ponía las pilas (stacks) de los threads en memoria "normal" quicir, fuera de las huge pages, por lo que si tenemos 400 threads, a 1 MB de pila por cada uno tenemos los 400MB de más que necesitaban
Total, algo que ya sabemos todos, java no mola. Si alguna vez experimentáis que java requiere más memoria de la planeada, acordaros de mi, de Robin y de las pilas XD

Saludos!

1 comentario: