概述

上一篇Nginx 性能优化讲了文件句柄对 nginx 性能的影响。这篇说说Connection reset by peer产生的原因与解决方案

Connection reset

reset 又称为 rst 复位。
1.当 socket 连接异常关闭的时候,服务端会给客户端发送 RESET 信号,此时如果客户端正从套接字的输出流中读数据,就会返回Connection reset by peer。如下图所示,正在读取响应头

2.当 socket 连接异常关闭的时候,服务端会给客户端发送 RESET 信号,此时如果客户端正往套接字的输出流中写数据,则会直接返回Connection reset

问题的原因

出现 reset 有以下几种原因
1.连接主动断开【三次握手发送 ack 报文的时候有重传机制,默认是 6 次。当重传次数超过 6 次的时候,连接会主动中断,然后发送 rst 报文】
2.连接被主动丢弃【三次握手最后一个环节有 accept 队列,accept 队列溢出就会导致 tcp 连接被丢弃,然后发送 rst 报文】
针对以上这两种问题,我们可以降低重传次数
net.ipv4.tcp_syn_retries
可以增加 accept 队列与 linux 系统队列
net.core.netdev_max_backlog
net.core.somaxconn
关闭 rst 报文的发送,提高连接率
net.ipv4.tcp_abort_on_overflow = 0
在队列溢出的时候,绕过 syn 队列
net.ipv4.tcp_syncookies = 1

3.数据长度不一致。发送方发送的数据大于接收方的尺寸,就会导致报文被丢弃,连接中断
Nginx 对响应头和响应体有配置缓冲区proxy_buffer_size,可以适当优化这个值

或者优化 tcp 的内核参数net.ipv4.tcp_window_scaling = 1,这个值是缓冲区的滑动窗口,可以针对收发的尺寸做自适应

总结

优化的思路就是两条,保证足够的连接队列,保证足够的缓冲空间!


↙↙↙阅读原文可查看相关链接,并与作者交流