Fork me on GitHub

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 线程
• 分布式服务可选做 连接转发/网关

📌 五、建议的部署环境

image

posted @ 2025-06-13 21:30  秋夜雨巷  阅读(323)  评论(0)    收藏  举报