[转]比较Jmeter、Grinder和JAVA多线程本身压力测试所带来的性能开销

1. 测试环境

jmeter版本 :jmeter 2.4

grinder的版本 : Grinder 3

JAVA的版本:JDK 1.6

 

2. 测试代码

Jmeter测试代码

  1. public class Sampler {  
  2.     public void test() {  
  3.         return;  
  4.     }  
  5. }  

 

  1. public class JmeterTest extends AbstractJavaSamplerClient {  
  2.     Sampler sampler;  
  3.   
  4.     @Override  
  5.     public SampleResult runTest(JavaSamplerContext context) {  
  6.   
  7.         SampleResult results = new SampleResult();  
  8.   
  9.         results.sampleStart();  
  10.   
  11.         sampler.test();  
  12.   
  13.         results.sampleEnd();      
  14.   
  15.         results.setSuccessful(true);  
  16.   
  17.         return results;  
  18.   
  19.     }  
  20.   
  21.     @Override  
  22.     public void setupTest(JavaSamplerContext arg0) {  
  23.         sampler = new Sampler();  
  24.     }  
  25. }  

 

grinder测试代码

  1. public class Sampler {  
  2.   
  3.         public void test() {  
  4.                 return;  
  5.         }  
  6.   
  7. }  

 

  1. # Test.py  
  2. #  
  3. # A minimal script that tests The Grinder logging facility.  
  4. #  
  5. # This script shows the recommended style for scripts, with a  
  6. # TestRunner class. The script is executed just once by each worker  
  7. # process and defines the TestRunner class. The Grinder creates an  
  8. # instance of TestRunner for each worker thread, and repeatedly calls  
  9. # the instance for each run of that thread.  
  10.   
  11. from net.grinder.script.Grinder import grinder  
  12. from net.grinder.script import Test  
  13. from sampler import Sampler  
  14. test = Test(1, "Sample")  
  15. class TestRunner:  
  16.   
  17.     # This method is called for every run.  
  18.     def __call__(self):  
  19.         mySampler = test.wrap(Sampler())  
  20.         mySampler.test()  

 

Java本身多线程

  1. public static void test(int numOfThreads, int times) throws InterruptedException, ExecutionException {  
  2.         ExecutorService executor = Executors.newFixedThreadPool(numOfThreads);  
  3.         final Sampler sampler = new Sampler();  
  4.         List<Future<Long>> results = new ArrayList<Future<Long>>();   
  5.         for (int i = 0; i < times; i++) {  
  6.             results.add(executor.submit(new Callable<Long>() {  
  7.                 @Override  
  8.                 public Long call() throws Exception {  
  9.                         long begin = System.currentTimeMillis();  
  10.                         sampler.test();  
  11.                         long end = System.currentTimeMillis();  
  12.                     return end - begin;  
  13.                 }  
  14.             }));  
  15.         }  
  16.         executor.shutdown();  
  17.         while(!executor.awaitTermination(1, TimeUnit.SECONDS));  
  18.           
  19.         long sum = 0;  
  20.         for (Future<Long> result : results) {  
  21.             sum += result.get();  
  22.         }  
  23.           
  24.           
  25.         System.out.println("---------------------------------");  
  26.         System.out.println("number of threads :" + numOfThreads + " times:" + times);  
  27.         System.out.println("running time: " + sum + "ms");  
  28.         System.out.println("TPS: " + (double)(100000 * 1000) / (double)(sum));  
  29.         System.out.println();  
  30.     }  

3. 测试结果

10个线程 100000次运行

-- TPS
Jmeter     50426.10
Grinder   290275.76
Java threads 2.5E7

 

20个线程 100000次运行

-- TPS
Jmeter     49215.02
Grinder   225402.91
Java threads 2.5E7

 

50个线程 100000次运行

-- TPS
Jmeter  29312.61
Grinder 212242.13
Java threads 2.5E7

 

100个线程 100000次运行

-- TPS
Jmeter  29031.03
Grinder 245507.22
Java threads 2.5E7

 

200个线程 10000次运行(这里减少了一个0)

-- TPS
Jmeter     28039.87
Grinder   232801.77
Java threads 2.5E7

 

300个线程 10000次运行

-- TPS
Jmeter     27208.16
Grinder  236537.10
Java threads 1818181.81

 

1000个线程 10000次运行

-- TPS
Jmeter  27208.16
Grinder 236537.10
Java threads 2.5E7

 

4. 结论

    1. 可以看出Jmeter的本身性能开销是很大的,只适合一般应用的性能测试
    2. Grinder在测试的时候发现上下文切换比较严重,而可能是因为内部机制导致的开销较大的,当然如果测试memcache肯定是不适合的,但一般的应用测试基本上没有问题
    3. JAVA多线程本身并发框架性能开销也是有的,但是比较低,适合要求较高的性能测试,如对redis和memcache构建的应用进行压测

 

转:http://blog.csdn.net/techq/article/details/6628533

posted @ 2014-11-26 15:59  阳光温暖了心情  阅读(865)  评论(0编辑  收藏  举报