
En este artículo, quiero hablar en una forma científica popular sobre la optimización del tiempo de respuesta en las plataformas comerciales de bolsas y bancos (HFT). Como referencia, estamos hablando de tiempos de cientos de nanosegundos a cientos de microsegundos. Para la mayoría de las otras aplicaciones, muchos de los métodos de optimización a continuación son irrelevantes simplemente porque no existen requisitos tan estrictos.
Por lo general, consideramos el rendimiento en unidades de ancho de banda. Por ejemplo en Gigaflops. La tarea de optimización en tales casos se reduce a realizar la cantidad máxima de cálculos por unidad de tiempo o resolver el problema en el tiempo mínimo. El diseño del procesador está diseñado principalmente para lograr el número máximo de cálculos por unidad de tiempo y técnicas de optimización estándar para el mismo.
Sin embargo, hay aplicaciones en las que el tiempo de respuesta es más importante, por ejemplo, plataformas de negociación en el comercio de computadoras (HFT), motores de búsqueda, robótica y telecomunicaciones. El tiempo de respuesta es el tiempo de ejecución de una operación "única" de este tipo, por ejemplo, desde la recepción de un paquete con cotizaciones actuales del intercambio hasta el envío de la orden para la operación de intercambio. De hecho, el tiempo de respuesta y el rendimiento (el número de operaciones de este tipo por unidad de tiempo) están estrechamente relacionados, pero la diferencia es fundamental. A menudo es posible aumentar el rendimiento simplemente agregando hardware (más servidores), pero mejorar el tiempo de respuesta de esta manera es problemático (excepto en casos de cargas máximas).
Se utilizan varias técnicas excelentes para optimizar el tiempo de respuesta. Algunos mejoran tanto el tiempo de respuesta como el rendimiento al mismo tiempo, otros mejoran uno a expensas del otro. Por ejemplo, para mejorar el rendimiento, el almacenamiento en búfer es típico para procesar una matriz de paquetes a la vez. Obviamente, para el tiempo de respuesta a un solo paquete, este enfoque es perjudicial.
En las plataformas de negociación, la estabilidad del tiempo de respuesta también es muy importante. La mayoría de las ganancias y pérdidas ocurren durante los movimientos bruscos de los mercados, acompañados de una actividad anormalmente alta. La plataforma debe soportar tales cargas. Cualquier enchufe puede causar pérdidas tangibles.
En general, una optimización de tiempo de respuesta de tan bajo nivel es un tema complejo que requiere una buena comprensión de la pila de red, el núcleo del sistema operativo, el rendimiento del procesador y la plataforma, y la sincronización eficiente de subprocesos. Mi tarea es explicar todas estas cosas complejas con un ejemplo simple y comprensible.
Trabajo de oficina
Usemos la siguiente analogía. Imagine un grupo de personas trabajando en una oficina. Las comunicaciones se producen mediante el intercambio de mensajes en papel (cartas). Cada carta contiene el destinatario, el remitente y la tarea. Las cartas se colocan en ciertas mesas de la oficina. Hay empleados cuya tarea es recibir cartas del mundo exterior y ponerlas en las mesas. Otros recogen cartas de las mesas y las pasan a los que toman las decisiones. Cada tomador de decisiones trabaja solo con un cierto tipo de letras (o tareas).
El tomador de decisiones lee las cartas destinadas a él y decide si esta tarea se completará, pospondrá o ignorará. Las tareas para la ejecución se apilan en una tabla separada. Los trabajadores especiales recogen cartas de esta mesa y las distribuyen a los artistas. Algunas cartas deben ser respondidas fuera de la oficina, por ejemplo, enviar confirmación al remitente externo.
Para estar más cerca de la realidad, compliquemos un poco más las condiciones. Por ejemplo, una oficina es una red compleja de habitaciones y pasillos, y diferentes tipos de trabajadores solo pueden ir a ciertos lugares donde tienen acceso. Como dicen los matemáticos, sin pérdida de generalidad, supongamos que nuestra oficina, en condiciones normales, procesa 200 mensajes por día con un tiempo promedio de procesamiento de mensajes de 5 minutos.
Entonces, nuestra tarea es minimizar el tiempo de procesamiento de mensajes. En este caso, es deseable que el tiempo máximo de procesamiento no exceda el promedio más de, digamos, dos veces. Es decir, los estallidos de actividad deben manejarse de manera efectiva.
Entonces, ¿por dónde empezamos? La forma más fácil de contratar más empleados es procesar más mensajes. Es bueno buscar trabajadores rápidos, luego se reducirá el tiempo de procesamiento. Digamos que contratamos a Usain Bolt y a los otros finalistas olímpicos. Quizás el tiempo de procesamiento ha disminuido a 2 minutos. Pero es obvio que no hay ningún lugar para avanzar más en esta dirección. Nadie corre más rápido. Se alcanza el límite. Al comparar estos enfoques con una computadora, la contratación de personas está comprando hardware adicional (servidores, procesadores, núcleos) para aumentar el número de subprocesos de ejecución. Contratar atletas es similar a comprar el hierro más rápido (frecuencia máxima en primer lugar).
Quizás el diseño de nuestra oficina no sea óptimo. Se debe proporcionar suficiente espacio para que los trabajadores trabajen eficientemente. ¿Quizás ampliar los pasillos, de lo contrario la gente tiene que ceder el uno al otro, perdiendo un tiempo precioso? Vamos a expandirnos. También aumentemos ligeramente las salas para que las personas no se amontonen al acercarse a las mesas. Es como comprar un servidor con más núcleos y más memoria y ancho de banda de E / S.
Además, podemos cambiar al servicio express en lugar del correo regular para intercambiar mensajes con el mundo exterior. En términos informáticos, esto es similar a seleccionar y optimizar el equipo de red y la pila de red del sistema operativo. Todo esto es un costo adicional, pero suponemos que definitivamente valdrá la pena.
Entonces, después de las innovaciones, nuestro tiempo de procesamiento de mensajes cayó a, digamos, un minuto. Los trabajadores también pueden recibir capacitación para mejorar el proceso de comunicación y ejecución. Quizás esto le dará un 15 por ciento con la motivación correcta. Él sabe que llegamos a 51 segundos. Esto es similar a la optimización de software.
El siguiente paso es tratar de evitar colisiones entre nuestros trabajadores en rápido movimiento. El cuello de botella probable es el enfoque de las tablas. Es aconsejable que los trabajadores tengan acceso instantáneo y simultáneo a los escritorios que necesitan. Puede ordenar los mensajes en las tablas al colocarlos (ponerlos en carpetas separadas) para acelerar el acceso. Los mensajes también pueden tener diferentes prioridades. En el programa, este es un análogo de sincronización de subprocesos. Las transmisiones deben tener acceso ilimitado paralelo y máximo a los datos. La solución de problemas de sincronización de subprocesos a menudo aumenta enormemente el rendimiento del sistema y ayuda a mejorar los tiempos de respuesta. En el sentido de procesar ráfagas de actividad, la influencia de un algoritmo de sincronización óptimo es generalmente difícil de sobreestimar.
Además, los trabajadores a veces pueden encontrarse frente a una puerta cerrada. Otros problemas menores de esta naturaleza pueden causar inconvenientes y retrasos. Es aconsejable cumplir con las siguientes condiciones: el número de personas en un edificio dado nunca excede su capacidad, la velocidad de los trabajadores es ilimitada, no se toman medidas que no estén relacionadas con el trabajo principal, y nadie externo ingresa al proceso de trabajo. En términos informáticos, esto significa que el número de subprocesos nunca excede el número de núcleos disponibles, la plataforma está configurada para una frecuencia / rendimiento máximos, los modos económicos están apagados, el modo Turbo está encendido y el núcleo del sistema operativo y otras aplicaciones está aislado y (casi) no afecta a la plataforma de negociación.
Ahora es el momento de considerar aún más cuidadosamente las condiciones en la oficina. ¿Las puertas se abren fácilmente? ¿Se resbala el piso? Esto es casi lo mismo que analizar las interacciones con el sistema operativo. Si no hay nada que mejorar, puede intentar evitar el uso de ciertas partes. Por ejemplo, en lugar de entregar cartas a través de la oficina, ¿por qué no intentar tirarlas de una ventana a otra? ¿Dices incómodo? Puede ser incómodo, pero rápido. Esto es similar al uso del enfoque de derivación del núcleo en la pila de red.
En lugar de utilizar la pila de red del sistema operativo, el bypass del núcleo ejecuta la pila de red en el espacio del usuario. Esto ayuda a deshacerse de la copia innecesaria de datos entre el sistema y la pila de usuarios y el retraso en la ejecución del flujo de recepción de mensajes. En el bypass del kernel, la secuencia de recepción generalmente espera activamente. No se sienta en el bloqueo del sistema operativo, sino que verifica continuamente la variable de bloqueo hasta que le da permiso para ejecutar.
De hecho, si comenzamos a lanzar mensajes a través de las ventanas, hagámoslo de manera eficiente. La opción más confiable es pasar por la ventana de mano en mano. Este principio se usa en el protocolo TCP. Esta no es la opción más rápida. UDP le permite simplemente dejar caer un mensaje sin confirmación. Es mas rapido. Nadie está obligado a esperar. ¿Crees que este es el límite? No, aún puede aprender a tirar por la ventana para que la letra caiga directamente en la tabla deseada y en la carpeta deseada. Este enfoque se denomina acceso directo a memoria remota (RDMA). Creo que redujimos el tiempo de procesamiento de segundos a 35.
¿O tal vez construir una oficina desde cero en lugar de adaptar la existente a nuestras necesidades? Tal que proporcione condiciones de trabajo ideales. Quizás esto mejorará el tiempo de respuesta de segundos a 20, o incluso menos. El diseño de la propia oficina es el uso de la matriz de compuerta programable de campo (FPGA). FPGA es algo así como un procesador cuyo hardware está programado para resolver un problema específico. Un procesador normal está codificado para ejecutar un conjunto específico de instrucciones sobre ciertos tipos de datos y el hilo de ejecución (que no debe confundirse con el hilo de la aplicación) también es fijo. A diferencia del procesador, los FPGA no están preprogramados para un conjunto de instrucciones, tipos de datos y flujo de ejecución. Están programados para una tarea específica y en este estado solo pueden ejecutarla (hasta la reprogramación posterior). La programación efectiva de FPGA no es una tarea fácil. Hacer cambios en el programa también puede requerir mucho esfuerzo. Y aunque FPGA no implica contratar a Usain Bolt (las frecuencias son mucho más bajas que las del procesador), pero el paralelismo ilimitado de la ejecución de la instrucción permite lograr tiempos de procesamiento de mensajes más bajos que en el procesador.
Bueno, en conclusión, recomendaré herramientas de análisis de rendimiento para software. El amplificador Intel VTuneTM y la tecnología Intel Processor Trace lo ayudan a ver en detalle dónde y por qué se pierde el tiempo de CPU.
Si está interesado en el tema, puede leer mis artículos sobre Intel Developer Zone (en inglés), que también proporciona consejos técnicos prácticos para optimizar el tiempo de respuesta.
- https://software.intel.com/en-us/articles/optimizing-computer-applications-for-latency-part-1-configuring-the-hardware
- https://software.intel.com/en-us/articles/optimizing-computer-applications-for-latency-part-2-tuning-applications