3

我已经构建了以下简单的服务器,我正在使用ab. 如果我运行ab3000 个总请求(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();
    }

}

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

谢谢

4

2 回答 2

1

我没有立即发现任何问题,但您可以尝试以下操作以获取更多信息:

  1. 覆盖channelClosed并输出某些内容,以便您 100% 确定 Netty至少正在尝试关闭通道。
  2. 使用 jvisualvm 查看运行服务器的 JVM;您应该能够看到线程以及它们是否处于活动状态。
  3. System.out在服务器端写一些东西,channelConnected这样你就知道你的连接已经走到了那一步(尤其是第二次运行)。
  4. 当您ab第二次运行时,每次连接尝试都会出现错误,还是仅出现一些错误?

我觉得奇怪的是它似乎第一次起作用,但之后就不行了。请记住,这可能不是 Netty - 甚至是 JVM - 问题,而是操作系统以某种方式限制了连接尝试。

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

于 2011-11-05T07:39:53.163 回答
1

“对等连接重置”通常意味着您已写入已被另一端关闭的连接。换句话说,应用程序协议错误。您在后续读取或写入时会收到错误本身。

于 2011-10-25T01:23:34.537 回答