问题描述
对SLB实例进行压测,出现504状态码、请求超时的现象。压测的URL配置了HTTPS监听的URL转发策略,且该转发策略并没有启用健康检查。
问题原因
查看日志服务中的SLB实例日志,发现大部分请求都出现504状态码,但是upstream_response_time值都非常有规律,响应时间都是5秒,该情况是SLB与后端服务器TCP三次握手失败,导致连接超时抛出504状态码。
说明:查看该日志需要您开通日志服务。
登录后端服务器,排查发现Nginx日志没有异常,但是messages日志存在“nf_conntrack: table full, dropping packet”错误。
该信息是因为Linux系统为每个经过内核网络栈的数据包,都生成一个新的连接记录项,当服务器处理的连接过多时,连接跟踪表无法记录新的连接记录项,服务器会丢弃新建连接的数据包。
所以导致SLB和后端服务器TCP三次握手失败,出现504状态码。
解决方案
建议调整nf_conntrack参数,调整命令如下所示,参数值请以实际情况为准。
说明:该方法会临时修改参数,重启实例后配置会不生效。
sysctl -w net.netfilter.nf_conntrack_max=1048576
sysctl -w net.netfilter.nf_conntrack_buckets=262144
sysctl -w net.netfilter.nf_conntrack_tcp_timeout_established=3600
确认压测正常即可。