¿Cuáles son los costos de ejecutar aplicaciones web Java basadas en Java / Tomcat en la nube en comparación con otros lenguajes / plataformas como los frameworks Ruby / RoR o PHP / PHP?

Si está buscando un rendimiento puro del servidor, los idiomas interpretados y dinámicos funcionan mucho mejor que los idiomas con su propia administración de memoria, si está ejecutando cualquier carga de trabajo de múltiples inquilinos en la nube; Esa es una respuesta compleja, así que déjame explicarte.

Las aplicaciones web Java / JVM solían funcionar bien cuando se ejecutaban en metal desnudo. Una vez que comienza a ejecutar aplicaciones en la nube pública, esencialmente se está ejecutando sobre un hipervisor (Xen para Amazon / VMware en otros lugares). El problema con los hipervisores es que toman la gestión de la memoria en sus propias manos para que las máquinas virtuales se ejecuten encima de ellos: los globos de memoria, la compresión de páginas, etc., son técnicas utilizadas por Hypervisor para ejecutar efectivamente las máquinas virtuales sobre HYpervisor. Ahora, si esta VM tiene una JVM, entonces JVM también tiene varios mecanismos para administrar su montón (mecanismos de marca y barrido GC); JVM e Hypervisor generalmente no funcionan bien juntos y causan políticas de reserva de memoria en conflicto en un servidor altamente cargado: la JVM intenta cargar todas las páginas para marcar las del GC, mientras que el Hypervisor podría haber vaciado las páginas para asignarlas a otro VM.

Esto da como resultado un bloqueo de la aplicación y un bajo rendimiento. Netflix tuvo la misma experiencia con instancias EC2 pequeñas / micro, debido a que migraron a instancias EC2 muy grandes en las que están casi garantizados que son la única VM en la parte superior del metal desnudo. Esto les permite escapar de CapEX, mientras les da un control completo sobre la máquina.

VMware ha comenzado un proyecto Elastic Memory for Java (EM4J) por la misma razón.

De hecho, todas las bases de datos sobre VM tienen un 10% menos de rendimiento que en metal desnudo.

En pocas palabras, use Java cuando pueda estar seguro de que cuando JVM requiere 4GB, realmente tiene 4GB. Cualquier entorno que haga que la JVM piense que tiene 4 GB, cuando realmente solo tiene 2 GB debajo, causará problemas de rendimiento de la aplicación.

Creo que es importante entender que cuando se miran los costos de desarrollo de software, los costos de infraestructura generalmente no son grandes en comparación con los costos de desarrollo de escribir y mantener el código. Por lo tanto, desde una perspectiva de costos, probablemente debería seleccionar el idioma en el que los desarrolladores tienen más experiencia.

Si los costos de infraestructura lo muerden por alguna razón, es casi seguro que no se deba a su elección de lenguaje / plataforma, sino a su elección de arquitectura o algoritmos. Los buenos desarrolladores intentan evitar hacer cosas obviamente locas y luego usan herramientas para analizar los cuellos de botella de rendimiento y mejorar el rendimiento más tarde, según sea necesario, porque el costo de desarrollo es muy alto y los desarrolladores son tan malos para adivinar qué bits de código para optimizar generalmente es aconsejable no demasiado optimizado demasiado temprano.

Para el 99.9% de los casos, esas son las únicas cosas por las que debe preocuparse. Sin embargo, en aras de dar una respuesta más completa, Java * puede * tener un requisito de memoria mínimo un poco más grande para ejecutarse sin problemas, pero probablemente tiene un tiempo de ejecución optimizado mejor (las optimizaciones Justo a tiempo del compilador y el tiempo de ejecución han acumulado un gran $$$ en ellos ) y el modelo de subprocesos es bastante eficiente en la mayoría de las plataformas. Pero para la mayoría de los casos, todo esto es irrelevante y desea utilizar cualquier plataforma / lenguaje con el que sus desarrolladores tengan experiencia o entusiasmo.