作者回复: 要分析建立连接失败时,是SYN包丢失?客户端收到ICMP了吗?type和code是多少?或者客户端收到RST了吗?找到原因才知道如何优化。
作者回复: 问题1和3:内核态与用户态是不一样的,你可以理解为置状态、移队列是原子的(基于自旋锁),要么一起成功,要么一起失败。你可以参看内核的int tcp_v4_rcv(struct sk_buff *skb)函数。
问题2:accept调用后,backlog队列就移除了,nginx调用accept是很及时的。百万并发与backlog无关,backlog只与调用accept是否及时有关
作者回复: 看下CPU的利用率,如果有些CPU满载有些则比较闲,可以考虑多队列网卡;看下网络流量 ,是否到达网卡或者带宽的最大值了?最后再确认下,会不会业务处理上阻塞了Nginx?
作者回复: 原始的pcap文件发我邮箱看下:russelltao@foxmail.com
作者回复: 这种情况不会发生,因为配置文件验证不通过。你可以找下这段源码:
if (addr[i].opt.set) {
ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
"duplicate listen options for %s", addr[i].opt.addr);
return NGX_ERROR;
}
作者回复: 不是的,listen指定的backlog队列是握手完成的连接,不是半连接SYN队列。你可以看下这个页面:http://man7.org/linux/man-pages/man2/listen.2.html