转 Nginx connect() failed (110: Connection timed out)

jmeter 压力测试准生产环境 报错

2020/06/03 19:54:10 [error] 23419#0: *34243300 connect() failed (110: Connection timed out) while connecting to upstream, client: 10.2.40.11, server: , request: "POST /analysis/report/noreiinfo/list HTTP/1.1", upstream: "http://192.168.70.232:18080/analysis/report/noreiinfo/list", host: "192.168.70.231:19002"

排查思路
看到time out,以为是服务器或者nginx性能不足
使用ab压测工具,对相关Req进行压测,然后监控相关服务器性能和nginx性能。
看了下监控平台,相关服务器性能都比较平稳,没有较大的波动。
继续观察nginx的监控,nginx的active数量并没有超出设定的最大值。
结论:排除相关服务器性能问题

根据time out问题,查看了nginx相关源码,发现是getsockopt这个系统调用发生超时错误。可以知道高并发的时候,导致backend负载过高,不能及时处理nginx的req导致time out问题。

 

解决方法

检查了相关nginx的upstream的相关配置,发现keepalive设置的值较小,把值设定了1000的时候,继续ab压测多次观察,发现time out问题没有复现,之前每分钟复现一次time out,现在不会在复现



反思
keepalive是什么?
针对第一个问题,查看了相关nginx资料,对keepalive介绍

The connections parameter sets the maximum number of idle keepalive connections to upstream servers

请注意空闲keepalive连接的最大数量中空闲这个关键字,很多人会产生另外一个误解:认为这个参数是设置到upstream服务器的长连接的数量,分歧在于是最大连接数还是最小连接数当使用nginx作为反向代理时。但nginx文档空否定了这个说法。

t should be particularly noted that the keepalive directive does not limit the total number of connections to upstream servers that an nginx worker process can open.

如何设定keepalive的值?
nginx长连接消耗内存,设置少了,就会产生很多time-wait连接占用端口。所以这里设定值需要经过计算。根据QPS和平均响应时间大体能计算出需要的长连接的数量。比如10000 QPS和100毫秒响应时间就可以推算出需要的长连接数量大概是1000. 然后将keepalive设置为这个长连接数量的10%到50%。

其它注意问题
当使用nginx作为反向代理时,为了支持长连接,需要做到两点:

从client到nginx的连接是长连接
从nginx到server的连接是长连接
从HTTP协议的角度看,nginx在这个过程中,对于客户端它扮演着HTTP服务器端的角色。而对于真正的服务器端(在nginx的术语中称为upstream)nginx又扮演着HTTP客户端的角色。
————————————————
版权声明:本文为CSDN博主「fomin_zhu」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/fomin_zhu/article/details/104921719





 

上一篇:nginx使用中的问题集合


下一篇:Kong入门指南 - 设置智能负载平衡