• 喵小灰
    2019-02-27
    老师,请求Nginx返回静态页面,4c/8g服务器,4个worker进程,net.ipv4.tcp_max_syn_backlog配置的是8192,net.ipv4.tcp_syncookies = 1,并发测试发现nginx的并发数基本上等于min(net.core.somaxconn,backlog[nginx listen参数]),就会时不时出现有请求连接不到80端口的情况。tps是25000左右,并发测试的用户数从3500-10000测了几个点,cpu使用率一直不超过80%。
         配置net.core.somaxconn为10000,nginx的listen函数backlog为8191,并发数到8200时没有连不到80端口的,增到8250就出现了连不到80端口的情况
         看到您上面说的,并发数不取决于backlog的值,麻烦老师帮忙分析下,我们还有哪些需要优化考虑的地方
    展开

    作者回复: 要分析建立连接失败时,是SYN包丢失?客户端收到ICMP了吗?type和code是多少?或者客户端收到RST了吗?找到原因才知道如何优化。

    
     1
  • 2xshu
    2019-02-18
    老师你好,非常感谢你的课程,使我受益匪浅。

    老师,我有个疑问,不是太理解。
    处于半连接状态,客户端回给服务器ack,是先将SYN_RCVD状态置为establish状态,还是先将该链接移到accept队列?
    我假设是以下三种情况:
    1:如果是先置为establish,但是accept队列满了,这个时候在syn_max_backlog队列就会有establish的状态。
    2:如果是先将该链接从syn_max_backlog队列移除,然后再添加到accept队列,再置为establish状态,但是NGINX默认的listen的backlog是511,那又怎么能达到百万连接的目标呢?
    3:先从syn_max_backlog队列移除该链接,然后放到一个未知队列并置为establish状态。accept队列再从未知队列里面去取链接进行逻辑处理。

    希望得到老师的指点,谢谢啦。

    展开

    作者回复: 问题1和3:内核态与用户态是不一样的,你可以理解为置状态、移队列是原子的(基于自旋锁),要么一起成功,要么一起失败。你可以参看内核的int tcp_v4_rcv(struct sk_buff *skb)函数。
    问题2:accept调用后,backlog队列就移除了,nginx调用accept是很及时的。百万并发与backlog无关,backlog只与调用accept是否及时有关

    
     1
  • wyw
    2020-01-12
    老师当nginx的负载比较高的时候发现nginx Connections的writing状态的连接特别多,别的状态基本在10个上线,writing会上百,极端情况会有上千。writing是指在等待写数据到客户端的连接数,我不清楚为什么会出现这个情况,这个现象说明什么?

    作者回复: 接收完请求后,就会进入writing状态。所以,writing状态不只是处理请求中,发送响应也会在这个状态。所以,writing状态的请求数量通常是最多的。你可以看下137课。

    
    
  • 张跃
    2019-03-30
    老师您好,请问我一个 24核 64G内存的比较繁忙的跑HTTP短连接的 openresty 。
    参数 tcp_max_syn_backlog是不是小了点?我测试发现并发数上不去,并发数在25000 以上 基本上就有连接失败或者write 或者 read 失败 以及超时的情况。
    测试使用 wrk 单机测试的。测试机 同等配置,万兆网卡。

    作者回复: 看下CPU的利用率,如果有些CPU满载有些则比较闲,可以考虑多队列网卡;看下网络流量 ,是否到达网卡或者带宽的最大值了?最后再确认下,会不会业务处理上阻塞了Nginx?

    
    
  • Tony
    2019-03-08
    老师你好, 最近在测试nginx SSL 卸载的性能。出现一个问题:并发数为10的情况下,测试30秒后 loadrunner 报-27796,443(10060)connection time out。通过wires hark 抓包发现,这时候客户端发送的tcp sync, nginx没有回复,导致超时。这是ngnix tcp 参数有问题吗

    作者回复: 原始的pcap文件发我邮箱看下:russelltao@foxmail.com

    
    
  • Bice。
    2019-02-28
    老师你好,我有一个疑问。
    如果两个域名不同配置文件,listen同一端口,但是backlog设置不一样,那accept队列的大小怎么决定?

    作者回复: 这种情况不会发生,因为配置文件验证不通过。你可以找下这段源码:
                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;
                }

    
    
  • 一路向西
    2019-02-06
    陶老师,这儿讲到的SYN队列和ACCEPT队列之和的长度是不是就是socket通信中建立连接listen(N)函数中N的值,虽说在程序中可以设置,也代表这个意义,但是实际是最后会被内核修改的,对吗?

    作者回复: 不是的,listen指定的backlog队列是握手完成的连接,不是半连接SYN队列。你可以看下这个页面:http://man7.org/linux/man-pages/man2/listen.2.html

    
    
我们在线,来聊聊吧