デプロイとメンテナンス / ベンチマークテスト
この記事では、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 ミリ秒以内である必要があります。
3.2 計算性能のテスト
Benchmark テストパッケージをインポートして数分待つと、「定期実行タスク」の「Compute pi」および「JSON dump and load」タスク記録で結果を確認できます。
「はじめに」のテスト環境では、各タスクの所要時間は約 1 秒です:
- 円周率の計算「Compute pi」
- JSON のシリアライズ / デシリアライズ「JSON dump and load」
3.3 関数 API の並行性能テスト
並行性能をテストする場合は、ab (ApacheBench)ツールを使用してテストできます。
ab がまだインストールされていない場合は、次のコマンドでインストールできます:
| Bash | |
|---|---|
1 | |
| Bash | |
|---|---|
1 | |
ab を使用して、テストパッケージ内の「Hello, World」を呼び出してテストします。コマンドは次のとおりです:
| Bash | |
|---|---|
1 | |
| Bash | |
|---|---|
1 | |
「はじめに」のテスト環境では、空関数の並行処理は約 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 | |
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 | |