コンテンツにスキップ

デプロイとメンテナンス / ベンチマークテスト

この記事では、DataFlux Func に対してベンチマークテストを実施する方法について主に説明します。

1. はじめに

この記事のすべてのサンプル結果は、以下のハードウェア環境でテストしたものです。

説明
コンピュータ HP ProBook ノートパソコン
CPU AMD Ryzen 5 7530U with Radeon Graphics / 4.5 GHz
メモリ 32 GB / 3200 MHz (0.3 ns)
OS 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
これは ApacheBench、バージョン 2.3 <$Revision: 1879490 $>
著作権 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Apache Software Foundation、http://www.apache.org/ にライセンス供与

localhost をベンチマーク中 (お待ちください)
500 リクエスト完了
1000 リクエスト完了
...
5000 リクエスト完了
5000 リクエスト終了


サーバーソフトウェア:
サーバーホスト名:        localhost
サーバーポート:            8088

ドキュメントパス:          /api/v1/sync/benchmark-hello-world
ドキュメント長:        13 バイト

並行レベル:      10
テストにかかった時間:   4.694 秒
完了リクエスト:      5000
失敗リクエスト:        0
Keep-Alive リクエスト:    5000
転送合計:      3045525 バイト
HTML 転送:       65000 バイト
1 秒あたりのリクエスト数:    1065.17 [#/sec] (平均)
リクエストあたりの時間:       9.388 [ms] (平均)
リクエストあたりの時間:       0.939 [ms] (全並行リクエストの平均)
転送レート:          633.60 [Kbytes/sec] 受信

接続時間 (ms)
              min  mean[+/-sd] median   max
接続:        0    0   0.0      0       1
処理:     5    9   1.8      9      29
待機:        4    9   1.8      9      29
合計:          5    9   1.8      9      29

一定時間内に処理されたリクエストの割合 (ms)
  50%      9
  66%     10
  75%     10
  80%     10
  90%     12
  95%     13
  98%     14
  99%     15
  100%     29 (最長リクエスト)

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')