【问题标题】:The udp server throws OOM exception when feed data in a high rateudp服务器在高速率馈送数据时抛出OOM异常
【发布时间】:2014-02-01 15:43:57
【问题描述】:

为了接收最大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 异常的建议?

感谢任何帮助/见解

【问题讨论】:

  • 能否上传堆转储看看为什么引用没有被清理。
  • heapdump太大了,这里找不到上传的方法。使用 jvisualvm,我发现当我开始输入数据时,直接缓冲内存总是会增加到很高的值。我认为原因是数据太多以至于方法 AbstractNioMessageChannel.doReadMessages() 总是可以读取数据,所以 free 标志总是为 false 并且在方法 NioDatagramChannel.doReadMessages() 中无法释放数据。
  • 听起来像是一些可能的问题,让我打开一个问题并在 betty 中修复它
  • 你能用最新的 4.0.0.Final-SNAPSHOT 重新测试吗?现在应该修复了......见github.com/netty/netty/issues/1388
  • 修复可以解决我的问题。非常感谢。

标签: java out-of-memory netty


【解决方案1】:

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

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

【讨论】:

  • 在 Netty4.0.0.CR5 中,这个问题又回来了,我看到第一个修复已经恢复。你能给我一些想法来解决这个问题吗?谢谢
猜你喜欢
  • 2013-01-05
  • 1970-01-01
  • 2020-04-24
  • 2017-03-27
  • 1970-01-01
  • 2021-05-31
  • 2012-03-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多