웹 서비스의 성능 테스트를위한 JMeter 테스트 계획을 작성 중입니다. 전체 시험 계획의 주요 부분은 두 단계로 구성됩니다.JMeter 커스텀 샘플러 동기화
- 나는 singlethreaded를 사용하는 경우
- 이 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() 구현을 위해 동기화를 사용하여 구식 방법을 시도했지만, 그 중 하나도 작동하지 않는다.
누구에게 변경해야 할 사항이 있습니까? 아니면 적어도 이것이 왜 작동하지 않는지에 대한 설명이 필요합니까?
미리 감사드립니다.
안녕하세요 드미트리, 답변 해 주셔서 감사합니다. 나는 이미 이러한 접근법을 시도했다. 첫 번째 단점은 스레드 수가 비례 할 때 문제가되지 않는다는 것입니다 (부하 테스트를 위해 최대 100 개의 스레드를 사용할 수 있기를 바랍니다 ...). 이러한 시나리오에서는 어떤 스레드가 어떤 ID를 얻는 지 규칙을 정의하는 것이 점점 더 어려워집니다. Beanshell 스크립팅 접근법은 경쟁 조건에 빠질 수있는 원래의 방식과 동일한 단점을 가지고 있습니다. 예를 들어, 1 스레드가 목록을 검색하여 변수에 기록 할 때 다른 스레드는 이미 값을 제거하는 경우입니다. – Patze