Alibaba Cloud 성능 테스트 도구 JMeter를 사용하여 시나리오에서 RocketMQ 스트레스 테스트에 대한 모범 사례

작가 : 모리모토

수요 배경

새로운 비즈니스가 온라인에 진출하기 전에 일반적으로 시스템의 다양한 미들웨어에 대해 스트레스 테스트를 수행하여 현재 구성에서 미들웨어가 견딜 수 있는 트래픽의 상한을 찾아 업스트림의 현재 제한 규칙을 결정해야 합니다. 갑작스러운 트래픽으로 인한 시스템 붕괴를 방지하기 위한 링크입니다. Alibaba Cloud PTS의 JMeter 스트레스 테스트는 사용자가 사용자 정의 JMeter 스크립트를 업로드하도록 지원하고 PTS의 강력한 분산 스트레스 테스트 기능을 사용하여 사용자 정의 논리에 따라 시스템의 다양한 미들웨어에 대한 스트레스 테스트를 수행할 수 있습니다. 아래에서는 JMeter5.5 및 RocketMQ5.0 시리즈를 예로 들어 PTS의 JMeter 시나리오를 사용하여 RocketMQ 스트레스 테스트 방법을 자세히 소개하겠습니다.

전제 조건

  1. JMeter는 로컬로 설치됩니다.
  2. RocketMQ는 Alibaba Cloud ECS에 배포되었습니다(이 문서에서는 8C32G 사양의 ECS를 선택했습니다).
  3. Alibaba Cloud에서 PTS 서비스가 활성화되었습니다.

스트레스 테스트 과정

JMeter는 확장성이 뛰어난 JavaSampler를 제공하며 AbstractJavaSamplerClient 클래스를 상속하여 RocketMQ의 스트레스 테스트를 구현함으로써 JavaSampler에서 실행되는 논리를 사용자 정의할 수 있습니다.

1단계: Maven 프로젝트 생성 및 종속성 도입

  1. 새 Maven 프로젝트를 만들고 pom 파일에 다음 종속성을 도입합니다.
<dependency>
  <groupId>org.apache.jmeter</groupId>
  <artifactId>ApacheJMeter_java</artifactId>
  <version>5.5</version>
  <scope>provided</scope>
</dependency>
<dependency>
  <groupId>org.apache.rocketmq</groupId>
  <artifactId>rocketmq-client</artifactId>
  <version>4.9.5</version>
</dependency>

ApacheJMeter_java는 JMeter JavaSampler의 종속성이며 Rocketmq-client는 RocketMQ의 클라이언트 종속성입니다(여기서는 버전 4.x의 클라이언트가 버전 5.x의 서버 인스턴스와 호환되므로 버전 4.x를 사용하지만 버전 5는 .x 클라이언트는 버전 4.x의 서버 인스턴스와 호환되지 않으며 필요에 따라 조정할 수 있습니다. 그 중 ApacheJMeter_java의 종속성 범위는 제공한 대로 정의되어 있으며, JAR 패키지는 이미 JMeter의 lib/ext 디렉터리에 있으므로 종속성을 함께 패키징할 필요는 없습니다.

  1. pom 파일에 maven-assemble-plugin 플러그인을 도입하고 여기에서 "jar-with-dependent" 패키징 방법을 사용하여 프로젝트의 필수 종속성과 프로젝트 코드를 동일한 JAR 패키지에 패키징합니다. 그런 다음 JAR만 업로드할 수 있습니다. 패키지를 PTS로 JMeter 환경에서는 여러 종속 JAR 패키지를 업로드할 필요가 없습니다.
<build>
  <finalName>jmeter-rocketmq4</finalName>
  <plugins>
    <plugin>
      <artifactId>maven-assembly-plugin</artifactId>
      <version>3.4.2</version>
      <configuration>
        <!-- 打包方式 -->
        <descriptorRefs>
          <descriptorRef>jar-with-dependencies</descriptorRef>
        </descriptorRefs>
      </configuration>
      <executions>
        <execution>
          <id>make-assembly</id>
          <phase>package</phase>
          <goals>
            <goal>single</goal>
          </goals>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>

2단계: AbstractJavaSamplerClient의 새 하위 클래스 생성 및 관련 메서드 다시 작성

AbstractJavaSamplerClient 클래스는 setupTest, runTest, TeardownTest 및 getDefaultParameters의 네 가지 메소드를 포함하는 JavaSamplerClient 인터페이스를 상속합니다.

  • 설정테스트

    JMeter는 테스트의 각 스레드에 대해 JavaSamplerClient 구현 인스턴스를 생성합니다. 테스트가 시작되면 각 스레드의 JavaSamplerClient 인스턴스에서 setupTest가 호출되어 클라이언트를 초기화합니다. 이 경우 RocketMQ 생산자가 초기화됩니다.

  • 테스트 실행

    각 스레드는 반복당 한 번씩 runTest 메소드를 호출하며, 이 예에서는 runTest 메소드에서 메시지 전송 메소드와 샘플링 결과 설정 로직을 정의해야 합니다.

  • 분해테스트

    설정된 횟수 또는 시간만큼 반복한 후 이 메서드가 실행됩니다.이 예에서는 이 메서드에서 생산자를 닫아야 합니다.

  • getDefaultParameters

    이 메소드는 JavaSamplerContext를 통해 위 메소드에 전달되는 매개변수 목록을 정의하며, 이 메소드에 정의된 매개변수는 JMeter JavaRequest Sampler의 GUI 인터페이스에서 설정할 수 있습니다. 이 예에서는 RocketMQ의 브로커 주소와 주제 이름이 필요합니다. , 메시지 키, 메시지 내용 및 기타 매개변수를 정의합니다.

새 하위 클래스를 생성하기 위한 참조는 다음과 같습니다.

import java.nio.charset.StandardCharsets;
import org.apache.jmeter.config.Arguments;
import org.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient;
import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext;
import org.apache.jmeter.samplers.SampleResult;
import org.apache.rocketmq.client.exception.MQBrokerException;
import org.apache.rocketmq.client.exception.MQClientException;
import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.common.message.Message;
import org.apache.rocketmq.remoting.exception.RemotingException;

public class JavaSamplerForRocketMQ extends AbstractJavaSamplerClient {
    private DefaultMQProducer producer;
    private static final String NAME_SRV_ADDRESS = "nameSrvAddress";
    private static final String TOPIC = "topic";
    private static final String PRODUCER_GROUP = "producer group";
    private static final String MSG_BODY = "messageBody";
    private static final String MSG_KEY = "messageKey";
    private static final String MSG_TAG = "messageTag";
    private static final String ERROR_CODE = "500";

    @Override
    public void setupTest(JavaSamplerContext javaSamplerContext) {

        try {
            // 初始化producer
            producer = new DefaultMQProducer(javaSamplerContext.getParameter(PRODUCER_GROUP));
            producer.setNamesrvAddr(javaSamplerContext.getParameter(NAME_SRV_ADDRESS));
            producer.start();
        } catch (MQClientException e) {
            throw new RuntimeException(e);
        }

    }

    @Override
    public SampleResult runTest(JavaSamplerContext javaSamplerContext) {
        SampleResult sampleResult = new SampleResult();
        sampleResult.setSampleLabel("rocketmq-producer");
        // 请求开始
        sampleResult.sampleStart();
        // 普通消息发送
        Message message = new Message(
            javaSamplerContext.getParameter(TOPIC),
            javaSamplerContext.getParameter(MSG_TAG),
            javaSamplerContext.getParameter(MSG_BODY).getBytes()
        );
        try {
            // 发送消息,需要关注发送结果,并捕获失败等异常。
            SendResult sendResult = producer.send(message);
            // 设置发送请求的字节数
            sampleResult.setSentBytes(message.toString().getBytes(StandardCharsets.UTF_8).length);
            sampleResult.setDataType(SampleResult.TEXT);
            // 设置请求内容
            sampleResult.setSamplerData(message.toString());
            // 设置响应内容
            sampleResult.setResponseData(String.format("Msg Id:%s", sendResult.getMsgId()).getBytes());
            sampleResult.setSuccessful(true);
            sampleResult.setResponseCodeOK();
        } catch (MQBrokerException | InterruptedException | RemotingException | MQClientException e) {
            sampleResult.setSuccessful(false);
            sampleResult.setResponseCode(ERROR_CODE);
            sampleResult.setResponseData(String.format("Error Msg:%s", e).getBytes());
            return sampleResult;
        } finally {
            // 请求结束
            sampleResult.sampleEnd();
        }
        return sampleResult;
    }

    @Override
    public void teardownTest(JavaSamplerContext javaSamplerContext) {
        producer.shutdown();
    }

    @Override
    public Arguments getDefaultParameters() {
        Arguments arguments = new Arguments();
        arguments.addArgument(NAME_SRV_ADDRESS, "");
        arguments.addArgument(PRODUCER_GROUP, "");
        arguments.addArgument(TOPIC, "");
        arguments.addArgument(MSG_KEY, "");
        arguments.addArgument(MSG_TAG, "");
        arguments.addArgument(MSG_BODY, "");
        return arguments;
    }
}

3단계: 프로젝트를 JAR 파일로 패키징

mvn clean 패키지를 통해 프로젝트를 패키징합니다. 대상 디렉터리에 jmeter-rocketmq4.jar 및 jmeter-rocketmq4-jar-with-dependents.jar라는 두 개의 JAR 패키지가 있습니다. 그 중 jmeter-rocketmq4-jar-with-dependents .jar에는 모든 필수 종속성이 포함되어 있습니다. 후속 단계에서 이 JAR 패키지를 사용하세요.

.
├── pom.xml
├── src
│   ├── main
│   │   ├── java
│   │   │   └── JavaSamplerForRocketMQ4.java
│   │   └── resources
│   └── test
│       └── java
└── target
    ├── jmeter-rocketmq4-jar-with-dependencies.jar
    ├── jmeter-rocketmq4.jar

4단계: 스크립팅 및 디버깅을 위해 JMeter GUI 사용

  1. 패키지된 JAR 패키지와 종속 JAR 패키지를 JMETER_HOME/lib/ext 디렉터리에 복사한 다음 JMETER_HOME/bin/jmeter 명령을 실행하여 JMeter GUI를 엽니다.

  2. 새 스레드 그룹을 생성한 후 Java 요청 샘플러를 추가합니다.

  1. 드롭다운 상자에서 2단계에서 추가한 클래스를 선택하고(그림과 정확히 동일하지 않을 수 있으며 클래스의 실제 정규화된 이름에 따라 선택) 아래 관련 매개변수를 입력합니다.

  1. 스레드 그룹에 "View Result Tree" 및 "Summary Report" 리스너를 추가한 다음 테스트 계획을 시작하고 테스트 결과가 결과 트리 및 요약 보고서에서 예상한 대로인지 확인합니다.

  2. 테스트 계획을 JMX 파일로 저장합니다.

5단계: 스트레스 테스트를 위해 PTS에서 JMeter 시나리오 생성

  1. PTS 콘솔에서 JMeter 환경을 생성하고 3단계에서 패키징한 JAR 패키지를 JMeter 환경에 업로드합니다(자세한 내용은 JMeter 환경 관리 보기, 수정 및 생성_성능 테스트-Alibaba Cloud 도움말 센터 [ 1] 참조 ).

a. PTS 콘솔에 들어가서 "JMeter 환경"을 선택합니다.

b. 사용자 정의된 환경 이름을 입력합니다.

c. 클릭하여 파일을 업로드하고 3단계에서 패키지된 JAR 패키지를 선택합니다.

d. 저장을 클릭합니다.

  1. PTS 콘솔 생성 시나리오에서 "JMeter Stress Test" 시나리오를 선택합니다.

  1. "장면 구성" 편집:

a. 사용자 정의 장면 이름;

b. Upload File(파일 업로드)을 클릭하고 4단계에서 저장한 JMX 파일을 선택합니다.

c. "종속 환경을 사용하시겠습니까?" 드롭다운 상자에서 "예, 종속 환경을 사용합니다"를 선택합니다.

d. "종속 환경 선택" 드롭다운 상자에서 방금 생성한 JMeter 환경을 선택합니다.

  1. 압력 구성:

작은 제안: 스트레스 테스트를 통해 RocektMQ가 ​​견딜 수 있는 최대 동시 요청 수를 찾고 싶기 때문에 RocektMQ의 압력 견딜 수 있는 용량을 직접 측정할 수 있는 RPS 모드를 선택하는 것이 좋습니다. 동시에 공용 네트워크 대역폭의 제한을 고려하여 Alibaba Cloud VPC 인트라넷 스트레스 테스트를 선택해야 합니다.

a. 압력 소스를 Alibaba Cloud VPC 인트라넷으로 선택하고 스트레스 테스트를 위해 RocketMQ가 배포된 ECS가 있는 지역을 선택합니다.

b. ECS의 VPC, 보안 그룹 및 스위치를 설정합니다. VPC 및 보안 그룹은 ECS와 동일해야 하며 해당 포트는 보안 그룹(ECS 콘솔에서 설정)에서 열려 있어야 합니다.

c. 압력 모드를 RPS 모드로 설정합니다.

d. 시작 RPS, 최대 RPS 및 스트레스 테스트 기간을 설정합니다. 이 문서에서는 2분 동안 시작 RPS를 90000으로, 최대 RPS를 110000으로 설정합니다.

e.지정된 루프는 일반적으로 No로 설정되는데, 이는 한 번 실행되고 종료된다는 의미입니다.지정된 IP 번호는 설정된 RPS에 따라 자동으로 생성됩니다.

  1. 나머지 설정은 필요에 따라 JMeter Stress Test_Performance Test-Alibaba Cloud 도움말 센터 [ 2] 를 참조하세요 .

  2. 구성을 저장하고 시나리오를 디버그한 후 RocketMQ와의 연결을 확인한 후 스트레스 테스트를 시작합니다.

6단계: 스트레스 테스트 보고서 보기

JMeter의 스트레스 테스트 보고서에 대한 일반적인 해석은 JMeter 스트레스 테스트 데이터, 샘플링 로그 및 압력 어플리케이터를 보는 방법 Performance_Performance Testing-Alibaba Cloud 도움말 센터 [ 3] 를 참조하십시오 . 다음 섹션에서는 PTS의 스트레스 테스트 보고서를 사용하여 찾는 방법을 소개합니다. RocketMQ.압력 지지 용량.

보고서 해석

  1. 먼저, 전체 스트레스 테스트의 개요 정보와 지표 추세를 확인하세요. 아래 그림과 같이 보고서의 첫 번째 열에는 전체 스트레스 테스트 프로세스에 대한 요청 성공률, 평균 RT, 평균 TPS 및 기타 지표가 표시되며, 이러한 지표에 대한 구체적인 설명은 공식 문서에서 확인할 수 있습니다. 동시에 성공률 추세 차트에 따르면 18:54:05부터 성공률은 점차 변동 및 감소하며, 이때 TPS 값은 9.55W로 처음 5초 동안의 평균 TPS를 의미합니다. 18:54:05에 계산하면 약 9.55W입니다.

  1. 둘째, 스트레스 테스트 보고서의 Prometheus 모니터링 데이터를 사용하여 결과를 추가로 분석합니다. Alibaba Cloud ARMS의 Prometheus 및 Grafana 제품의 도움으로 PTS의 스트레스 테스트 보고서는 처리량, 성공률 및 응답 시간을 포함한 타이밍 다이어그램을 제공할 수 있습니다. 동시에 사용자는 PromQL 문을 사용하여 데이터 패널을 편집하고 필요한 항목을 유연하게 쿼리할 수 있습니다. 이 기사에서는 추가 분석을 위해 성공률과 처리량을 패널에 넣을 수 있습니다.

a. 먼저 "성공률(시계열)"을 클릭한 다음 "편집"을 클릭하여 성공률 대시보드의 편집 인터페이스로 들어가서 PromQL 성공률 쿼리를 복사합니다.

sum(rate(pts_api_response_total{task_id="$task_id", code=~"200|302"}[5s]))/sum(rate(pts_api_response_total{task_id="$task_id"}[5s]))

b. 그런 다음 처리량 대시보드의 편집 인터페이스에 들어가서 가상 사용자 수의 PromQL을 성공률의 PromQL로 바꾸고 Grafana의 관련 구성을 변경하면(아래 그림의 빨간색 상자) 처리량과 성공률을 보여주는 패널

이 패널에 표시되는 데이터의 통계적 정확도는 1초로 보다 정확한 데이터를 얻을 수 있으며, 18:54:05초부터 성공률이 감소하기 시작하며 이때 TPS는 96561.9입니다.

c. RocketMQ의 성능을 더 잘 평가하기 위해 성공률이 100%를 유지하는 시간 범위 내의 평균 TPS를 계산할 수도 있습니다. 먼저 성공률이 100%일 때의 지속 시간(그림에서 47초)을 구합니다. TPS 지표의 시간 범위를 47초로 변경하여 각 지점이 이전 47초의 평균 TPS를 나타냄 성공률이 100%인 마지막 시간으로 마우스를 이동합니다. 현재 시간은 성공률 100%의 시간 범위이며, 그 이내의 평균 TPS는 89357.5입니다.

  1. 마지막으로 다양한 매개변수 설정이 RocketMQ 성능에 미치는 영향을 비교하고 RocketMQ 스트레스 테스트에서 PTS의 가용성을 확인하기 위해 간단한 비교 실험을 수행하고 jstat 명령을 사용하여 다양한 매개변수가 가비지 수집에 미치는 영향을 관찰했습니다.

실험 결과에 따르면 현재 ECS 구성으로 배포된 RocketMQ의 경우 힙 메모리를 적절하게 늘리면 RocketMQ의 성능이 효과적으로 향상될 수 있으며, 힙 메모리를 24g으로 늘리면(이 경우 ECS 메모리 사용량은 85.39%에 도달) 성능이 향상됩니다. 크게 개선되지는 않았으나 적절하게 sendMessageThreadPoolNums 값을 높이면 RocketMQ의 성능이 향상될 수 있지만, sendMessageThreadPoolNums가 16을 초과하면 성능이 크게 향상되지 않거나 약간 감소하기도 합니다. 사용자는 실제 조건을 기반으로 보다 자세한 비교 실험을 수행하여 배포된 RocketMQ의 내압 성능을 완전히 평가할 수 있습니다.

결론

이 기사에서는 Alibaba Cloud PTS의 JMeter 시나리오를 사용하여 RocketMQ를 스트레스 테스트하는 세부 단계를 소개하고 각 링크를 하나씩 설명하며, 마지막으로 스트레스 테스트 보고서의 맞춤형 분석을 통해 PTS의 강력한 스트레스 테스트 결과 분석 기능을 보여줍니다. JMeter와 PTS의 도움으로 사용자는 다양한 유형의 미들웨어에 대해 유연하고 다차원적인 분석을 수행하여 안정적이고 강력한 시스템을 구축할 수 있습니다.

최신 이벤트 및 무료 평가판

관련된 링크들:

[1] JMeter 환경 관리 보기, 수정 및 생성_성능 테스트-Alibaba Cloud 도움말 센터

https://help.aliyun.com/document_detail/170857.html?spm=a2c4g.103173.0.0.292c20f8wnWyCV

[2] JMeter 스트레스 테스트_성능 테스트-Alibaba Cloud 도움말 센터

https://help.aliyun.com/document_detail/97876.html?spm=a2c4g.91788.0.0.2fde6f338aHIDI

[3] JMeter 스트레스 테스트 데이터, 샘플링 로그 및 압력 기계 성능을 보는 방법_성능 테스트-Alibaba Cloud 도움말 센터

https://help.aliyun.com/document_detail/127454.html?spm=a2c4g.94066.0.0.4a5164bepHmzWD

잘 알려진 오픈 소스 프로젝트의 저자는 열광으로 인해 직장을 잃었습니다 - "온라인에서 돈을 구하다" No Star, No Fix 2023 세계 10대 엔지니어링 성과 발표: ChatGPT, Hongmeng 운영 체제, 중국 우주 정거장 및 기타 엄선된 ByteDance OpenAI에서 '금지' Google, 2023년 가장 인기 있는 Chrome 확장 프로그램 발표 Ni Guangnan 학자: 샤오미 휴대폰 BL 잠금 해제를 위해 국산 SSD가 수입 HDD를 대체하길 바라나요 ? 먼저 Java 프로그래머 인터뷰 질문을 해보세요. Arm은 70명 이상의 중국 엔지니어를 해고하고 중국 소프트웨어 사업을 재편할 계획입니다. OpenKylin 2.0 공개 | UKUI 4.10 더블 다이아몬드 디자인, 아름답고 고품질! Manjaro 23.1 출시, 코드명 "Vulcan"
{{o.이름}}
{{이름}}

Supongo que te gusta

Origin my.oschina.net/u/3874284/blog/10322817
Recomendado
Clasificación