TIL | 아틸러리 부하 테스트 보고서

bubblegum·2024년 4월 8일
0

Today I learn(TIL)

목록 보기
58/84
post-thumbnail
config:
  target: http://localhost:3000
  phases:
    - duration: 60
      arrivalRate: 1
      rampTo: 10
      name: Warm up phase
    - duration: 60
      arrivalRate: 10
      rampTo: 30
      name: Ramp up load
    - duration: 60
      arrivalRate: 30
      rampTo: 100
      name: Spike phase
  # Load & configure a couple of useful plugins
  # https://docs.art/reference/extensions
  ensure:
    thresholds:
      - http.response_time.p99: 100
      - http.response_time.p95: 75
  processor: './dist/create-dummy-one.js'
scenarios:
  - name: 'GET request online board'
    flow:
      - get:
          url: 'http://localhost:3000/online-boards'
# ./node_modules/.bin/artillery run ./asciiart-load-test.yaml
# ./node_modules/.bin/artillery run --output report.json ./asciiart-load-test.yaml
  1. Warm up phase: 처음 60초 동안 초당 1명의 사용자로 시작하여 60초가 끝날 때까지 사용자 수를 10명까지 점진적으로 증가시킵니다.
  2. Ramp up load: 다음 60초 동안 사용자 수를 초당 10명에서 시작하여 60초가 끝날 때까지 30명까지 점진적으로 증가시킵니다.
  3. Spike phase: 마지막 60초 동안 사용자 수를 초당 30명에서 시작하여 60초가 끝날 때까지 100명까지 급격히 증가시킵니다.
Test run id: trpz4_8brfbc4n385x68fcbzgqqfza7z4e4_z5kr
Phase started: Warm up phase (index: 0, duration: 60s) 15:06:52(+0900)

⠋ Error: Handshake inactivity timeout
    at Handshake.<anonymous> (/Users/t2023-m0021/node_modules/mysql/lib/protocol/Protocol.js:160:17)
    at Handshake.emit (node:events:518:28)
    at Handshake._onTimeout (/Users/t2023-m0021/node_modules/mysql/lib/protocol/sequences/Sequence.js:124:8)
    at Timer._onTimeout (/Users/t2023-m0021/node_modules/mysql/lib/protocol/Timer.js:32:23)
    at listOnTimeout (node:internal/timers:573:17)
    at process.processTimers (node:internal/timers:514:7)
    --------------------
    at Protocol._enqueue (/Users/t2023-m0021/node_modules/mysql/lib/protocol/Protocol.js:144:48)
    at Protocol.handshake (/Users/t2023-m0021/node_modules/mysql/lib/protocol/Protocol.js:51:23)
    at PoolConnection.connect (/Users/t2023-m0021/node_modules/mysql/lib/Connection.js:116:18)
    at Pool.getConnection (/Users/t2023-m0021/node_modules/mysql/lib/Pool.js:48:16)
    at /Users/t2023-m0021/Documents/Project/Participatory-Trial/node_modules/typeorm/driver/mysql/MysqlDriver.js:1012:18
    at new Promise (<anonymous>)
    at MysqlDriver.createPool (/Users/t2023-m0021/Documents/Project/Participatory-Trial/node_modules/typeorm/driver/mysql/MysqlDriver.js:1009:16)
    at MysqlDriver.connect (/Users/t2023-m0021/Documents/Project/Participatory-Trial/node_modules/typeorm/driver/mysql/MysqlDriver.js:305:36)
    at DataSource.initialize (/Users/t2023-m0021/Documents/Project/Participatory-Trial/node_modules/typeorm/data-source/DataSource.js:136:27)
    at createDummyData (/Users/t2023-m0021/Documents/Project/Participatory-Trial/dist/create-dummy-one.js:38:25) {
  code: 'PROTOCOL_SEQUENCE_TIMEOUT',
  fatal: true,
  timeout: 10000
}

"Handshake inactivity timeout" 오류는 MySQL 데이터베이스에 연결을 시도할 때 발생하는 흔한 문제 중 하나입니다. 이 오류는 주로 데이터베이스 서버와의 초기 핸드셰이크(handshake) 과정에서 지정된 시간 내에 응답이 없을 때 발생합니다.

핸드쉐이크(Handshake)는 두 시스템이 서로 통신을 시작하기 전에 연결을 설정하고 통신 규약이나 파라미터 등을 협상하는 과정을 의미합니다. 이 용어는 실제로 두 사람이 인사를 나누기 위해 손을 맞잡는 행위에서 유래한 것으로, 컴퓨터 네트워크에서의 핸드쉐이크도 비슷한 의미를 가집니다. 즉, 두 시스템이 “인사를 나누고” 서로의 존재를 확인한 후에야 실제 데이터 교환을 시작할 수 있습니다.

데이터베이스와 같은 클라이언트-서버 모델에서 클라이언트는 서버에 연결을 시도할 때 핸드쉐이크 과정을 수행합니다. 이 과정에서는 다음과 같은 정보가 교환될 수 있습니다:

  1. 인증 정보: 클라이언트가 서버에 접근할 권한이 있는지 확인하기 위한 사용자 이름, 비밀번호 등의 인증 정보.
  2. 프로토콜 버전: 클라이언트와 서버가 사용할 통신 프로토콜의 버전.
  3. 암호화 설정: 데이터를 암호화하여 전송할지 여부와 사용할 암호화 알고리즘.
  4. 기타 파라미터: 세션 타임아웃, 최대 패킷 크기 등과 같은 추가적인 연결 파라미터.

핸드쉐이크 과정은 통신의 안정성과 보안을 보장하기 위해 매우 중요합니다. 이 과정에서 문제가 발생하면, 예를 들어 “Handshake inactivity timeout” 오류처럼, 클라이언트와 서버 간의 연결이 제대로 이루어지지 않아 서로 간의 통신이 시작되지 못할 수 있습니다. 여기에는 몇 가지 가능한 원인과 해결 방법이 있습니다:

  1. 네트워크 지연: 데이터베이스 서버와의 네트워크 지연 또는 연결 문제로 인해 핸드셰이크가 시간 내에 완료되지 않을 수 있습니다. 네트워크 연결을 확인하고, 가능하다면 네트워크 지연을 최소화하기 위한 조치를 취해보세요.

  2. 서버 부하: 데이터베이스 서버가 과부하 상태일 경우, 연결 요청에 즉시 응답하지 못할 수 있습니다. 서버의 부하 상태를 확인하고, 필요하다면 서버 자원을 확장하거나 최적화하세요.

  3. 연결 타임아웃 설정 조정: 기본 연결 타임아웃 값이 너무 짧을 수 있습니다. 연결 타임아웃 값을 늘려서 문제가 해결되는지 확인해보세요. MySQL 연결 옵션에서 connectTimeout 값을 조정할 수 있습니다. 예를 들어, 타임아웃을 30초(30000밀리초)로 설정하려면 다음과 같이 할 수 있습니다:

    const connection = mysql.createConnection({
      host: 'example.org',
      user: 'your_username',
      password: 'your_password',
      database: 'your_db',
      connectTimeout: 30000 // 타임아웃 값을 30초로 설정
    });
  4. 데이터베이스 설정 확인: 데이터베이스 서버의 설정을 확인하세요. 예를 들어, max_connections 설정이 너무 낮게 설정되어 있어 동시에 많은 연결 요청을 처리할 수 없을 경우 이 문제가 발생할 수 있습니다.

  5. 방화벽 또는 보안 그룹 설정: 서버 또는 클라이언트의 방화벽 설정이나 보안 그룹 설정이 데이터베이스 서버로의 연결을 차단하고 있을 수 있습니다. 해당 설정을 검토하여 MySQL 데이터베이스 서버로의 연결을 허용하는지 확인하세요.

  6. 로그 확인: 데이터베이스 서버의 로그를 확인하여 추가적인 오류 메시지나 원인을 찾아보세요. 서버 로그는 연결 문제의 원인을 파악하는 데 유용한 정보를 제공할 수 있습니다.

이러한 해결 방법들을 시도해보고 문제가 계속된다면, 데이터베이스 서버의 구성, 네트워크 인프라, 그리고 애플리케이션의 데이터베이스 연결 설정을 추가로 검토해야 할 수 있습니다.

profile
황세민

0개의 댓글

관련 채용 정보