V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
ghostheaven
V2EX  ›  问与答

WEB 服务总是达到 5000 左右的连接上限

  •  
  •   ghostheaven · 67 天前 · 843 次点击
    这是一个创建于 67 天前的主题,其中的信息可能已经有所发展或是发生改变。

    在阿里云监控上看到 ECS 主机的 TCP 总连接数只能到达 4900~5000 左右,到达这个数值之后就拉平了,几乎不再波动。大部分连接处于 TIME_WAIT 的状态,相关的文章看过好几篇,不过都是使用违反 TCP 协议,复用连接的方式,减少 TIME_WAIT 数量。

    这个连接数随着业务低谷也会降低到几百个,但是峰值只能达到 5000 。WEB 日志监控也看到白天的并发连接峰值大约 200 ,平均也就 30~40 ,平均延迟一般在 100ms 。

    哪位大佬知道这个 5000 左右的连接上限正常吗,可能跟什么有关,能不能提升。

    11 条回复    2022-04-29 20:54:15 +08:00
    ghostheaven
        1
    ghostheaven  
    OP
       67 天前
    补充:

    负载是 NGINX 加 PHP-FPM ,其中:

    * NGINX 默认启动了 8 个 worker process ,`worker_connections`设置为 2048
    * NGINX 与 PHP-FPM 是通过 unix socket 连接
    * PHP-FPM 的 pool 配置为
    ```
    pm = dynamic
    pm.max_children = 100
    pm.start_servers = 10
    pm.max_spare_servers = 15
    pm.max_requests = 0 # 默认值
    ```
    * ECS 主机的日常 CPU 负载也不高,白天峰值 60%,夜间低谷 2-3%,内存占用一般 15%左右,几乎无变化
    elechi
        2
    elechi  
       67 天前
    内核配置?瞎猜
    ghostheaven
        3
    ghostheaven  
    OP
       67 天前
    @elechi ulimit 那边看打开文件限制是 65535 。有什么内核设置会影响这个数量?系统是 Ubuntu 18 server
    datocp
        4
    datocp  
       67 天前 via Android
    这个不应该是跟访问的用户数有关?
    其它能解决的估计是修改 tcp/udp timeout 控制,多少时间建立的连接消亡,默认没记错的话 openwrt 可能高达 1 天。目前最高的 10 分钟,最短的几秒。

    #/proc/sys/net/netfilter/nf_conntrack_*
    net.netfilter.nf_conntrack_generic_timeout=600
    net.netfilter.nf_conntrack_tcp_timeout_syn_sent=120
    net.netfilter.nf_conntrack_tcp_timeout_syn_recv=60
    net.netfilter.nf_conntrack_tcp_timeout_fin_wait=120
    net.netfilter.nf_conntrack_tcp_timeout_time_wait=120
    net.netfilter.nf_conntrack_tcp_timeout_close=10
    net.netfilter.nf_conntrack_tcp_timeout_close_wait=60
    net.netfilter.nf_conntrack_tcp_timeout_last_ack=30
    hahahahahahahah
        5
    hahahahahahahah  
       66 天前 via iPhone
    看看可用端口
    ghostheaven
        6
    ghostheaven  
    OP
       66 天前 via Android
    @hahahahahahahah 去哪里看,我看分配的端口号是从 3 万多到 6 万多,应该高于 5000
    hahahahahahahah
        7
    hahahahahahahah  
       66 天前 via iPhone
    @ghostheaven nginx 没报错吗,看看 ngunx 日志,还有系统日志。可以的话先自己压测下,看看会不会有报错
    xzysaber
        8
    xzysaber  
       66 天前   ❤️ 1
    FPM 是用 systemd 管理的吗?如果是的话,可以使用 "systemctl show {UNITNAME}|grep LimitNOFILE" 查看下。

    systemd 管理的应用的打开的文件数上限好像是不受 limit 约束。
    xzysaber
        9
    xzysaber  
       66 天前   ❤️ 1
    或者你可以直接查出涉及到的各个进程 PID 到 /proc 下去查看下现在对应的数量:cat /proc/{PID}/limits
    MidGap
        10
    MidGap  
       66 天前
    跟分配的端口数没太大关系,别人连你不都是连同一个端口么; 看下 close 连接的地方有没有问题吧。
    ghostheaven
        11
    ghostheaven  
    OP
       66 天前 via Android
    @xzysaber 果然被限制到 4800 了,我把 nginx 和 php-fpm 改成 10000 了,等峰值到了再看下监控。
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1105 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 20:47 · PVG 04:47 · LAX 13:47 · JFK 16:47
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.