2015-05-27 160 views
0

我目前正在尝试加载测试服务器。由于我的控制以外的问题,我不能使用Jmeter进行测试。创建一组线程并让每个线程在同一时刻发送帖子或尽可能接近发送帖子的最佳方式是什么?在运行发送到POST到服务器的方法之前,我的当前实现创建了一些带有for循环的线程。但这根本不是同时发生的。如何发送并行POST请求Java

+2

我不明白jmeter与体系结构的关系 – njzk2

+0

如果您从外部负载测试服务器(模拟HTTP流量),则应该如何生成流量。那么为什么JMeter没有这个问题呢? –

+0

我不能具体说。但是我有一种处理jmeter不能做的数据的方法。这不是重要的部分。 – drpogue

回答

3

我说你会想在群集中做到这一点,而不是在同一台机器上的多个线程,除非你有一台机器与几个网络接口卡(NIC)。你的瓶颈不是内核,它是你的网卡。您的网卡仍然会依次清空其缓冲区。

我会推荐的是有尽可能多的机器集群,你可以。在每台机器上,都有一对线程(只是为了确保NIC的缓冲区保持满)。不要麻烦同步集群同时发送请求,因为往返时间(RTT)将花费太长时间,并且会使您的负载测试无效。只需要将每个线程锤掉......从统计角度来讲,如果您的群集足够大,则必定会同时获得几个POST请求。

+0

假设存在任何疯狂的原因,我不能使用预先存在的加载应用程序,这是我会用我将创建的应用程序做什么。将罐子放在尽可能多的机器上,并行运行。 – MadConan

+0

一个网卡一次只能处理一个连接到主机的连接? – MadConan

+0

一个网卡有一个缓冲区,你可以尽可能快地填充它,但它只能清空缓冲区才能顺序发送数据包。服务器通过拥有多个网卡来解决这个问题 - 不是我是一个服务器大师或其他任何东西 – searchengine27

0

我肯定会推荐使用一些负载测试应用程序框架。有很多可供选择的。

就这样说,你可以使用这样的事情开始。这将是我从哪里开始。您需要实施performRequest方法。至少可以这样说,这并不是很强大。没有日志记录,没有报告没有错误处理 - 你可以通过一个负载测试应用程序“免费”获得所有这些(对于“免费”的某些定义)。

public class HttpClient { 
    enum RequestType{ 
     POST,GET 
    } 

    private RequestType type; 
    private String url; 

    public HttpClient(RequestType rt, String url){ 
     type = rt; 
     this.url = url; 
    } 

    public void performRequest(){ 
     // your code here. 
    } 

    public static void main(String[] args){ 
     List<HttpClient> clients = new ArrayList<>(); 
     int clientCount = Integer.parseInt(args[0]); 
     String url = args[1]; 
     for(int i=0; i<clientCount; i++){ 
      clients.add(new HttpClient(RequestType.POST,url)); 
     } 
     clients.parallelStream().forEach(HttpClient::performRequest); 
    } 
} 

你可能想使

  • 默认的线程池的一些显着的改进是非常小的。它等于系统上的CPU核心数量。创建自己的ForkJoinPool实例将为您提供更好的控制。
  • 移动到一个单独的类来启动和解析参数会好得多。
1

假设你的问题是关于同步你的线程,而不是创建/运行线程,那么我推荐CountDownLatch。链接中的示例非常棒。

+0

除非我误解了,否则OP会询问POST请求的负载测试。所有的客户端请求应该是自治的,并且服务器应该已经被功能测试。因此,不会考虑同步。 – MadConan

+0

“我的当前实现在运行发送到服务器的POST方法之前创建了一个带for循环的线程,但这根本不是并发的。”听起来像同步问题。 –

+0

好的,我可以看到,如果他在某些共享连接或其他什么上进行同步,但在线程之间根本不应该有任何共享资源,因此我说它不处理同步。 – MadConan