如何对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
相关产品推荐
相关产品推荐

