lunes, 23 de junio de 2008

Out-of-Box Performance ("Out of the box")

Se trata, para mi, de uno de los asuntos más importantes en el mundo de las máquinas virtuales: que el rendimiento y escalabilidad de una plataforma Java "sin tunear" (o auto-tuneada) sea muy parecida a lo que podríamos conseguir tuneándolo específicamente para un tipo de sistema o para un benchmark concreto.

Y digo que es importantísimo por tres motivos:

  • No siempre tenemos el tiempo adecuado para tunear todos los sistemas en cualquier circunstancia, o no siempre tenemos el equipo de ingeniero de sistemas adecuado, o no siempre tienen el tiempo o disponibilidad necesaria para hacer esas labores de tuning fino.
  • Las posibilidades de parametrización en el arranque de la máquina virtual son casi infinitas, un infierno me atrevería a decir, y las probabilidades de empeorar alguno de los aspectos de una aplicación cuando mejoramos perceptiblemente otros son muy altas, en mi experiencia, y no siempre son inmediatas de cazar.
  • El mundo no es inmóvil ni inmutable, y las condiciones en que se ejecuta un sistema van evolucionando (en concurrencia, carga, usuarios, tamaños de ficheros intercambiados, sistemas con los que se integra, nuevos elementos de red, etc), por lo que con el tiempo pueden dejar de tener sentido decisiones iniciales. Este problema es serio: me he encontrado con situaciones en las que había opciones de lanzamiento "heredadas" o no cambiadas en 3 años y al cambiar de versión de JVM ha sido contraproducente y una penalización en escalabilidad respecto a no haber puesto casi nada.

En este aspecto, las implementaciones modernas tanto de Hotspot como de JRockit tienen mejoras sustanciales. Fue muy sonado el anuncio de Sun en cuanto al Out-of-box performance del Java SE 6, aunque Bea asegura que su equivalente tiene incluso mejores prestaciones "Out-of-box".

¿Qué significa esto? Que con especificar parámetros en cuanto a tamaños de heap y poco más (ayudando con "-server"/"-client" pero en JRockit ni eso, al igual que Hotspot en algunos S.O.), hoy en día es casi suficiente para el 80% de las necesidades de nuestras aplicaciones y servicios. En algunos benchmarks que yo he hecho en mis aplicaciones, contrastándolo con una configuración "supertuneada" específicamente, la diferencia es sólo de entre un 0% y un 10% tanto en rendimiento como en escalabilidad. Mola.

Y lo que digo para Java SE se aplica en casi todos los órdenes de esta vida tecnológica: sistemas operativos, BIOS, etc.

Unas pocas referencias:

No hay comentarios: