前面已经讲过,在使用locust直连后端服务器时,可以通过设置HTTP头部为keep-alive,并在客户端断开连接,减少服务器的连接压力。因为由客户端断开连接,客户端的连接会变为TIME_WAIT状态,从而有效的节省了服务器的资源。
但通常,我们的服务器并不是简单的一个服务器端程序,一般还会有cache服务器,反向代理服务器,负载均衡服务器等等很多的中间部分,而这些模块之间都是通过新的连接相连,如果频繁的新建断开他们之间的连接,不仅会导致服务器端出现大量TIME_WAIT连接,还会导致性能的下降(如果中间每多过一层就多新建一条连接,那么性能肯定会急剧下降,新建一条连接的代价是相当高的)。
举一个常见的模型
客户端------>nginx反向代理服务器------>后端服务器
客户端使用短连接频繁的请求反向代理服务器,如果反向代理服务器也同样去请求后端服务器的话,当客户端断开连接,nginx也断开与后端服务器的连接,就会造成nginx所在的服务器产生大量的TIME_WAIT连接,压力增大时很可能导致nginx服务器无法提供新的连接。
面对上面的问题,就需要调整nginx的参数。保证不论客户端如何请求nginx服务器,nginx与后端服务器都保持一定数据量的长连接,这样就能有效的避免连接的频繁创建于释放。
在upstream XXX 配置中增加keepalive配置
这意味着,nginx服务器会与后端服务器最多“保持”5000条连接的连接池,“保持”的意思是,当客户端的请求非常多时,nginx与后端服务器会存在多余5000的连接,但是当压力减小时,多于5000的连接会被释放,仍然恢复到5000条连接。也就是说,如果这个值设置的非常小,当客户端访问压力剧增时,仍然是会出现大量新建释放连接的问题的,当然,也可以通过增加连接池内连接的超时时间来控制连接的有效期,不过这就需要根据业务需求反复测试调整了。
要想keepalive生效,还需要两个必要的条件:
1、需要强制nginx与后端服务器使用1.1版本的HTTP协议,因为1.1默认是keepalive的。
2、需要将客户端请求的Connection头部重置掉,因为如果客户端传来的是close,那么这条请求到了后端服务器那,后端服务器就会主动将连接关闭掉,nginx与服务器端的连接也就无法keepalive了。
经过这样的调整,就能实现我们nginx与后端服务器之间使用长连接的连接池,最大限度的复用连接。
原文地址:https://www.cnblogs.com/satuer/p/9657730.html