Skip to content

배포 및 유지보수 / 벤치마크 성능 테스트

이 문서에서는 DataFlux Func의 벤치마크 성능 테스트 방법을 주로 소개합니다.

1. 서문

이 문서의 모든 예제 결과는 다음 하드웨어 환경에서 테스트한 결과입니다.

설명
컴퓨터 HP ProBook 노트북
CPU AMD Ryzen 5 7530U with Radeon Graphics / 4.5 GHz
메모리 32 GB / 3200 MHz (0.3 ns)
운영 체제 Ubuntu 22.04.5 LTS

2. Benchmark 테스트 패키지

Benchmark.zip을 다운로드하여 DataFlux Func로 가져옵니다.

Benchmark 테스트 패키지에는 다음 내용이 포함되어 있습니다.

내용 설명
스크립트 세트 benchmark
함수 benchmark__main.hello_world "ok"를 직접 반환하는 빈 함수이며, 동시성 테스트에 사용됩니다
함수 benchmark__main.json_dump JSON 직렬화 / 역직렬화를 수행하며, 성능 테스트에 사용됩니다
함수 benchmark__main.calc_pi 원주율을 계산하며, 성능 테스트에 사용됩니다
동기 API benchmark-hello-world 동시성 테스트에 사용됩니다
예약 작업 benchmark-hello-world 작업 스케줄링 성능 테스트에 사용됩니다
예약 작업 benchmark-compute-pi 계산 성능 테스트에 사용됩니다 (원주율 계산)
예약 작업 benchmark-json-dump-and-load 계산 성능 테스트에 사용됩니다 (JSON 직렬화 / 역직렬화)

3. 테스트 실행

Benchmark 테스트 패키지를 가져오면, 예약 작업이 자동으로 실행되므로 몇 분 후 작업 기록에서 결과를 확인할 수 있습니다.

DataFlux Func의 동시성 성능 테스트는 다른 도구를 사용하여 수행해야 합니다.

3.1 작업 스케줄링 성능 테스트

Benchmark 테스트 패키지를 가져온 후 몇 분간 기다리면, '예약 작업'의 'Hello, World' 작업 기록에서 결과를 확인할 수 있습니다.

일반적으로 각 작업의 소요 시간은 10밀리초 이내여야 합니다.

cron-job-hello-world.png

3.2 계산 성능 테스트

Benchmark 테스트 패키지를 가져온 후 몇 분간 기다리면, '예약 작업'의 'Compute pi' 및 'JSON dump and load' 작업 기록에서 결과를 확인할 수 있습니다.

'서문'의 테스트 환경을 기준으로, 각 작업의 소요 시간은 약 1초입니다:

  • 원주율 계산 'Compute pi'

cron-job-compute-pi.png

  • JSON 직렬화 / 역직렬화 'JSON dump and load'

cron-job-json-dump-and-load.png

3.3 함수 API 동시성 성능 테스트

동시성 성능을 테스트할 때는 ab (ApacheBench) 도구를 사용하여 테스트할 수 있습니다.

아직 ab를 설치하지 않은 경우, 다음 명령으로 설치할 수 있습니다:

Bash
1
apt-get install apache2-utils
Bash
1
yum install httpd-tools

ab를 사용하여 테스트 패키지의 'Hello, World'를 호출 테스트하는 명령은 다음과 같습니다:

Bash
1
ab -c 10 -n 5000 -k http://localhost:8088/api/v1/sync/benchmark-hello-world
Bash
1
ab -c 10 -n 5000 -k http://{DataFlux Func IP 또는 도메인}:8088/api/v1/sync/benchmark-hello-world

'서문'의 테스트 환경을 기준으로, 빈 함수의 동시 처리는 약 1000입니다 (Requests per second):

ab 테스트 출력
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# ab -c 10 -n 5000 -k http://localhost:8088/api/v1/sync/benchmark-hello-world
This is ApacheBench, Version 2.3 <$Revision: 1879490 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking localhost (be patient)
Completed 500 requests
Completed 1000 requests
...
Completed 5000 requests
Finished 5000 requests


Server Software:
Server Hostname:        localhost
Server Port:            8088

Document Path:          /api/v1/sync/benchmark-hello-world
Document Length:        13 bytes

Concurrency Level:      10
Time taken for tests:   4.694 seconds
Complete requests:      5000
Failed requests:        0
Keep-Alive requests:    5000
Total transferred:      3045525 bytes
HTML transferred:       65000 bytes
Requests per second:    1065.17 [#/sec] (mean)
Time per request:       9.388 [ms] (mean)
Time per request:       0.939 [ms] (mean, across all concurrent requests)
Transfer rate:          633.60 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.0      0       1
Processing:     5    9   1.8      9      29
Waiting:        4    9   1.8      9      29
Total:          5    9   1.8      9      29

Percentage of the requests served within a certain time (ms)
  50%      9
  66%     10
  75%     10
  80%     10
  90%     12
  95%     13
  98%     14
  99%     15
  100%     29 (longest request)

4. 성능에 영향을 미치는 원인

작업의 실제 실행 내용은 실제로 호출되는 스크립트에 의해 결정되므로, 작업 실행 시간이 오래 걸리는 경우 코드에 다음과 같은 문제가 있는지 확인할 수 있습니다.

4.1 대량의 print(...)

디버깅의 편의를 위해 스크립트에서 DB의 데이터, API가 반환한 데이터를 모두 print(...)로 직접 출력하는 경우가 있습니다.

DataFlux Func는 작업 실행 시 print(...) 내용을 자동으로 기록하므로, 이러한 방식은 매우 큰 성능 손실을 초래합니다.

코드를 프로덕션에 투입한 후에는 필요한 print(...) 출력만 남기고, 긴 텍스트 출력은 피하는 것이 좋습니다.

4.2 외부 시스템 응답이 느린 경우

스크립트에서 외부 DB를 조회하거나 API 인터페이스를 호출할 때 (DQL 쿼리 실행 등 포함) 네트워크가 지연되거나 단순히 상대 시스템의 응답이 느린 경우에도 작업 실행 시간이 길어질 수 있습니다.

이것은 DataFlux Func와 기본적으로 관련이 없으며, 이러한 외부 시스템 담당자에게 연락하여 응답 속도를 개선해야 합니다.

다음은 처리 소요 시간을 테스트하는 간단한 예제 코드입니다.

Python
1
2
3
4
5
6
7
import time
import requests

def test():
    t1 = time.time()
    requests.get('http://github.com')
    print(f'Cost: {time.time() -  t1} s')