1

为了接收最大 64kb 的数据并减少数据包丢失,我使用 netty 4.0 配置了一个如下所示的 udp 服务器

public class UdpServer {

    public void run()
        throws Exception {
        EventLoopGroup group = new NioEventLoopGroup();
        try {
            Bootstrap b = new Bootstrap();
            b.group( group ).channel( NioDatagramChannel.class ).option( ChannelOption.SO_BROADCAST, true )
                .option( ChannelOption.UDP_RECEIVE_PACKET_SIZE, 1024 * 64 )
                .option( ChannelOption.SO_RCVBUF, 1024 * 1024 * 100 ).handler( new UserHandler() );

            b.bind( 5141 ).sync().channel().closeFuture().await();
        }
        finally {
            group.shutdownGracefully();
        }
    }

    public static void main( String[] args )
        throws Exception {
        new UdpServer().run();
    }
}

当我以 20kmsg/s 的速度向 udp sercer 提供数据时,它会引发 OOM 异常。我发现原因是 UDP_RECEIVE_PACKET_SIZE 的配置参数太大,以至于直接缓冲内存很快耗尽。如果我将 1024*128 设置为 SO_RCVBUF,将 1024 * 2 设置为 UDP_RECEIVE_PACKET_SIZE,那么当我以 20kmsg/s 的速度提供数据时,服务器运行良好。

当 UDP_RECEIVE_PACKET_SIZE 不变时,是否有任何建议可以避免 OOM 异常?

感谢您的帮助/见解

4

1 回答 1

0

是一个错误,已在最新的 master 中修复,因此将成为 Netty 4.0.0.Final 的一部分。

http://github.com/netty/netty/issues/1388

于 2013-05-23T18:15:14.110 回答