2008-11-04 26 views
45

Hemos estado peleando con HAProxy durante unos días en Amazon EC2; la experiencia hasta ahora ha sido excelente, pero estamos estancados en exprimir más rendimiento del equilibrador de carga de software. No somos exactamente zorros de redes de Linux (normalmente somos una tienda .NET), pero hasta ahora hemos mantenido la nuestra, intentando establecer los límites adecuados, inspeccionando los mensajes kernel y tcpdumps en busca de irregularidades. Hasta ahora, hemos llegado a una meseta de aproximadamente 1.700 solicitudes/seg, momento en el que abundan los tiempos de espera de los clientes (hemos estado usando y modificando httperf para este fin). Un compañero de trabajo y yo estábamos escuchando el podcast de desbordamiento de pila más reciente, en el que los fundadores de Reddit observan que todo su sitio se ejecuta en un nodo HAProxy, y que hasta ahora no se ha convertido en un cuello de botella. ¡Ack! O bien, de alguna manera no se ven tantas solicitudes simultáneas, estamos haciendo algo terriblemente incorrecto, o la naturaleza compartida de EC2 está limitando la pila de red de la instancia Ec2 (estamos usando un tipo de instancia grande). Teniendo en cuenta el hecho de que tanto los fundadores de Joel como los de Reddit están de acuerdo en que la red probablemente sea el factor limitante, ¿es posible que esa sea la limitación que estamos viendo?Load Balancing en Amazon EC2?

¡Cualquier pensamiento es muy apreciado!

Editar Parece que el problema real no era, de hecho, con el nodo del equilibrador de carga. El culpable era en realidad los nodos ejecutando httperf, en este caso. A medida que httperf construye y elimina un socket para cada solicitud, gasta una buena cantidad de tiempo de CPU en el kernel. A medida que subimos la tasa de solicitudes más alta, TCP FIN TTL (que era 60 por defecto) mantenía los conectores demasiado tiempo, y el valor predeterminado de ip_local_port_range era demasiado bajo para este escenario de uso. Básicamente, después de unos minutos de que el nodo cliente (httperf) creara y destruyera nuevos sockets constantemente, la cantidad de puertos no utilizados se agotó y las subsiguientes 'solicitudes' se borraron en esta etapa, produciendo pocos pedidos/segundos y una gran cantidad de errores

También miramos nginx, pero hemos estado trabajando con RighScale, y tienen scripts para HAProxy. Oh, y tenemos una fecha límite demasiado ajustada [por supuesto] para cambiar los componentes a menos que resulte absolutamente necesario. Afortunadamente, estar en AWS nos permite probar otra configuración usando nginx en paralelo (si está garantizado), y hacer el cambio durante la noche más tarde.

This page describe bastante bien cada una de las variables de sysctl (ip_local_port_range y tcp_fin_timeout fueron sintonizadas, en este caso).

+3

Marc, debe escribir sus experiencias con la configuración de estas cosas y publicarlas en algún lado (¿su empresa tiene un blog?). Parece que podría ser útil para muchas personas. Vota tu pregunta. – SquareCog

+0

Tu enlace está roto. – Ztyx

+0

@Ztyx gracias! Solo lo actualicé Busqué una fuente más nueva y actualizada, parece que el sitio original todavía tiene un PageRank bastante alto y el contenido sigue siendo decente, así que solo lo estoy corrigiendo para reflejar la nueva URL. –

Respuesta

9

No es realmente una respuesta a su pregunta, pero nginx y libra tienen buena reputación como balanceadores de carga. Wordpress acaba de switched to nginx con buenos resultados.

Pero más específicamente, para solucionar su problema. Si no está viendo el uso de 100% de la CPU (incluida la espera de E/S), entonces está vinculado a la red, sí. EC2 utiliza internamente una red gigabit, intente utilizar una instancia XL, de modo que tenga el hardware subyacente para usted y no tenga que compartir ese puerto de red gigabit.

1

Me gustaría cambiar a un equilibrador de carga fuera del sitio, no en la nube y ejecutar algo así como IPVS en la parte superior. [La razón por la que estaría fuera de la nube de Amazon es debido a cosas del kernel]. Si Amazon no limita la IP de origen de los paquetes que salen de ella, podría ir con un mecanismo de equilibrio de carga unidireccional. Hacemos algo como esto, y nos da aproximadamente 800,000 solicitudes simultáneas [aunque no tratamos con la latencia]. También podría decir "ab2" (apache bench), ya que es un poco más fácil de usar y más fácil de usar en mi humilde opinión.

+0

¿Sabe que escribió su mensaje completo en negrita? Es bastante difícil de leer –

20

No responde la pregunta directamente, pero EC2 ahora admite el equilibrio de carga a través de Elastic Load Balancing en lugar de ejecutar su propio equilibrador de carga en una instancia de EC2.

EDITAR: El servicio DNS de la ruta 53 de Amazon ahora ofrece una manera de apuntar un dominio de nivel superior en un ELB con un registro de "alias". Dado que Amazon conoce la dirección IP actual del ELB, puede devolver un registro A para esa IP actual en lugar de tener que usar un registro CNAME, mientras sigue siendo libre de cambiar la IP de vez en cuando.

+0

Gracias por el aviso, en realidad estoy evaluando esto en este momento. Las cosas geniales abundan (¡aunque las herramientas de la línea de comandos dejan un poco que desear)! –

+3

Desafortunadamente, la solución de balanceo de carga (ELB) de AWS tiene un defecto importante. Está diseñado para usar CNAMES que evita que los usuarios señalen un dominio de nivel superior directamente en el equilibrador de carga. En otras palabras, puede señalar www.mydomain.com a ELB pero no a midominio.com. Para muchos, eso es un disparate. – kpw

+0

¿No podría redirigir todas las llamadas a su sitio web para que www. sería escrito en? –

3

Sí, podría usar un equilibrador de carga fuera del sitio ... y en metal puro LVS es una gran opción, ¡pero su latencia será horrible! Corre el rumor de que Amazon solucionará el problema CNAME. Sin embargo, es poco probable que agreguen https, controles de estado detallados o personalizados, agentes de comentarios, correspondencia de url, inserción de cookies (y algunas personas con buena arquitectura dirían que también es correcto). Sin embargo, es por eso que Scalr, RightScale y otros usan HAProxy. detrás de una entrada DNS round robin. Aquí en Loadbalancer.org estamos a punto de lanzar nuestra propia herramienta de equilibrio de carga EC2: http://blog.loadbalancer.org/ec2-load-balancer-appliance-rocks-and-its-free-for-now-anyway/ Estamos planeando usar scripts SSH para integrar con autoescala de la misma manera que lo hace rightscale, cualquier comentario apreciado en el blog. Gracias

0

Aunque su problema haya sido resuelto. KEMP Technologies ahora tiene un equilibrador de carga completamente soplado para AWS. Podría ahorrarte un poco de molestia.