编写网络性能测试

时间:2013-06-07 19:40:30

标签: java multithreading websocket netty

所以我有一个基于netty的websockets客户端,我用它来进行性能测试。我的想法是我可以用它来模拟100,1000等同时连接。

我已经确定我当前对此的处理方法不起作用 - 测试工具根本就没有创建足够的websocket连接,但是它快乐地碰撞,认为它仍然连接,等等。但我的服务器根本没有显示使用此测试工具时的正确连接数。我认为最有可能发生这种情况是因为我一次在多个线程中使用netty库中的各种对象,并且它们处理得不好。例如,ClientBootstrap。

这就是我每个线程所做的事情。你能告诉我我哪里出错了,以便我可以修理我的测试工具吗?

public void run(){
    try{

       // client bootstrap.  There is one of these per thread.  is that part of the problem?
       ClientBootstrap bootstrap = new ClientBootstrap(new NIOClientSocketChannelFactory(Executors.newCachedThreadPool(), Executors.newCachedThreadPool())));

       Channel ch = null;

       try{
           // set up ssl engine
           final SSLEngine engine = createServerContext().createSSLEngine();
           engine.setUseClientMode(true);

           // there is a new handhsaker per thread, too.  They all go to the same uri 
           final WebSocketClientHandshaker handshaker = new WebSocketClientHandhsakerFactory().newHandshaker(uri, WebSocketVersion.V08, null, false, null);   

           // set up the pipeline factory and pipeline
           bootstrap.setPipelineFactory(new ChannelPipelieFactory(){

               @Override
               public Channelpipeline getPipeline() throws Exception(){
                   ChannelPipeline pipeline = Channels.pipeline();
                   pipeline.addLast("ssl", new SslHandler(engine));
                   pipeline.addLast("encoder", new HttpRequestEncoder();
                   pipeline.addLast("decoder", new HttpResponseDecoder();
                   // WebSocketClientHandler code not included, it's just a custom handler that sends requests via websockets 
                   pipeline.addLast("ws-handler", new WebSocketClientHandler(handshaker);
                   return pipleline;
               }
            });

           // connect websockets preflight over http
           ChannelFuture future = bootstrap.connect(new InetSocketAddress(uri.getHost(), uri.getPort());
           future.sync();

           // do websockets handshake
           ch = future.getChannel();
           ChannelFuture handshakeFuture = handshaker.handshake(ch);
           handshakeFuture.syncUninterruptably();
           Thread.sleep(1000);  // i had to add this.  Sync should have meant that the above method didn't return until it was complete... but that was a lie.  So I sleep for 1 second to solve that problem.  

           if(!handshakeDuture.isSuccess())
               System.out.println("WHOAH errror");

           // send message to server
           ch.write(new TextWebSocketFrame("Foo"));

           // wait for notifications to close
           while(!getShutdownNow().get())  // shutdownNow is an atomicBoolean which is set to true when all my threads have been started up and a certain amount of time has passed
              Thread.sleep(2000);


           // send close; wait for response
           ch.write(new CloseWebSocketFrame());
           ch.getCloseFuture().awaitUninterruptibly();



           }

       }
    }
}

0 个答案:

没有答案