2

我想对我的服务端点进行压力测试,发出 http POST 请求。

我希望解决方案能够:

  1. 发出一定数量的请求,例如 100K
  2. 继续运行 x 分钟

到目前为止,我使用 executorservice 创建了我的解决方案,例如:

int MAX_THREADS = 20;
int MAX_REQUESTS = 1000;

ExecutorService es = Executors.newFixedThreadPool(MAX_THREADS);

for(int x = 0; x < MAX_REQUESTS; x++) {
  es.execute(new MyTask());
}

es.shutdown();

try {
  es.awaitTermination(..);
}
catch(...) {

}

MyTask 实现 Runnable 的地方,它使用 HttpClient (apache) 制作 HttpPost。

所以这会创建一组线程池,然后调用任务 x 次。

如何修改它以使其也能够运行指定的分钟数?

为了让我获得开始/结束时间统计信息,我将不得不使用期货,所以每个线程并返回正确运行所需的时间?

此外,在我的可运行任务中,我正在创建一个新的 HttpClient 对象实例,并加载一个随帖子发送的文件。我猜这会减慢我的基准测试速度,除了实际调用来发出请求之外,有没有办法在所有设置中重新使用 httpclient?

在任何人提到它之前,我知道已经有 jmeter 等工具可以做到这一点,但我想了解它是如何工作的,并且稍后我将做一些我想要完全控制的自定义事情。

4

2 回答 2

4

如果可以使用 Apache JMeter,为什么要自己制作?您可以制作一个简单的插件来满足您的应用程序需求,然后让 JMeter 的所有负载生成功能触手可及。包括间隔跑等等。

于 2012-05-25T15:27:07.187 回答
1

您应该做的是等待终止一段时间,然后调用es.shutdownNow(). 所以像:

// start your executor service like you do
// submit your jobs
// shutdown the service so no new jobs are added
es.shutdown();
try {
   // wait for it to complete for only a certain amount of time
   if (!es.awaitTermination(1. TimeUnit.MINUTES)) {
       // if timed out waiting then flush remaining jobs and interrupt running
       es.shutdownNow();
       // now wait forever for it to finish after you've stopped the jobs
       es.awaitTermination(Long.MAX_VALUE, TimeUnit.MILLISECONDS);
   }
} catch(...) {

我对此的一个问题是,在shutdownNow()你调用 _after 之后调用是否合法shutdown()。我对此不是 100% 确定的。

注意:如果您的任务长时间运行,则应注意InterruptedException并测试Thread.currentThread().isInterrupted()它们是否正在循环,以便可以shutdownNow()适当地中断它们。

于 2012-05-25T15:25:39.387 回答