2014-05-13 3 views
0

웹 서비스의 성능 테스트를위한 JMeter 테스트 계획을 작성 중입니다. 전체 시험 계획의 주요 부분은 두 단계로 구성됩니다.JMeter 커스텀 샘플러 동기화

  1. 나는 singlethreaded를 사용하는 경우
  2. 이 ID 중 하나를 가지고 그것으로 뭔가를 할

(후 요청을 통해) (GET 요청을 통해) 서버에서 ID 목록을 검색 계획대로 모든 것이 예상대로 작동하지만 두 개 이상의 스레드를 사용하는 즉시 경쟁 조건이됩니다. 문제는 2 단계에서 사용 가능한 ID 목록을 변경한다는 것입니다. 즉, 스레드 B가 스레드 2가 완료되기 전에 ID 목록을 검색하면 스레드 B는 스레드 B와 동일한 ID를 얻고 스레드 B와 오류가 발생합니다 2 단계를 수행하려고 시도합니다. 어떻게 든 멀티 스레드 환경에서 경쟁 조건의 고전적인 예입니다. JMeter는 중요한 코드 블록을 정의 할 수있는 가능성을 제공하지 않기 때문에 JMeter-AbstractJavaSamplerClient를 확장 한 자체 사용자 정의 Java 샘플러를 작성하여 runTest() a.s.o를 재정의했습니다. runTest() - 구현 내에서 ReentrantLock을 획득하고이를 사용하여 중요한 코드 블록을 잠급니다. 요점은 JMeter가 잠금 장치에 신경 쓰지 않는 것 같아요. 이유는 모르겠지만 ... Eclipse를 사용하여 원격 디버깅을 통해 코드를 디버깅 할 경우 여러 스레드가 잠긴 코드를 동시에 참조하는 것을 볼 수 있습니다 , 그것은 사실이 아니어야한다. 나는 또한 완전한 runTest() 구현을 위해 동기화를 사용하여 구식 방법을 시도했지만, 그 중 하나도 작동하지 않는다.

누구에게 변경해야 할 사항이 있습니까? 아니면 적어도 이것이 왜 작동하지 않는지에 대한 설명이 필요합니까?

미리 감사드립니다.

답변

0

샘플러를 직접 작성하지 않고도 작업 할 수있는 방법에는 두 가지 옵션이 있습니다.

  1. 쉬운 가장 간단한 해결 방법은 각각의 쓰레드는 자신의 ID 현재 어떤 것을 보장하는 범위 내에서 사용되는 변수를 제거
  2. 사용으로 Beanshell 스크립트를 동작 할 ID를 파라미터로서 __threadNum 함수를 사용 다른 스레드가 동일한 변수를 선택합니다.

으로 Beanshell 테스트 요소 (샘플러, 포스트 프로세서, 프리 프로세서, 어설 등)의 상관는 JMeterVariables 클래스 인스턴스에 대한 속기 vars라는 뭔가에 대한 액세스를 제공합니다. 따라서 다음을 사용할 수 있어야합니다.

vars.put("key", "value"); // to add a variable 
vars.remove("key"); // to remove variable 

메쏘드.

Beanshell 요리 책에 대한 자세한 내용 및 종류는 How to use BeanShell: JMeter's favorite built-in component 안내서를 참조하십시오.

+0

안녕하세요 드미트리, 답변 해 주셔서 감사합니다. 나는 이미 이러한 접근법을 시도했다. 첫 번째 단점은 스레드 수가 비례 할 때 문제가되지 않는다는 것입니다 (부하 테스트를 위해 최대 100 개의 스레드를 사용할 수 있기를 바랍니다 ...). 이러한 시나리오에서는 어떤 스레드가 어떤 ID를 얻는 지 규칙을 정의하는 것이 점점 더 어려워집니다. Beanshell 스크립팅 접근법은 경쟁 조건에 빠질 수있는 원래의 방식과 동일한 단점을 가지고 있습니다. 예를 들어, 1 스레드가 목록을 검색하여 변수에 기록 할 때 다른 스레드는 이미 값을 제거하는 경우입니다. – Patze

0

마침내 실행되고 있습니다 ... 내 잠금이 정적이라고 선언하지 않았습니다 ... 따라서 여러 스레드가 중요한 코드 블록에 들어간 것일 수 있습니다.

1

또 다른 해결 방법은 간단한 자바 클래스를 컴파일하여 컴파일하고 {JMETER_HOME}\apache-jmeter-3.1\lib\ext\ 폴더에 넣는 것입니다.{JMETER_HOME}\apache-jmeter-3.1\lib\ext\ 폴더에

jar cvfe {EXPORT_JAR_NAME}.jar ClassName {CLASS_FILE_NAME}.class 

배치 파일을 CMD

를 사용하여 jar 파일에

import java.util.*; 

public class Global { 
    public static Map map = new Hashtable(); 
} 

수출을.

테스트 작업을 생성하고 다른 테스트 활동 만들기 테스트 계획에 Show Image

import java.util.concurrent.Semaphore; 

Global.map.clear(); 

Global.map.put("sem", new Semaphore(1));; 

을 JSR223 처리기를 추가하고 Show Image

log.info(ctx.getThreadNum() + " ACQUIRE"); 
Global.map.get("sem").acquire(); 
for (def i = 0; i < 100; i++) { 
    // Do something 
    log.info(ctx.getThreadNum() + " DO SOMETHING " + i); 
} 
Global.map.get("sem").release(); 
log.info(ctx.getThreadNum() + " RELEASE"); 

그것은 극복해야 시험 계획에 JSR223 처리기를 추가 Semaphore와 같은 경쟁 조건은 스레드 그룹간에 동기화됩니다.

관련 문제