Netty单台服务器10 万设备连接并发
Netty 本身基于 Java NIO 或 Epoll(Linux 下),可以高效处理大量连接。但要达到 10 万连接同时在线并能并发收发数据,要重点解决以下几个维度的问题。
📌 一、资源限制是最大的问题
1. 文件描述符限制(ulimit -n)
每个连接本质上一个 socket,占用一个文件描述符,10 万连接就需要 10 万个 FD。
#临时修改
ulimit -n 1048576 # 推荐设置至少 1M
#永久修改:
#/etc/security/limits.conf中添加* soft nofile 1048576和* hard nofile 1048576
echo -e '* soft nofile 1048576\n* hard nofile 1048576' | sudo tee -a /etc/security/limits.conf
还得改 /etc/security/limits.conf 和 /etc/systemd/system.conf,确保生效。
2. 内存压力(堆外内存 + DirectBuffer)
每个连接都会占用内存(包括 buffer、线程池等),10 万连接估计得 10GB 以上内存打底,建议配置:
• JVM 启动参数:
-XX:MaxDirectMemorySize=8G -Xms8G -Xmx8G
• 使用 Netty 的 PooledByteBufAllocator 来避免频繁分配释放。
3. 端口限制不是问题
很多人可能担心一个端口只能有 65535 个连接,那是误解。端口只对主动连接(客户端)受限,服务器端监听一个端口可以接收无限多个连接(前提是系统资源允许)。
📌 二、Netty 线程模型调优
推荐使用 Epoll + 非阻塞 I/O(只限 Linux)
new EpollEventLoopGroup(nThreads);
new EpollServerSocketChannel();
• 调整 worker 数量(建议 CPU 核心数 * 2)
• 合理使用业务线程池,I/O线程不要做耗时操作
📌 三、TCP 参数优化(系统层)
临时修改
sysctl -w net.ipv4.tcp_tw_reuse=1
sysctl -w net.ipv4.tcp_tw_recycle=0
sysctl -w net.ipv4.tcp_fin_timeout=10
永久修改
#修改内核参数 /etc/sysctl.conf
sudo tee /etc/sysctl.conf > /dev/null <<EOF
# ===== Netty 高并发优化 =====
#文件数量
fs.file-max = 2097152
#TCP参数调优
net.core.somaxconn = 65535
net.core.netdev_max_backlog = 250000
net.core.rmem_max = 67108864
net.core.wmem_max = 67108864
net.ipv4.tcp_max_syn_backlog = 65536
net.ipv4.ip_local_port_range = 1024 65535
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 10
net.ipv4.tcp_keepalive_time = 120
net.ipv4.tcp_keepalive_probes = 3
net.ipv4.tcp_keepalive_intvl = 15
EOF
#配置文件生效
sudo sysctl -p
📌 四、业务层优化建议
• 连接空闲检测(IdleStateHandler)+ 心跳机制
• 使用 protobuf/json 压缩消息体,减轻带宽与解析负担
• 异步业务逻辑,避免阻塞 I/O 线程
• 分布式服务可选做 连接转发/网关
📌 五、建议的部署环境

如果这篇文章对你有用,可以关注本人微信公众号获取更多ヽ(^ω^)ノ ~


浙公网安备 33010602011771号