JUnit 负载测试数千个与服务器的并发套接字连接

Posted

技术标签:

【中文标题】JUnit 负载测试数千个与服务器的并发套接字连接【英文标题】:JUnit load testing thousands of concurrent socket connections to server 【发布时间】:2013-10-19 13:25:48 【问题描述】:

我有大约 100 个 JUnit 测试来模拟客户端与服务器的套接字连接。它们看起来像这样:

@Test
public void testProtocolInACertainWay() throws Exception 
    Socket socket = _socketFactory.createSocket(_host, _port);  // SSLSocketFactory

    // Send payload
    DataOutputStream outputStream = new DataOutputStream(socket.getOutputStream());
    outputStream.write(/* test-specific payload */);
    outputStream.flush();

    // Receive response
    DataInputStream inputStream = new DataInputStream(socket.getInputStream());        
    socket.setSoTimeout(5000);
    byte[] buffer = new byte[512];
    int numBytesRead = inputStream.read(buffer);
    buffer = ArrayUtils.subarray(buffer, 0, numBytesRead);

    // Assert test-specific stuff on response
    Assert.assertTrue(buffer[0] == (byte)1);  // for example

    /* At this point, depending on the test, we either repeat similar steps with different payloads or end the test */

现在,我希望能够从服务器运行这些测试(或子集),一次运行 150 万个。这意味着我想同时发送 150 万个套接字写入,将它们全部读取,并断言它们的响应。

有没有一种方法可以做到这一点而不必重写所有 100 个 JUnit 测试? (请说是的,所以:))

谢谢!

【问题讨论】:

试试databene.org/contiperf, groboutils.sourceforge.net @Jayan 我实际上想要更多像 1.5M 而不是 100k 并发测试。 contiperf 会给我我需要的性能,还是我必须切换到 Netty 之类的?谢谢。 您无法从单个测试客户端计算机执行此操作。到同一主机的最大出站连接数受 64k 端口空间的限制。 @EJP 感谢您的回复。但是,服务器有多个我可以连接的 IP。 【参考方案1】:

经过大量研究,我真正想做的是使用 Netty 或 vert.x。我将不得不重写所有测试以使用事件队列而不是阻塞 I/O。

【讨论】:

以上是关于JUnit 负载测试数千个与服务器的并发套接字连接的主要内容,如果未能解决你的问题,请参考以下文章

拥有数千个虚拟用户的 Node.JS 负载测试工具

如何使用 Jmeter 对多个套接字连接进行负载测试?

“java.net.BindException:地址已在使用中”尝试为负载测试进行快速套接字创建和销毁时

VSTS 2008 负载测试中的虚拟用户并发

负载测试 ZeroMQ (ZMQ_STREAM) 以找到它可以处理的最大同时用户

Mysql显示不超过5个并发连接