バッチ同期ジョブが遅いと、パイプラインの時間が無駄になり、後続のプロセスがブロックされる可能性があります。Data Integration タスクが遅くなる原因はいくつかあります。スケジューリングや実行リソースの待機、読み取りまたは書き込みの遅延、同時実行数の低さ、分割キーの設定ミスなどです。このトピックでは、タスクログを使用してボトルネックとなっている段階を特定し、同時実行数と分割キーを調整してスループットを最大化し、レート制限を適用して本番データベースを保護する方法について説明します。
同期速度に影響する要因
同期ジョブの実行速度は、4つのカテゴリの要因によって決まります:
| 要因 | 詳細 |
|---|---|
| ソースデータベース | CPU、メモリ、ディスク、ネットワーク帯域幅。同時実行数が高いほどデータベースの負荷が増加します。パフォーマンスの高いデータベースは、より高い同時実行数設定を維持できます。 |
| スケジューリングリソースグループ | オフライン同期タスクは、スケジューリングリソースグループによってデータ統合リソースグループに送信され、実行されます。スケジューリングリソースの使用状況は、全体的な効率に影響します。 |
| タスク設定 | 最大転送速度、同時実行数 (ソースからの並列読み取りまたは宛先への並列書き込みを行うスレッド数)、WAIT リソース、Bytes 設定 (デフォルト:スレッドあたり 1,048,576 バイト。ネットワークタイムアウトが発生する場合はこの値を減らしてください)、およびクエリ文がインデックスを使用しているかどうか。 |
| ターゲットデータベース | CPU、メモリ、ディスク、ネットワーク帯域幅。ターゲットの負荷が高いと、書き込み効率が低下します。 |
遅い同期ジョブの診断
タスクログと 詳細ログ を開き、どの実行段階が遅いかを特定します。次の表は、各段階とその主要なログシグナルをまとめたものです:
| 段階 | ログシグナル | 意味 |
|---|---|---|
| スケジューリングリソースの待機 | タスクがゲートウェイを待機中。インスタンスプロパティページでリソース待機時間が長い | スケジューリングリソースグループがタスク上限に達している |
| 実行リソースの待機 | wait が表示される |
データ統合リソースグループの残りの同時実行スロットが不足している |
| データ読み取りの遅延 | run の速度が 0。詳細ログの WaitReaderTime が高い |
タスクがソースからデータを受信するのに長時間待機している |
| データ書き込みの遅延 | run の速度が 0。詳細ログの WaitWriterTime が高い |
タスクが宛先にデータを書き込むのに長時間かかっている |
| 速度はゼロではないが全体的に遅い | run の速度はゼロではないが、合計所要時間が見積もりを大幅に超えている |
同時実行数が低い、分割キーの設定ミス、ダーティデータ、またはデータベースの負荷 |
待機時間が最も長い段階がボトルネックです。そこからトラブルシューティングを開始してください。
オフライン同期タスクログの詳細については、「オフライン同期ログの分析」をご参照ください。
段階 1:スケジューリングリソースの待機
症状:
-
タスクログに、タスクがゲートウェイを待機していることが示されます。
-
インスタンスプロパティページに、長いリソース待機時間が表示されます。
原因:スケジューリングリソースグループが最大タスク制限に達しています。新しいタスクは、実行中のタスクが完了してリソースが解放されるまで待機します。
修正:DataWorks コンソールで、実行診断ページに移動し、現在のタスクが待機している間にどのタスクがリソースを使用しているかを確認します。
スケジューリングに共有リソースグループを使用している場合は、タスクを専用リソースグループまたはサーバーレスリソースグループに移行してください。
段階 2:実行リソースの待機
症状:タスクログに wait が表示されます。
原因:データ統合リソースグループに、タスク用の残りの同時実行スロットが不足しています。
例えば、あるリソースグループが最大 8 つの同時実行スロットをサポートしているとします。同時実行数がそれぞれ 3 のタスクが 2 つ実行されている場合、6 つのスロットが使用され、残りは 2 つになります。3 つの同時実行スロットを必要とする 3 番目のタスクは待機する必要があります。
修正:
-
実行診断ページに移動して、どのタスクがリソースを消費しているかを確認します。
-
実行中のタスクがスタックしていないか、異常に遅くないかを確認します。もしそうであれば、まずそれらのタスクを停止または解決します。
-
タスクが正常に実行されている場合は、完了してリソースが解放されるのを待ちます。
-
タスクの所有者と調整して、競合するタスクの同時実行数を減らします。
-
現在のタスクの同時実行数を減らして再送信します。
-
リソースグループをスケールアウトします。詳細については、「スケーリング操作」をご参照ください。
同時実行スロットの最大数は、リソースグループの仕様によって異なります。詳細については、「パフォーマンスメトリックと課金」をご参照ください。
段階 3:データ読み取りの遅延 (高い WaitReaderTime)
症状:タスクログに run が速度 0 で表示されます。詳細ログには WaitReaderTime の値が大きく、タスクがソースからのデータを長時間待機していることを示します。
原因:
-
分割キーが正しく設定されていないため、データ取得の SQL が遅く実行されます。
-
whereまたはquerySqlパラメーターにインデックスが付けられていないため、全表スキャンが発生します。 -
同期時にソースデータベースの負荷が高くなっています。
-
ネットワーク帯域幅またはレイテンシの問題。
パブリックネットワーク経由での同期速度は保証できません。
修正:
-
データフィルタリングに使用されるフィールドにインデックスを付けて、全表スキャンを回避します。
-
pre-SQL または post-SQL 文での複雑な関数の使用を避けるか、減らします。必要な場合は、同期が開始される前にデータベースでこれらの操作を実行します。
-
ソーステーブルが非常に大きい場合は、タスクを複数の小さなタスクに分割します。
-
ログを照会してブロッキングしている SQL ステートメントを特定し、データベース管理者と協力して解決します。
-
同期時のソースデータベースの負荷を確認します。
段階 4:データ書き込みの遅延 (高い WaitWriterTime)
症状:タスクログに run が速度 0 で表示されます。詳細ログには WaitWriterTime の値が大きく、タスクが宛先への書き込みに長時間かかっていることを示します。
原因:
-
writer プラグインの
preSqlまたはpostSql文の実行が遅いです。 -
同期時にターゲットデータベースの負荷が高くなっています。
-
ネットワーク帯域幅またはレイテンシの問題。
パブリックネットワーク経由での同期速度は保証できません。
修正:
-
writer プラグイン設定の
preSqlおよびpostSql文を確認し、最適化します。 -
同期時のターゲットデータベースの負荷を確認します。
段階 5:速度はゼロではないが、全体の進捗が遅い
症状:タスクログに run がゼロではない速度で表示されますが、同期ジョブが予想よりもはるかに長くかかります。
原因:
-
リレーショナルデータベースタスクの分割キーが設定されていないか、不適切に設定されているため、同時実行数の設定が有効になっていません。タスクは設定された同時実行数ではなく、単一のスレッドで実行されます。
-
同時実行数の設定が低すぎます。
-
同期中に大量のダーティデータが生成されます。
-
設定された同時実行数を維持するのにデータベースのパフォーマンスが不十分です。
-
ネットワーク帯域幅またはレイテンシの問題。
パブリックネットワーク経由での同期速度は保証できません。
修正:
-
分割キーを正しく設定します。設定手順については、「コードレス UI でタスクを設定する」をご参照ください。
-
タスクの同時実行数を増やします。リソースグループでサポートされている最大同時実行数クォータ内で、すべてのタスクにわたって同時実行数を計画し、必要に応じて現在のタスクの同時実行数を増やします。コードレス UI で同時実行数を設定するか、コードエディタで直接設定します。リソースグループの制限については、「パフォーマンスメトリックと課金」をご参照ください。分散タスクの場合は、次のことを確認してください:
タスクの同時実行数 ÷ リソースグループ内のマシン数 ≤ マシンごとの最大同時実行数 -
ダーティデータを処理します。詳細については、「Data Integration」をご参照ください。
-
クラウド間またはクロスリージョンの同期にはプライベートネットワークを使用します。ネットワーク接続オプションについては、「ネットワーク接続ソリューション」をご参照ください。
-
同期時のデータベースの負荷を確認します。
同期速度の制限
デフォルトでは、Data Integration タスクは、設定された同時実行数制限内で可能な限り最高の速度で実行されます。高速で実行すると、本番データベースに過度の負荷がかかる可能性があります。スループットを制限するには、レート制限を使用します。
本番データベースへの過負荷を避けるため、レート制限は 30 MB/s 以下にしてください。
次の例では、コードエディタでレート制限を 1 MB/s に設定します:
"setting": {
"speed": {
"throttle": true, // レート制限を有効にするには true に設定します。
"mbps": 1 // レート制限 (MB/s)。
}
}
`throttle` の動作:
-
true:レート制限が有効になります。mbpsを特定の値に設定する必要があります。mbpsが設定されていない場合、タスクは失敗するか、異常な動作をします。 -
false:レート制限は無効になります。mbpsの値は無視されます。
トラフィック測定:Data Integration によって測定されるレートは、実際のネットワークインターフェースコントローラー (NIC) のトラフィックではなく、内部チャンネルのトラフィックを反映しています。NIC のトラフィックは、データストレージシステムがデータをどのようにシリアル化するかに応じて、通常、チャンネルトラフィックの 1〜2 倍になります。
半構造化ファイルのレート制限:単一の半構造化ファイルは分割できず、分割キーを使用しません。複数のファイルの場合は、ジョブのレート制限を設定してスループットを向上させます。有効な最大レートはファイル数によって異なります。n 個のファイルの場合:
-
n+1MB/s の制限を設定すると、実際のスループットはnMB/s になります。 -
n-1MB/s の制限を設定すると、実際のスループットはn-1MB/s になります。
リレーショナルデータベースのレート制限:ジョブのレート制限と分割キーの両方を設定します。分割キーにより、レート制限に合わせてテーブルをパーティショニングできます。リレーショナルデータベースは通常、数値の分割キーのみをサポートします。Oracle データベースは、数値と文字列の両方の分割キーをサポートします。
よくある質問
-
BatchSize と maxfilesize:これらのパラメーターは、バッチごとにコミットされるレコード数を制御します。値を大きくすると、ネットワークのラウンドトリップが減り、スループットが向上しますが、設定が高すぎると同期プロセスでメモリ不足 (OOM) エラーが発生する可能性があります。OOM エラーが発生した場合は、「オフライン同期に関するよくある質問」をご参照ください。
付録:実際の同時実行数の表示
タスクログの詳細ページで、次のようなログエントリを見つけます:
JobContainer - Job set Channel-Number to 2 channels
channels の値は、タスクが使用している実際の同時実行数です。
[ResponseError]:
AccessDenied
xxx
xxx
2020-09-07 00:26:15.462 [job-323683754] INFO OdpsWriter$Job - blockSizeInMB=64.
2020-09-07 00:26:15.462 [job-323683754] INFO JobContainer - jobContainer starts to do prepare ...
2020-09-07 00:26:15.463 [job-323683754] INFO JobContainer - DataX Reader.Job [ossreader] do prepare work .
2020-09-07 00:26:15.491 [job-323683754] INFO OssReader$Job - add object [user_log.txt] as a candidate to be read.
2020-09-07 00:26:15.493 [job-323683754] INFO JobContainer - DataX Writer.Job [odpswriter] do prepare work .
2020-09-07 00:26:15.494 [job-323683754] INFO IdAndKeyUtil - xxx
2020-09-07 00:26:15.494 [job-323683754] INFO OdpsWriter$Job - xxx
2020-09-07 00:26:18.045 [job-323683754] INFO OdpsUtil - Try to xxx
2020-09-07 00:26:19.435 [job-323683754] INFO OdpsUtil - Try to xxx
alter table xc_ods_raw_log_d add IF NOT EXISTS partition(dt='20200906');
] .
2020-09-07 00:26:21.860 [job-323683754] INFO JobContainer - jobContainer starts to do split ...
2020-09-07 00:26:21.860 [job-323683754] INFO JobContainer - Job set Channel-Number to 2 channels.
2020-09-07 00:26:22.120 [job-323683754] INFO UnstructuredSplitUtil - File to be read:[{"end" xxx ,"filePath":"user_lxxx
2020-09-07 00:26:22.121 [job-323683754] INFO UnstructuredSplitUtil - File to be read:[{"end"
2020-09-07 00:26:22.121 [job-323683754] INFO JobContainer - DataX Reader.Job [ossreader] splits to [2] tasks.
付録:専用リソースグループにおける同時実行数とリソース使用量
同時実行数が CPU とメモリにどのようにマッピングされるかを理解することで、タスクの送信を計画し、リソースの競合を回避できます。
同時実行性と CPU
専用リソースグループでは、同時実行数と vCPU の比率は 1:0.5 です。4 vCPU と 8 GiB のメモリを持つ ECS インスタンスは、8 の同時実行数クォータを提供します。これは、次のことを意味します:
-
最大 8 つのオフライン同期タスク (同時実行数 1)、または
-
最大 4 つのオフライン同期タスク (同時実行数 2)。
新しく送信されたタスクが残りのクォータよりも多くの同時実行数を必要とする場合、実行中のタスクが完了してリソースが解放されるまで待機します。
タスクの同時実行数がリソースグループの最大クォータを超えると、タスクは無期限に待機し、後続のタスクをブロックします。例えば、4 vCPU / 8 GiB の ECS インスタンス上のリソースグループに同時実行数 10 のタスクを送信すると、そのタスクは実行されません。
同時実行性 と メモリ
専用リソースグループでのタスクごとのメモリ使用量は、次の数式に従います:
Min{768 + (concurrency - 1) × 256, 8029} MB
これをオーバーライドするには、コードエディタで $.setting.jvmOption JSON パスを設定します。
"setting": {
"errorLimit": {
"record": "0"
},
"speed": {
"throttle": false,
"concurrent": 1
},
"jvmOption": "-Xms1024m -Xmx1024m"
}
タスクを安定させるには、実行中のすべてのタスクが使用する合計メモリが、リソースグループ内のすべてのマシンの合計メモリより少なくとも 1 GB 低く保たれる必要があります。このしきい値を超えると、Linux の OOM Killer がタスクを強制的に停止する可能性があります。
コードエディタでメモリ設定をオーバーライドしない場合、タスク送信を計画する際には同時実行数クォータ制限のみが適用されます。
付録:同期速度のリファレンス
以下の表は、専用リソースグループにおける一般的なコネクタの平均単一同時実行スループットを示しています。これらの値を、予想される同期時間を見積もり、同時実行数を設定する際のベースラインとして使用してください。
これらの数値は、専用リソースグループの管理された条件下で測定されたものです。実際のスループットは、データベースのパフォーマンス、ネットワークの状態、データ量、リソースグループの仕様によって異なります。
Writer プラグイン
| Writer | 平均単一同時実行速度 (KB/s) |
|---|---|
| AnalyticDB for PostgreSQL | 147.8 |
| AnalyticDB for MySQL | 181.3 |
| ClickHouse | 5,259.3 |
| DataHub | 45.8 |
| DRDS | 93.1 |
| Elasticsearch | 74.0 |
| FTP | 565.6 |
| GDB | 17.1 |
| HBase | 2,395.0 |
| hbase20xsql | 37.8 |
| HDFS | 1,301.3 |
| Hive | 1,960.4 |
| HybridDB for MySQL | 323.0 |
| HybridDB for PostgreSQL | 116.0 |
| Kafka | 0.9 |
| SLS | 788.5 |
| MongoDB | 51.6 |
| MySQL | 54.9 |
| MaxCompute | 660.6 |
| Oracle | 66.7 |
| OSS | 3,718.4 |
| OTS | 138.5 |
| PolarDB | 45.6 |
| PostgreSQL | 168.4 |
| Redis | 7,846.7 |
| SQLServer | 8.3 |
| Stream | 116.1 |
| TSDB | 2.3 |
| Vertica | 272.0 |
Reader プラグイン
| Reader | 平均単一同時実行速度 (KB/s) |
|---|---|
| AnalyticDB for PostgreSQL | 220.3 |
| AnalyticDB for MySQL | 248.6 |
| DRDS | 146.4 |
| Elasticsearch | 215.8 |
| FTP | 279.4 |
| HBase | 1,605.6 |
| hbase20xsql | 465.3 |
| HDFS | 2,202.9 |
| Hologres | 741.0 |
| HybridDB for MySQL | 111.3 |
| HybridDB for PostgreSQL | 496.9 |
| Kafka | 3,117.2 |
| SLS | 1,014.1 |
| MongoDB | 361.3 |
| MySQL | 459.5 |
| MaxCompute | 207.2 |
| Oracle | 133.5 |
| OSS | 665.3 |
| OTS | 229.3 |
| OTSStream | 661.7 |
| PolarDB | 238.2 |
| PostgreSQL | 165.6 |
| RDBMS | 845.6 |
| SQLServer | 143.7 |
| Stream | 85.0 |
| Vertica | 454.3 |