我运行一款在线多人游戏,高峰时段大约有 5 万名玩家同时在线。该游戏有一个自定义的客户端-服务器协议(带有一些标头信息的 deflate 压缩 json blob),可以是客户端发起的请求/响应对或服务器推送。客户端连接到 AWS 上的 haproxy 实例,然后在两个应用程序服务器(用 Java 编写)之间平衡负载。
最近,我注意到在高峰时段,对客户端的响应非常慢。如果我要求客户端直接连接到我的 Java 服务器,它的速度和我预期的一样快。但如果连接通过 Haproxy 实例,则会产生非常大的延迟。我通过我编写的自定义 Nagios 插件测量此延迟,此时的数值为:
Direct to server A: 135829 microseconds
Direct to server B: 128737 microseconds
Via Haproxy (balanced to one of these servers): 12990736 microseconds
我目前不知道下一步该怎么做。我正在运行 haproxy 1.5.5。配置如下:http://pastebin.com/rQ8y6AQj。我已启用透明代理。net.netfilter.nf_conntrack_max 设置为 131072。一切都在 Amazon EC2 上运行。
答案1
首先,您确定连接不只是进入队列吗?也就是说,您已经达到 maxconns 了?您的统计页面显示了什么?
或者禁用 conntrack(这很糟糕):
iptables -t raw -I PREROUTING -p tcp --dport 8443 -j NOTRACK
iptables -t raw -I PREROUTING -p tcp --sport 8443 -j NOTRACK
iptables -t raw -I OUTPUT -p tcp --dport 8443 -j NOTRACK
iptables -t raw -I OUTPUT -p tcp --sport 8443 -j NOTRACK
答案2
你有没有尝试过选项 http-no-delay?