pom.xml 依赖如下
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-transport-native-epoll</artifactId>
<version>4.1.23.Final</version>
<classifier>linux-x86_64</classifier>
</dependency>
Epoll.ensureAvailability();
EventLoopGroup group = Epoll.isAvailable() ? new EpollEventLoopGroup() : new NioEventLoopGroup();
b.group(group)
.channel(Epoll.isAvailable() ? EpollDatagramChannel.class : NioDatagramChannel.class)
.option(ChannelOption.SO_BROADCAST, true)
.option(ChannelOption.SO_RCVBUF, 1024 * 1024)
.handler(new ChannelInitializer<NioDatagramChannel>() {
@Override
public void initChannel(final NioDatagramChannel ch) throws Exception {
ChannelPipeline p = ch.pipeline();
p.addLast(serverHandler);
}
});
// linux平台下支持SO_REUSEPORT特性以提高性能
LOGGER.info("Epoll.isAvailable():"+Epoll.isAvailable());
LOGGER.info("Epoll.unavailabilityCause():"+Epoll.unavailabilityCause());
if (Epoll.isAvailable()) {
b.option(EpollChannelOption.SO_REUSEPORT, true);
}
if (Epoll.isAvailable()) {
// linux系统下使用SO_REUSEPORT特性,使得多个线程绑定同一个端口
int cpuNum = Runtime.getRuntime().availableProcessors();
LOGGER.info("using epoll reuseport and cpu:" + cpuNum);
for (int i = 0; i < cpuNum; i++) {
ChannelFuture future = b.bind(port).await();
if (!future.isSuccess()) {
throw new Exception("bootstrap bind fail port is " + port);
}
}
}