Netty并发和“由同行重置连接”

时间:2011-10-25 00:49:41

标签: sockets concurrency nio netty

我已经构建了以下简单服务器,我正在使用ab对其进行压力测试。 如果我运行ab总共3000个请求(300个并发),它就可以运行。如果我再次运行它,它会告诉我:

apr_socket_connect(): Connection reset by peer (54) 

如果在此错误之后我尝试使用curl发出单个请求而不重新启动服务器,则可以正常工作。如果我再次运行ab,则会显示相同的错误。 它似乎无法处理太多的并发连接。代码下方:

public static void main(String[] args) throws Exception {

        ServerBootstrap bootstrap = new ServerBootstrap(
                new NioServerSocketChannelFactory(
                        Executors.newCachedThreadPool(),
                        Executors.newCachedThreadPool()));

        bootstrap.setPipelineFactory(new ChannelPipelineFactory() {
            @Override
            public ChannelPipeline getPipeline() throws Exception {
                return Channels.pipeline(new StringEncoder(), new MyServerHandler());
            }
        });

        bootstrap.bind(new InetSocketAddress(9090));
        System.out.println("Running");
}

这是处理程序:

public class MyServerHandler extends SimpleChannelUpstreamHandler {

    private static AtomicLong request = new AtomicLong();

    @Override
    public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e)
            throws Exception {  
        ChannelFuture channelFuture = e.getChannel().write("This is request #" + request.incrementAndGet() + "\n");
        channelFuture.addListener(ChannelFutureListener.CLOSE);
    }

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e)
            throws Exception {
        System.out.println(e.getCause());
        e.getChannel().close();
    }

}

如您所见,它非常简单,它只显示处理的请求总数。 有什么提示吗?

由于

2 个答案:

答案 0 :(得分:1)

'通过对等方重置连接'通常意味着您已写入已被另一端关闭的连接。换句话说,应用程序协议错误。您可以在后续读取或写入时获得错误。

答案 1 :(得分:1)

我没有立即发现任何错误,但您可以尝试以下方法来尝试获取更多信息:

  1. 覆盖channelClosed并输出内容,以便您100%确定Netty 至少尝试关闭频道。
  2. 使用jvisualvm查看运行服务器的JVM;你应该能够看到线程以及它们是否处于活动状态。
  3. System.out上向channelConnected服务器端写一些内容,以便您知道您的连接已经达到了那么远(特别是第二次运行)。
  4. 当您第二次运行ab时,每次连接尝试都会出错,还是仅针对某些连接?
  5. 我觉得奇怪的是它似乎第一次工作,但此后却没有。请记住,这可能不是Netty - 甚至是JVM - 问题,而是操作系统以某种方式限制了连接尝试。

    我已经使用自己的Netty测试服务器进行了一些测试,并发现启动大批量并发连接将产生不可预测的结果(大多数将连接,一些将失败,但总是不同的比率)。到目前为止,我还没弄清楚为什么会这样,但我怀疑是我的操作系统拒绝连接而不是Netty。