Contestaré esto dando una serie de mejores prácticas para tener en cuenta.
Elige el idioma correcto
Los lenguajes de script no necesitan aplicarse. Si bien se vuelven cada vez más rápidos cuando busca reducir milisegundos su tiempo de procesamiento, no puede tener la sobrecarga de un lenguaje interpretado. Además, querrá un modelo de memoria fuerte que permita la programación libre de bloqueos, por lo que realmente debería considerar Java, C ++ 11 o Go.
- Como ingeniero de software, ¿qué aprendiste en Google que te hubiera gustado saber desde el principio?
- ¿Cómo proporciona un gerente de producto especificaciones al equipo de ingeniería?
- ¿Qué programa debe tener cada programador en su conjunto de habilidades?
- Con (casi) todas las revistas de programación desaparecidas, ¿cuáles son algunas fuentes de información de calidad para leer para mantenerse al día con las tendencias y herramientas de desarrollo de software?
- ¿Cuánto cuestan los gerentes de proyectos / productos independientes para crear aplicaciones móviles?
Mantenlo todo en RAM
I / O matará su latencia, asegúrese de que todos sus datos estén en RAM. Esto podría significar simplemente usar en la memoria estructuras de datos con una forma de reconstruirlas en la máquina o reiniciar el proceso. También podría significar usar un almacén de datos en memoria como redis, memcache o voltdb. Finalmente, podría significar usar un almacén de datos basado en disco (MongoDB, MySQL, PosgreSQL, etc.) y ejecutarse en hardware donde hay significativamente más RAM que datos.
Mantenlo todo en un host
Los saltos de red son más rápidos que el disco, pero aun así agregarán mucha sobrecarga. Si es posible, mantenga todos los cálculos ubicados junto con los datos.
Mantenga el sistema infrautilizado
La baja latencia requiere tener siempre recursos para procesar la solicitud. No intente ejecutar al límite de lo que su hardware / software puede proporcionar. Siempre tenga mucho espacio para la cabeza y algo más.
Solo tantos hilos como núcleos y mantenga los hilos anclados a núcleos individuales
Querrá reducir los cambios de contexto no solo porque toman tiempo sino porque hará un uso ineficiente de su caché L1 / L2. Cuando tiene un subproceso por núcleo y está anclado a ese núcleo, aprovecha al máximo su caché L1 / L2. La memoria es un cuello de botella y el caché es la forma de evitarlo.
E / S secuencial por lotes
Esto suena contradictorio, pero en realidad tendrá una mejora significativa en el rendimiento si agrupa su E / S, ya que casi todas las E / S, desde redes hasta husillos, SSD e incluso RAM, funcionan mejor con lecturas y escrituras secuenciales más grandes en lugar de muchas pequeñas lecturas y escrituras aleatorias. En lugar de realizar un procesamiento por lotes basado en un tiempo arbitrario, puede tener un hilo en un bucle que realiza E / S que escribe tantos datos como han llegado mientras espera que regrese la escritura anterior. Esto lo convierte en un sistema muy rápido y adaptable.
No bloquear tanto como sea posible
Haz amigos sin bloqueo y espera estructuras de datos y algoritmos gratuitos. Cada vez que usa un bloqueo, debe bajar la pila al sistema operativo para mediar el bloqueo, que es una gran sobrecarga. A menudo, si sabe lo que está haciendo, puede sortear los bloqueos si comprende el modelo de memoria de JVM, C ++ 11 o Go.
Asíncrono tanto como sea posible
Cualquier procesamiento y particularmente cualquier E / S que no sea absolutamente necesario para construir la respuesta debe hacerse fuera del camino crítico de construir la respuesta.
Paralelo tanto como sea posible
Cualquier procesamiento y particularmente cualquier E / S que pueda ocurrir en paralelo debe hacerse en paralelo. Por ejemplo, si su estrategia de alta disponibilidad incluye registrar transacciones en el disco y enviar transacciones a un servidor secundario, esas acciones pueden ocurrir en paralelo. Tenga cuidado de adherirse a la regla asíncrona tanto como sea posible, así como a la regla de E / S secuencial por lotes cuando trabaje con E / S y mantenga el sistema infrautilizado y solo use tantos hilos como reglas de núcleos al paralelizar no E / S tratamiento.
Recursos
Casi todo esto proviene de seguir lo que LMAX está haciendo con su proyecto Disruptor. Lea sobre eso y siga todo lo que Martin Thompson hace.
- Disruptor por LMAX-Exchange
- La arquitectura LMAX
- Simpatía mecánica
- Mala concurrencia
- disruptor
- disruptor
Blogs adicionales
- Java es la nueva C
- Psicosomática, lobotomía, sierra
- Preshing en la programación
- Vainilla #Java
- Página en 1024cores
Shoutouts
Gracias a Cameron Purdy por el comentario a continuación.
Actualizar
He publicado una versión extendida y actualizada de esta respuesta aquí: http://codedependents.com/2014/0…