跳轉到

部署和維護 / 基準效能測試

本文主要介紹如何對 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 外部系統響應慢

當在指令碼中查詢外部資料庫、呼叫 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')