负载均衡如何优化连接复用?

话题来源: 一次配置多个反向代理的负载均衡方案

说起负载均衡中的连接复用问题,真是让人又爱又恨。上周亲眼目睹了Nginx日志中大量的TCP连接建立和断开,就像一个繁忙的十字路口,红绿灯不停转换,每辆车都要重新启动,这种方式显然太浪费资源了。连接复用就像是给这个路口装上了智能交通系统,让同一方向的车流可以持续通过,效率立刻提升了不止一个档次。

为什么连接复用如此重要?

其实很多开发者容易忽略一个数字:建立TCP连接的成本。每次握手需要3个数据包往返,TSL加密还要再增加2次。算下来,光是建连可能就要花费50-100ms。在高并发场景下,这个成本会成倍放大。我上次就遇到一个典型的案例:某电商大促时,由于没有开启keepalive,导致1秒钟内服务器处理了大量新建连接请求,CPU直接飙到100%。

几个关键配置技巧

在Nginx中优化连接复用,有三点特别值得注意。首先是keepalive_timeout的设置,太短会频繁重建连接,太长又会浪费内存资源。我们的经验值是设置在30秒左右。其次是keepalive_requests,建议至少设置10000次请求以上。最后别忘了proxy_http_version 1.1,没有这个配置,HTTP/1.0的请求会让连接无法复用。

你看,某个互联网金融客户在优化前平均RT是200ms,适当调整这几个参数后降到了80ms左右,提升效果相当明显。不过要注意的是,连接复用不是无限制的,要结合服务器的实际内存情况来配置。

一个容易被忽视的坑

有趣的是,配置了keepalive后发现效果不明显?这种情况我见多了!问题往往出在proxy_set_header Connection "";这行配置上。如果不显式清空Connection头,上游服务器可能会关闭连接,使得复用失效。这也是为什么我总说负载均衡配置真是一个精细活,差之毫厘谬以千里。

说到这个,不得不提上次有个团队死活找不到复用失败的原因,最后发现居然是上游服务器的防火墙设置了过短的连接超时时间…所以啊,连接复用从来都不只是负载均衡层的事情,需要端到端的配合。

评论