Tengo una caja de 8 núcleos relativamente nueva con CentOS. Me gustaría desarrollar un servidor de estadísticas que use TCP. Es muy simple, acepta una conexión TCP, incrementa un contador y cierra la conexión. El problema es que necesita hacer esto al menos 10k solicitudes por segundo. Sospecho que la CPU / Memoria no será un problema, pero estoy más preocupado por los límites artificiales (como las conexiones entreabiertas) que podría necesitar configurar en mi servidor para permitir este tipo de volumen. Entonces, ¿es esto posible? ¿Qué configuraciones debo tener en cuenta? ¿Mi NIC no podrá manejarlo?
18
Respuestas:
Esto se conoce comúnmente como el problema de c10k . Esa página tiene mucha buena información sobre los problemas con los que se encontrará.
fuente
deberías poder hacerlo [aunque probablemente sea una mala idea].
en resin appserv puedo obtener ~ 5k req / seg en quad core 2.6ghz xeon. las solicitudes invocan un servlet simple que lee 1 fila de mysql y envía una respuesta xml muy pequeña.
la prueba se realizó con
resultados de la prueba:
pero creo que será mucho mejor usar un programa c simple, seguramente sin generar nuevos hilos para cada solicitud. El enlace de Greg Hewgill debería darle una buena idea al respecto.
incluso durante una prueba prolongada no tengo ningún problema con la conectividad [mencionados enchufes medio abiertos]; la prueba se ejecuta entre dos cajas de linux conectadas a través de ethernet gigabit [aunque, como ve, el ancho de banda no es un cuello de botella].
fuente
Puede estar interesado en un límite de kernel de Linux que alcancé mientras probaba la carga de Apache. En mi caso, el kernel produjo algunos mensajes de error útiles, por lo que mi consejo es que escriba su programa y si parece estar llegando a un límite, preste atención a los registros del kernel.
fuente
Usaría UDP en lugar de TCP si fuera posible. Debería ser más liviano y, por lo tanto, escalar mejor.
fuente
Tu nic debería poder manejarlo, pero cuestiono el diseño de tener 10k nuevas conexiones TCP por segundo; si está creando / destruyendo conexiones tan rápido, entonces debería a) mantenerlas abiertas durante más tiempo ob) usar UDP en su lugar.
En el caso de que tenga clientes 1M que necesiten hacer una consulta de vez en cuando, pero donde la carga llegue a 10k por segundo, UDP es probablemente una mejor opción.
En el caso de que solo tenga 10k clientes que necesiten hacer una consulta cada segundo, podrían mantener abiertas las conexiones existentes y reutilizarlas. Esto sería mucho más amable con el sistema operativo y también produciría una latencia mucho menor, ya que no requeriría un nuevo apretón de manos cada vez.
En el caso de que tenga 10k solicitudes por segundo, me imagino que tiene un equilibrador de carga frontal de todos modos, por lo que también deberá probarlo.
(Nota: creo que esto pertenecía a Stack Overflow)
fuente