我已经构建了以下简单服务器,我正在使用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();
}
}
如您所见,它非常简单,它只显示处理的请求总数。 有什么提示吗?
由于
答案 0 :(得分:1)
'通过对等方重置连接'通常意味着您已写入已被另一端关闭的连接。换句话说,应用程序协议错误。您可以在后续读取或写入时获得错误。
答案 1 :(得分:1)
我没有立即发现任何错误,但您可以尝试以下方法来尝试获取更多信息:
channelClosed
并输出内容,以便您100%确定Netty 至少尝试关闭频道。System.out
上向channelConnected
服务器端写一些内容,以便您知道您的连接已经达到了那么远(特别是第二次运行)。ab
时,每次连接尝试都会出错,还是仅针对某些连接?我觉得奇怪的是它似乎第一次工作,但此后却没有。请记住,这可能不是Netty - 甚至是JVM - 问题,而是操作系统以某种方式限制了连接尝试。
我已经使用自己的Netty测试服务器进行了一些测试,并发现启动大批量并发连接将产生不可预测的结果(大多数将连接,一些将失败,但总是不同的比率)。到目前为止,我还没弄清楚为什么会这样,但我怀疑是我的操作系统拒绝连接而不是Netty。