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
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)는 두 시스템이 서로 통신을 시작하기 전에 연결을 설정하고 통신 규약이나 파라미터 등을 협상하는 과정을 의미합니다. 이 용어는 실제로 두 사람이 인사를 나누기 위해 손을 맞잡는 행위에서 유래한 것으로, 컴퓨터 네트워크에서의 핸드쉐이크도 비슷한 의미를 가집니다. 즉, 두 시스템이 “인사를 나누고” 서로의 존재를 확인한 후에야 실제 데이터 교환을 시작할 수 있습니다.
데이터베이스와 같은 클라이언트-서버 모델에서 클라이언트는 서버에 연결을 시도할 때 핸드쉐이크 과정을 수행합니다. 이 과정에서는 다음과 같은 정보가 교환될 수 있습니다:
핸드쉐이크 과정은 통신의 안정성과 보안을 보장하기 위해 매우 중요합니다. 이 과정에서 문제가 발생하면, 예를 들어 “Handshake inactivity timeout” 오류처럼, 클라이언트와 서버 간의 연결이 제대로 이루어지지 않아 서로 간의 통신이 시작되지 못할 수 있습니다. 여기에는 몇 가지 가능한 원인과 해결 방법이 있습니다:
네트워크 지연: 데이터베이스 서버와의 네트워크 지연 또는 연결 문제로 인해 핸드셰이크가 시간 내에 완료되지 않을 수 있습니다. 네트워크 연결을 확인하고, 가능하다면 네트워크 지연을 최소화하기 위한 조치를 취해보세요.
서버 부하: 데이터베이스 서버가 과부하 상태일 경우, 연결 요청에 즉시 응답하지 못할 수 있습니다. 서버의 부하 상태를 확인하고, 필요하다면 서버 자원을 확장하거나 최적화하세요.
연결 타임아웃 설정 조정: 기본 연결 타임아웃 값이 너무 짧을 수 있습니다. 연결 타임아웃 값을 늘려서 문제가 해결되는지 확인해보세요. MySQL 연결 옵션에서 connectTimeout
값을 조정할 수 있습니다. 예를 들어, 타임아웃을 30초(30000밀리초)로 설정하려면 다음과 같이 할 수 있습니다:
const connection = mysql.createConnection({
host: 'example.org',
user: 'your_username',
password: 'your_password',
database: 'your_db',
connectTimeout: 30000 // 타임아웃 값을 30초로 설정
});
데이터베이스 설정 확인: 데이터베이스 서버의 설정을 확인하세요. 예를 들어, max_connections
설정이 너무 낮게 설정되어 있어 동시에 많은 연결 요청을 처리할 수 없을 경우 이 문제가 발생할 수 있습니다.
방화벽 또는 보안 그룹 설정: 서버 또는 클라이언트의 방화벽 설정이나 보안 그룹 설정이 데이터베이스 서버로의 연결을 차단하고 있을 수 있습니다. 해당 설정을 검토하여 MySQL 데이터베이스 서버로의 연결을 허용하는지 확인하세요.
로그 확인: 데이터베이스 서버의 로그를 확인하여 추가적인 오류 메시지나 원인을 찾아보세요. 서버 로그는 연결 문제의 원인을 파악하는 데 유용한 정보를 제공할 수 있습니다.
이러한 해결 방법들을 시도해보고 문제가 계속된다면, 데이터베이스 서버의 구성, 네트워크 인프라, 그리고 애플리케이션의 데이터베이스 연결 설정을 추가로 검토해야 할 수 있습니다.