我已经设置了两个专用的haproxy服务器来分散三个应用程序服务器上的负载。 我已经build立了常规的http 80平衡,也是一个特殊的使用websockets。
它工作了大约2个小时,但之后,它变得非常缓慢,页面加载大约30秒。 当我重新启动haproxy这是很好的。
下面是我的conf。 任何想法可能造成这个?
global user haproxy group haproxy defaults mode http timeout connect 5s timeout client 5s timeout server 60s stats enable stats auth aa:bb frontend proxy # listen on 80 bind 0.0.0.0:80 # allow for many connections, with long timeout maxconn 200000 # total maximum connections, check ulimit as well timeout client 24h # default to webapp backend default_backend webapp # is this a socket io request? acl is_websocket hdr_end(host) -i node.domain.com use_backend websocket if is_websocket backend webapp balance roundrobin # assuming that you don't need stickiness # allow client connections to linger for 5s # but close server side requests to avoid keeping idle connections option httpchk HEAD /check.txt HTTP/1.0 option http-server-close option forwardfor server app1 xy149.133:80 cookie app1 weight 10 check server app2 xy149.134:80 cookie app2 weight 15 check server app3 xy149.135:80 cookie app3 weight 15 check backend websocket balance source # options option forwardfor # add X-Forwarded-For # Do not use httpclose (= client and server # connections get closed), since it will close # Websockets connections no option httpclose # Use "option http-server-close" to preserve # client persistent connections while handling # every incoming request individually, dispatching # them one after another to servers, in HTTP close mode option http-server-close option forceclose server app1 xy149.133:3000 cookie app1 weight 10 check server app2 xy149.134:3000 cookie app2 weight 15 check server app3 xy149.135:3000 cookie app3 weight 15 check
一般来说,websockets与你的日常http负载平衡是不同的,事实上,与到达率相比,最终的并发连接数量很高。 这是系统中一个重要的区别,所以如果不清楚你看看我的这个答案 。
所以,无论你的问题是什么,我的猜测是,当你达到一定的并发连接阈值时,就会发生这种情况。 这是我最好的猜测根据您提供的信息:
后端networking套接字包含3个服务器。 负载均衡器使用相同的IP与他们进行通信。 这意味着你总共有source_port_range *目标IP地址。 这看起来像这样:
[root@ny-kbrandt01 ~]# cat /proc/sys/net/ipv4/ip_local_port_range 32768 61000 [root@ny-kbrandt01 ~]# echo $(( (61000-32768) * 3 )) 84696
所以,当你在84k连接的地方碰到某个地方的时候,你的haproxy实例就会被迫停止源端口,CPU峰值,因为它类似于垃圾回收来寻找更多的源端口。
如果不是的话,我敢打赌,这是胡同,使用haproxy统计页面监控您的并发连接,并监控您的CPU,以更好地了解发生什么事情时,事情变得缓慢。