使用C#Async Await进行负载测试

时间:2016-08-04 17:47:26

标签: c# asynchronous async-await task-parallel-library load-testing

我正在创建一个控制台程序,它可以通过模拟多个客户端来测试对Cache的读/写,并编写了以下代码。请帮助我理解:

  • 是实现多客户端模拟的正确方法
  • 我可以做些什么来使其成为真正的负载测试
void Main()
{

    List<Task<long>> taskList = new List<Task<long>>();

    for (int i = 0; i < 500; i++)
    {
      taskList.Add(TestAsync());
    }

    Task.WaitAll(taskList.ToArray());

    long averageTime  = taskList.Average(t => t.Result);

}

public static async Task<long> TestAsync()
{
    // Returns the total time taken using Stop Watch in the same module
    return await Task.Factory.StartNew(() => // Call Cache Read / Write);
}

2 个答案:

答案 0 :(得分:2)

稍微调整一下您的代码,看看我们在特定时间有多少线程。

    public MainFrame(){
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    setSize(600,400);
    //create new panel and add panel to frame
    JPanel pnlImg=new JPanel();
    add(pnlImg);
    //create new label for showing image
    JLabel lblShowImg;

    BufferedImage image = null;
    try {
        image = ImageIO.read(new File("1.jpg"));
    } catch (IOException ex) {
        Logger.getLogger(MainFrame.class.getName()).log(Level.SEVERE, null, ex);
    }
    ImageIcon ii=new ImageIcon(image.getScaledInstance(300,300,Image.SCALE_SMOOTH));
    lblShowImg=new JLabel(ii);


    /*add label to panel */
    pnlImg.add(lblShowImg);

    /* show frame*/
    setVisible(true);
}

结果是:在虚拟机内部,如果我不使用提示,我会同时运行2到10个线程。提示 - 最多100个。在真机上我可以同时看到1000个线程。 Process explorer确认了这一点。 <{3}}的一些有用的详细信息。

答案 1 :(得分:2)

如果它非常繁忙,那么显然您的客户必须等待一段时间才能提供服务。您的程序无法衡量这一点,因为您的秒表在服务请求开始时开始运行。

如果您还想测量请求完成前的平均时间内发生的情况,您应该在发出请求时启动秒表,而不是在请求服务时启动。

您的程序只接受线程池中的线程。如果你开始更多的任务然后有线程,一些任务将必须等待TestAsync开始运行。如果您记得调用Task.Run的时间,则会测量此等待时间。

除了时间测量的缺陷外,您还期望同时获得多少服务请求?你的线程池中是否有足够的空闲线程来模拟这个?如果您预计同时有大约50个服务请求,并且线程池的大小只有20个线程,那么您将永远不会同时运行50个服务请求。反之亦然:如果您的线程池大于预期的同时服务请求数,那么您将测量的时间长于实际情况。

考虑更改线程池中的线程数,并确保没有其他人使用池中的任何线程。