使用Java进行负载测试 - 定时器任务 vs 调度器

4
我需要使用Java进行负载测试,其中一种测试策略需要在z分钟内每y段时间启动x个线程,并在负载测试持续时间内保持恒定的totalThread线程数量(例如,使用100个线程,以5秒间隔启动10个线程,直到所有100个线程都启动,并继续保持所有100个线程运行(执行完后应重新开始)指定的测试持续时间,比如一个小时)。
我尝试使用计时器任务,但似乎有限制,线程池调度程序是更好的选择吗?最好的方法是什么?
public class MyTask extends TimerTask{
    public void run() {
        System.out.println("STARTING THREAD "+ counter +" "+ new Date());
        //execute test
        counter++;

        if (counter > maxIterations) {
            MyTask.this.cancel();
            return;
        }
    }

    List<TimerTask> MyTaskList = new ArrayList<TimerTask>();   
    for (int i = 1 ; i <= threadsPerIteration ; i++) {
        TimerTask MyTimerTask = new MyTask(NumberOfIterations);
        MyTaskList.add(MyTimerTask);

        timer.schedule(MyTimerTask, initialDelayMilli, threadDelayMilli);
    }

谢谢


使用适当的工具,比如JMeter,是否不可行? - Mick Mnemonic
不幸的是,是的。 - RiYo
考虑一下 CLIFF 负载测试工具,它可以让您进行精确的调度。 - Stuart Ledwich
很遗憾,我不能使用任何负载测试工具,这必须直接实现在脚本中。 - RiYo
TimerTask 使用专用线程,因此它可能会很昂贵(创建、上下文切换),而 ScheduledExecutorService 则将消息传递给(可能处于活动状态的)等待线程。我认为这样更可预测。不过最好使用 gattling - Ben Manes
2个回答

1
不要为每个线程使用TimerTask。相反,使用一个单独的TimerTask,每个间隔触发一次,例如您的示例数字每5秒触发一次。
在TimerTask第一次触发时,它会生成10个线程。在每个后续触发时,它会检查活动线程的数量,并生成足够的新线程将总数增加到100,直到测试结束。

0
感谢您的帮助,我决定使用ThreadPoolExecutor和TimerTask类来实现以下功能:
我使用了Executors.newScheduledThreadPool(int x)方法来控制能够同时运行的线程数量,以及一个定时器任务,该任务设置为每隔y段时间增加线程池大小:
   TimerTask DelayTimerTask = new TimerTask() { //task to increase threadpool size

          public void run() {
            MyExecutor.setCorePoolSize(i * incrementAmount);          //timer task increments threadpool size by threadPoolIncrement
            i++;
        }
      };
    timer.scheduleAtFixedRate(DelayTimerTask,0,intervalLength);

这样做将会每隔intervalLength增加incrementAmount个并发线程。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接