c++ sockets boost amazon-ec2 boost-asio

c++ - El diseño de zócalo/rosca de servidor de alto rendimiento más eficiente



sockets boost (2)

Estoy creando una pieza de software empresarial de alto rendimiento, que recibirá, manejará y responderá a más de 50,000 solicitudes de TCP por segundo. Esto se extenderá a varios servidores de Amazon EC2, pero me gustaría tener un solo servidor capaz de manejar tantos miles de solicitudes por segundo como sea posible (disparando a 5k / seg). Lo más probable es que esté usando la instancia m1.xlarge que ejecuta Amazon Linux.

Estoy creando este software en C ++ con Boost ASIO, y estoy tratando de descubrir la forma más eficiente de diseñar el manejo de socket. En los ejemplos ( http://www.boost.org/doc/libs/1_53_0/doc/html/boost_asio/examples.html ) me inclino hacia la emulación del "Servidor HTTP 2" ya que tendremos múltiples vCPU para empleado.

Alguien podría realmente describir las ventajas y desventajas de cada ejemplo de servidor HTTP allí, y al lidiar con esta cantidad de conexiones, realmente apreciaría cualquier información adicional (con respecto a los sockets Boost y / o la configuración EC2 de alto rendimiento).

¡Muchas gracias!


Algunas sugerencias:

No mencionaste lo que tu servidor va a hacer. ¿Se aceptarán y cerrarán 50 mil nuevas solicitudes por segundo o solo se atenderán los mensajes (solicitudes) de las conexiones TCP establecidas? Así que mi consejo podría tener que ser un poco genérico.

  1. Lea el problema de C10K: http://www.kegel.com/c10k.html

  2. Invierta en usar epoll como la solución de notificación de socket en lugar de ASIO. Epoll no es difícil.

  3. Considere utilizar un número fijo de hilos (2-8). O bien, la carga equilibra las conexiones de socket a través de estos subprocesos, o simplemente usa un grupo de trabajo de subprocesos para atender los mensajes de solicitud analizados fuera del hilo de socket. Diseñe para múltiples hilos, pero comience solo con 1 hilo. Luego resuelve todos los problemas de rendimiento. Una vez que consiga que la solución de un solo subproceso funcione bien y el rendimiento se encuentre en su punto máximo, considere aumentar el número de subprocesos de modo que se puedan procesar múltiples operaciones mientras que otros subprocesos están bloqueados.

  4. Es muy probable que los problemas de rendimiento de su servidor queden fuera del diseño del zócalo. Evalúe y ejecute continuamente herramientas como valgrind para comprender dónde pasa el código la mayor parte del tiempo. Las posibilidades son altas, es donde menos te lo esperas. Por ejemplo, en mi servidor, encontré que la mayor parte del tiempo se dedicaba a asignar y liberar memoria para búferes de temperatura pequeña. Nunca lo hubiera adivinado. Luego cambié el diseño del servidor para asignar la memoria por adelantado, usar la memoria de la pila, etc ... de manera que el manejo de una solicitud nunca requirió que el código asignara la memoria. El rendimiento se duplicó fácilmente cuando hice ese cambio.


Es posible que desee buscar en sockets sin bloqueo y distribuir la entrada / salida / procesamiento en subprocesos separados. ¿Crear 3 nuevos hilos de entrada / salida / procesamiento por mil conexiones, tal vez?

Espero que ayude.