티스토리 뷰

728x90

 

 

대규모 트래픽 처리: Node.js와 Artillery로 부하 테스트 시작하기

 

 서버가 대규모 트래픽을 견딜 수 있는지 확인하기 위해서는 부하 테스트가 필수입니다. 이번 글에서는 Node.jsArtillery를 활용해 부하 테스트를 진행하는 방법과 결과 분석까지의 전 과정을 소개합니다.

 

 

 

1. Node.js 설치

 Artillery는 Node.js 기반의 도구이므로, 먼저 Node.js를 설치해야 합니다.

 

Windows

1. https://nodejs.org/en 에서 LTS (Long Term Support) 버전을 다운로드합니다.

2. 설치 파일(.msi)을 실행하고, 설치 과정에서 npm 포함 옵션을 확인합니다.

3. 설치 후 명령 프롬프트를 열고 다음 명령어로 설치 확인.

node -v
npm -v

 

macOS

1. https://nodejs.org/en 에서 LTS 버전 다운로드 및 설치.

2. 설치 완료 후 터미널에서 확인.

node -v
npm -v

 

Linux

1. Node.js 저장소를 추가하고 설치합니다

curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -
sudo apt-get install -y nodejs
node -v
npm -v

 

 

2. npm 설치

  npm은 Node.js에 포함되어 기본적으로 설치됩니다. 그러나 최신 버전으로 업데이트하는 것이 좋습니다.

 

npm 업데이트

npm install -g npm

 

업데이트가 완료되면 버전을 확인합니다.

npm -v

 

 

3. Artillery 설치

 Artillery는 Node.js 기반의 부하 테스트 도구로, 간단한 명령어만으로 다양한 테스트를 수행할 수 있습니다.

 

글로벌 설치

터미널 또는 명령 프롬프트에서 아래 명령어를 실행

npm install -g artillery

 

설치가 완료되었는지 확인

artillery --version

 

 

4. Artillery로 부하 테스트 진행

간단한 부하 테스트 실행

 

 Artillery의 quick 명령어를 사용하면 간단한 부하 테스트를 빠르게 실행할 수 있습니다.

다음 명령어로 테스트 실행:

npx artillery quick --count 100 --num 50 https://example.com/api/endpoint

설명

  • --count 100: 100명의 가상 사용자를 생성합니다.
  • --num 50: 각 사용자가 50번의 요청을 보냅니다.
  • https://example.com/api/endpoint: 테스트할 대상 URL입니다.

결과 Report

Test run id: trxgj_gjtnc5tza36px8rht9bawttwxhy5b_wexk
Phase started: unnamed (index: 0, duration: 1s) 11:51:35(+0900)

--------------------------------------
Metrics for period to: 11:51:40(+0900) (width: 4.584s)
--------------------------------------

http.codes.200: ................................................................ 5730
http.request_rate: ............................................................. 1269/sec
http.requests: ................................................................. 5774
http.response_time:
  min: ......................................................................... 2
  max: ......................................................................... 97
  mean: ........................................................................ 22.5
  median: ...................................................................... 19.9
  p95: ......................................................................... 44.3
  p99: ......................................................................... 62.2
http.response_time.2xx:
  min: ......................................................................... 2
  max: ......................................................................... 97
  mean: ........................................................................ 22.5
  median: ...................................................................... 19.9
  p95: ......................................................................... 44.3
  p99: ......................................................................... 62.2
http.responses: ................................................................ 5730
vusers.created: ................................................................ 187
vusers.created_by_name.0: ...................................................... 187


--------------------------------------
Metrics for period to: 11:51:50(+0900) (width: 9.999s)
--------------------------------------

http.codes.200: ................................................................ 14520
http.request_rate: ............................................................. 1454/sec
http.requests: ................................................................. 14509
http.response_time:
  min: ......................................................................... 1
  max: ......................................................................... 108
  mean: ........................................................................ 25.6
  median: ...................................................................... 22
  p95: ......................................................................... 58.6
  p99: ......................................................................... 74.4
http.response_time.2xx:
  min: ......................................................................... 1
  max: ......................................................................... 108
  mean: ........................................................................ 25.6
  median: ...................................................................... 22
  p95: ......................................................................... 58.6
  p99: ......................................................................... 74.4
http.responses: ................................................................ 14520
vusers.completed: .............................................................. 247
vusers.created: ................................................................ 244
vusers.created_by_name.0: ...................................................... 244
vusers.failed: ................................................................. 0
vusers.session_length:
  min: ......................................................................... 4652.9
  max: ......................................................................... 7485.6
  mean: ........................................................................ 6653.5
  median: ...................................................................... 6976.1
  p95: ......................................................................... 7407.5
  p99: ......................................................................... 7407.5


--------------------------------------
Metrics for period to: 11:52:00(+0900) (width: 9.999s)
--------------------------------------

http.codes.200: ................................................................ 13512
http.request_rate: ............................................................. 1363/sec
http.requests: ................................................................. 13624
http.response_time:
  min: ......................................................................... 1
  max: ......................................................................... 104
  mean: ........................................................................ 24.3
  median: ...................................................................... 21.1
  p95: ......................................................................... 68.7
  p99: ......................................................................... 85.6
http.response_time.2xx:
  min: ......................................................................... 1
  max: ......................................................................... 104
  mean: ........................................................................ 24.3
  median: ...................................................................... 21.1
  p95: ......................................................................... 68.7
  p99: ......................................................................... 85.6
http.responses: ................................................................ 13512
vusers.completed: .............................................................. 224
vusers.created: ................................................................ 227
vusers.created_by_name.0: ...................................................... 227
vusers.failed: ................................................................. 0
vusers.session_length:
  min: ......................................................................... 7421.4
  max: ......................................................................... 8339.5
  mean: ........................................................................ 7948.4
  median: ...................................................................... 8024.5
  p95: ......................................................................... 8352
  p99: ......................................................................... 8352


--------------------------------------
Metrics for period to: 11:52:10(+0900) (width: 9.999s)
--------------------------------------

http.codes.200: ................................................................ 12947
http.request_rate: ............................................................. 1297/sec
http.requests: ................................................................. 12972
http.response_time:
  min: ......................................................................... 1
  max: ......................................................................... 238
  mean: ........................................................................ 25.5
  median: ...................................................................... 22
  p95: ......................................................................... 71.5
  p99: ......................................................................... 87.4
http.response_time.2xx:
  min: ......................................................................... 1
  max: ......................................................................... 238
  mean: ........................................................................ 25.5
  median: ...................................................................... 22
  p95: ......................................................................... 71.5
  p99: ......................................................................... 87.4
http.responses: ................................................................ 12947
vusers.completed: .............................................................. 216
vusers.created: ................................................................ 217
vusers.created_by_name.0: ...................................................... 217
vusers.failed: ................................................................. 0
vusers.session_length:
  min: ......................................................................... 8218.6
  max: ......................................................................... 8967.7
  mean: ........................................................................ 8467.3
  median: ...................................................................... 8520.7
  p95: ......................................................................... 8692.8
  p99: ......................................................................... 8692.8


Phase completed: unnamed (index: 0, duration: 1s) 11:52:16(+0900)

--------------------------------------
Metrics for period to: 11:52:20(+0900) (width: 9.999s)
--------------------------------------

http.codes.200: ................................................................ 13253
http.request_rate: ............................................................. 1309/sec
http.requests: ................................................................. 13086
http.response_time:
  min: ......................................................................... 0
  max: ......................................................................... 301
  mean: ........................................................................ 22
  median: ...................................................................... 18
  p95: ......................................................................... 59.7
  p99: ......................................................................... 87.4
http.response_time.2xx:
  min: ......................................................................... 0
  max: ......................................................................... 301
  mean: ........................................................................ 22
  median: ...................................................................... 18
  p95: ......................................................................... 59.7
  p99: ......................................................................... 87.4
http.responses: ................................................................ 13253
vusers.completed: .............................................................. 309
vusers.created: ................................................................ 125
vusers.created_by_name.0: ...................................................... 125
vusers.failed: ................................................................. 0
vusers.session_length:
  min: ......................................................................... 4176.4
  max: ......................................................................... 9341.1
  mean: ........................................................................ 7946.8
  median: ...................................................................... 8692.8
  p95: ......................................................................... 9230.4
  p99: ......................................................................... 9230.4


--------------------------------------
Metrics for period to: 11:52:30(+0900) (width: 8.676s)
--------------------------------------

errors.ETIMEDOUT: .............................................................. 1
http.codes.200: ................................................................ 3
http.request_rate: ............................................................. 1/sec
http.requests: ................................................................. 1
http.response_time:
  min: ......................................................................... 3
  max: ......................................................................... 3
  mean: ........................................................................ 3
  median: ...................................................................... 3
  p95: ......................................................................... 3
  p99: ......................................................................... 3
http.response_time.2xx:
  min: ......................................................................... 3
  max: ......................................................................... 3
  mean: ........................................................................ 3
  median: ...................................................................... 3
  p95: ......................................................................... 3
  p99: ......................................................................... 3
http.responses: ................................................................ 3
vusers.completed: .............................................................. 3
vusers.failed: ................................................................. 1
vusers.session_length:
  min: ......................................................................... 3981.8
  max: ......................................................................... 4066.8
  mean: ........................................................................ 4021.6
  median: ...................................................................... 3984.7
  p95: ......................................................................... 3984.7
  p99: ......................................................................... 3984.7


All VUs finished. Total time: 55 seconds

--------------------------------
Summary report @ 11:52:31(+0900)
--------------------------------

errors.ETIMEDOUT: .............................................................. 1
http.codes.200: ................................................................ 59965
http.downloaded_bytes: ......................................................... 0
http.request_rate: ............................................................. 1116/sec
http.requests: ................................................................. 59966
http.response_time:
  min: ......................................................................... 0
  max: ......................................................................... 301
  mean: ........................................................................ 24.2
  median: ...................................................................... 21.1
  p95: ......................................................................... 61
  p99: ......................................................................... 83.9
http.response_time.2xx:
  min: ......................................................................... 0
  max: ......................................................................... 301
  mean: ........................................................................ 24.2
  median: ...................................................................... 21.1
  p95: ......................................................................... 61
  p99: ......................................................................... 83.9
http.responses: ................................................................ 59965
vusers.completed: .............................................................. 999
vusers.created: ................................................................ 1000
vusers.created_by_name.0: ...................................................... 1000
vusers.failed: ................................................................. 1
vusers.session_length:
  min: ......................................................................... 3981.8
  max: ......................................................................... 9341.1
  mean: ........................................................................ 7728.2
  median: ...................................................................... 8024.5
  p95: ......................................................................... 9047.6
  p99: ......................................................................... 9230.4

5. 결과 분석

 부하 테스트 결과를 바탕으로 서버의 성능과 안정성을 평가합니다. 주요 지표를 하나씩 분석하겠습니다. ChatGpt를 통해서 파악한 결과 분석입니다. 

 

주요 지표

1) HTTP 요청 처리

  • 성공한 요청 (HTTP 200):
    • 총 59,965건의 요청이 성공적으로 처리되었습니다.
    • 성공률은 거의 100%에 가까우며, 서버가 높은 안정성을 보여줍니다.
  • 총 요청 수:
    • 59,966건 중 59,965건이 성공, 1건에서 오류(ETIMEDOUT) 발생.
  • 요청 속도 (Request Rate):
    • 평균적으로 초당 1,116개의 요청이 처리되었습니다.
    • 최대 요청 속도는 초당 1,454개로 높은 처리량을 유지했습니다.

2) 응답 시간 분석

  • 최소 응답 시간: 0ms
    • 즉시 응답을 반환한 요청이 있었습니다.
  • 최대 응답 시간: 301ms
    • 일부 요청에서 응답 지연이 발생했으며, 이는 시스템 부하 증가 시 나타날 수 있습니다.
  • 평균 응답 시간: 24.2ms
    • 요청이 평균적으로 매우 빠르게 처리되었습니다.
  • 중앙값 응답 시간 (Median): 21.1ms
    • 절반 이상의 요청이 21.1ms 이하로 처리되었습니다.
  • 상위 5% 응답 시간 (P95): 61ms
    • 95%의 요청이 61ms 이하로 처리되었습니다.
  • 상위 1% 응답 시간 (P99): 83.9ms
    • 99%의 요청이 83.9ms 이하에서 처리되었습니다.
  • 해석:
    • 응답 시간이 대부분 짧고 안정적이지만, 최대 응답 시간이 301ms로 나타난 부분은 최적화 가능성이 있는 영역입니다.
    • 상위 5% 및 1% 응답 시간이 안정적이므로 성능 병목 현상은 크지 않습니다.

3) 가상 사용자 상태

  • 생성된 가상 사용자 (vusers.created):
    • 총 1,000명의 가상 사용자가 생성되었습니다.
  • 완료된 가상 사용자 (vusers.completed):
    • 999명의 가상 사용자가 작업을 성공적으로 완료했습니다.
  • 실패한 가상 사용자 (vusers.failed):
    • 1명의 가상 사용자가 실패했습니다.
    • 실패 원인은 연결 시간 초과(ETIMEDOUT)로 보이며, 네트워크 상태 또는 서버의 순간적인 부하 때문일 가능성이 있습니다.

4) 세션 지속 시간 분석

  • 최소 세션 시간: 3,981.8ms (약 4초).
  • 최대 세션 시간: 9,341.1ms (약 9.3초).
  • 평균 세션 시간: 7,728.2ms (약 7.7초).
  • 중앙값 세션 시간 (Median): 8,024.5ms (약 8초).
  • 상위 5% 세션 시간 (P95): 9,047.6ms (약 9초).
  • 상위 1% 세션 시간 (P99): 9,230.4ms (약 9.2초).
  • 해석:
    • 대부분의 세션이 7~9초 동안 유지되며, 가상 사용자 세션이 안정적으로 지속되었습니다.

5) 오류 분석

  • ETIMEDOUT 오류:
    • 총 1건의 연결 시간 초과 오류가 발생했습니다.
    • 이는 네트워크 지연 또는 서버가 순간적으로 과부하 상태에 도달했을 가능성을 나타냅니다.
    • 서버 로그를 분석하여 해당 시간대의 상태를 확인하는 것이 좋습니다.

결론

  1. 강점:
    • 요청 성공률이 99.998%로 매우 높습니다.
    • 평균 응답 시간이 24.2ms로 빠르고, 상위 1% 응답 시간도 83.9ms로 안정적입니다.
    • 가상 사용자 세션이 대부분 정상적으로 완료되었으며, 병목 현상이 관찰되지 않았습니다.
  2. 약점:
    • 최대 응답 시간이 301ms로 다소 긴 요청이 발생했습니다.
    • ETIMEDOUT 오류가 1건 발생했으며, 네트워크 상태나 서버 부하를 점검할 필요가 있습니다.
  3. 개선 제안:
    • 최대 응답 시간이 발생한 원인을 서버 로그를 통해 분석합니다.
    • 네트워크 지연 가능성을 점검하고, 필요 시 타임아웃 설정을 조정합니다.
    • 더 높은 부하 조건에서 테스트를 진행하여 한계치를 파악합니다.

 

결론 요약

 이 테스트 결과는 서버가 높은 부하에서도 안정적으로 동작하고 있음을 보여줍니다. 평균적인 처리 속도와 응답 시간은 매우 우수하며, 실패율도 거의 없는 상태입니다. 최대 응답 시간과 시간 초과 오류를 점검하여 추가 최적화를 진행하면 더 안정적인 환경을 제공할 수 있을 것입니다. 😊

728x90