You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何对Reactor Http Server的每秒连接数进行扩容?

如何对Reactor Http Server的每秒连接数进行扩容?

兄弟,你遇到的这个刚好卡在500连接/秒的情况,结合你的MacOS Sequoia 15.3.2、OpenJDK 21、Reactor-Netty 1.2.4环境,大概率是系统默认限制或者Reactor Netty的默认参数卡脖子了,咱们一步步来拆解优化:

先搞定系统层面的瓶颈(MacOS特有)

MacOS默认的资源限制比较保守,而每个TCP新连接都会占用一个文件描述符,这往往是第一个拦路虎:

  • 先检查当前文件描述符限制:打开终端跑ulimit -n看软限制,ulimit -Hn看硬限制。默认软限制一般是1024,这刚好是你当前连接数的两倍左右,显然不够用。
    • 临时调整可以直接输ulimit -n 4096(嫌小的话设8192也行),但重启终端就失效;要永久生效的话,得修改/Library/LaunchDaemons/limit.maxfiles.plist配置文件,添加软限制和硬限制的设置,之后重启系统就行。
  • 再调TCP相关的系统参数:
    • kern.ipc.somaxconn是监听队列的最大长度,默认只有128,新连接多了会被直接拒绝,临时改的话跑sysctl -w kern.ipc.somaxconn=1024;
    • net.inet.tcp.msl是TIME_WAIT状态连接的存活时间,默认15秒,会占用不少资源,临时改成3000(3秒)就行:sysctl -w net.inet.tcp.msl=3000;
      要永久生效这些参数,把它们写到/etc/sysctl.conf文件里就行。

再优化Reactor Netty Server的配置

你说找到HttpClient的配置,但Server的优化逻辑其实相通,重点调这几个参数:

  • 事件循环线程数:Reactor Netty默认按CPU核心数分配线程,但大量新连接属于IO密集型场景,可以手动指定更合适的线程数,比如:
HttpServer.create()
    .runOn(EventLoopGroups.create("server-elg", 16)) // 按你机器CPU情况来,比如8核的话设16就够
    .route(routes -> routes.get("/", (req, res) -> res.sendString(Mono.just("Hello"))))
    .bindNow();

注意线程数别太夸张,超过CPU核心数2倍的话反而会增加上下文切换开销。

  • 连接接收相关参数:把监听队列大小和系统的somaxconn对齐,再调整连接超时:
HttpServer.create()
    .option(ChannelOption.SO_BACKLOG, 1024) // 和之前设置的somaxconn保持一致或稍小
    .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 3000)
    .childOption(ChannelOption.SO_KEEPALIVE, true) // 如果你后续需要长连接可以开,单纯新连接的话可选
    .route(routes -> ...)
    .bindNow();
  • 如果用了HTTPS:记得优化TLS配置,比如启用ALPN、缓存SSL会话,避免握手过程拖慢新连接建立速度。

最后补个JVM层面的优化

OpenJDK 21默认参数在高并发场景下可能不够用,启动时加几个参数:
-Xmx4g -Xms4g -XX:MaxDirectMemorySize=2g
根据你机器的内存调整数值,主要是避免频繁GC,同时给Reactor Netty用的直接内存留够空间。

调完这些之后,用wrk或者ab这类压测工具再测测,应该能突破500连接/秒的限制了。

备注:内容来源于stack exchange,提问作者G.K. Meier

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.13 16:55:32