バッチ同期タスクが遅いと、パイプラインの時間が無駄になり、下流のプロセスがブロックされる可能性があります。Data Integration タスクが遅くなる原因はいくつかあります。スケジューリングや実行リソースの待機、読み取りや書き込みの低速化、低い同時実行数、または分割キーの設定ミスなどです。このトピックでは、タスクログを使用してボトルネックとなっているステージを特定し、同時実行数と分割キーを調整してスループットを最大化し、レート制限を適用して本番データベースを保護する方法について説明します。
同期速度に影響する要因
同期タスクの実行速度を決定する要因は、4つのカテゴリに分類されます。
| 要因 | 詳細 |
|---|---|
| ソースデータベース | CPU、メモリ、ディスク、ネットワーク帯域幅。同時実行数が高いほどデータベースの負荷が増加します。パフォーマンスの高いデータベースほど、より高い同時実行数の設定を維持できます。 |
| スケジューリングリソースグループ | オフライン同期タスクは、スケジューリングリソースグループによって Data Integration リソースグループに送信されて実行されます。スケジューリングリソースの使用状況は、全体の効率に影響します。 |
| タスク設定 | 最大転送速度、同時実行数 (ソースからの並列読み取りまたはターゲットへの並列書き込みを行うスレッド数)、WAIT リソース、Bytes 設定 (デフォルト:スレッドあたり 1,048,576 バイト。ネットワークタイムアウトが発生する場合はこの値を減らしてください)、およびクエリ文がインデックスを使用しているかどうか。 |
| ターゲットデータベース | CPU、メモリ、ディスク、ネットワーク帯域幅。ターゲットの負荷が高いと、書き込み効率が低下します。 |
低速な同期タスクの診断
タスクログと 詳細ログ を開き、どの実行ステージが遅いかを特定します。次の表は、各ステージとその主要なログシグナルをまとめたものです。
| ステージ | ログシグナル | 意味 |
|---|---|---|
| スケジューリングリソースの待機 | タスクがゲートウェイを待機中。インスタンスプロパティページでリソースの待機時間が長い | スケジューリングリソースグループがタスク制限に達している |
| 実行リソースの待機 | wait がタスクログに表示される |
Data Integration リソースグループの残りの同時実行スロットが不足している |
| データ読み取りの低速化 | run が速度 0 で表示される。詳細ログの WaitReaderTime が高い |
タスクがソースからデータを受信するのに長時間待機している |
| データ書き込みの低速化 | run が速度 0 で表示される。詳細ログの WaitWriterTime が高い |
タスクがターゲットにデータを書き込むのに長時間かかっている |
| 速度はゼロではないが全体的に遅い | run がゼロ以外の速度で表示されるが、全体の所要時間が予測を大幅に超えている |
同時実行数が低い、分割キーの設定ミス、ダーティデータ、またはデータベースの負荷 |
待機時間が最も長いステージがボトルネックです。そこからトラブルシューティングを開始してください。
オフライン同期タスクログの詳細については、「オフライン同期のログ分析」をご参照ください。
ステージ 1:スケジューリングリソースの待機
症状:
-
タスクログに、タスクがゲートウェイを待機していることが示されます。
-
インスタンスプロパティページに、リソースの待機時間が長いことが示されます。
原因: スケジューリングリソースグループが最大タスク制限に達しています。新しいタスクは、実行中のタスクが完了してリソースを解放するまで待機します。
修正: DataWorks コンソールで、運用分析ページに移動し、現在のタスクが待機している間にどのタスクがリソースを使用しているかを確認します。
スケジューリングに共有リソースグループを使用している場合は、タスクを専用リソースグループまたは Serverless リソースグループに移行してください。
ステージ 2:実行リソースの待機
症状: タスクログに wait と表示されます。
原因: Data Integration リソースグループに、タスク用の残りの同時実行スロットが不足しています。
例:あるリソースグループが最大 8 つの同時実行スロットをサポートしているとします。それぞれ同時実行数 3 のタスクが 2 つ実行されている場合、6 つのスロットが使用され、残りは 2 つです。3 つの同時実行スロットを必要とする 3 番目のタスクは待機する必要があります。
修正:
-
運用分析ページに移動し、どのタスクがリソースを消費しているかを確認します。
-
実行中のタスクがスタックしていないか、異常に遅くないかを確認します。もしそうであれば、まずそれらのタスクを停止または解決します。
-
タスクが正常に実行されている場合は、それらが完了してリソースを解放するのを待ちます。
-
タスクの所有者と調整して、競合するタスクの同時実行数を減らします。
-
現在のタスクの同時実行数を減らして再送信します。
-
リソースグループをスケールアウトします。詳細については、「スケーリング操作」をご参照ください。
最大同時実行スロット数は、リソースグループの仕様によって異なります。詳細については、「パフォーマンスメトリックと課金」をご参照ください。
ステージ 3:データ読み取りの低速化 (高い WaitReaderTime)
症状: タスクログに速度 0 の run が表示されます。詳細ログ には WaitReaderTime の値が大きく、タスクがソースからのデータ取得に長時間待機していることを示します。
原因:
-
分割キーが正しく設定されていないため、データ取得 SQL の実行が遅くなっています。
-
whereまたはquerySqlパラメーターにインデックスが付けられていないため、フルテーブルスキャンが発生しています。 -
同期時にソースデータベースの負荷が高くなっています。
-
ネットワーク帯域幅またはレイテンシーの問題。
パブリックネットワーク経由での同期速度は保証できません。
修正:
-
データフィルタリングに使用されるフィールドにインデックスを付けて、フルテーブルスキャンを回避します。
-
pre-SQL または post-SQL 文での複雑な関数の使用を避けるか、減らします。必要であれば、これらの操作は同期開始前にデータベースで実行します。
-
ソーステーブルが非常に大きい場合は、タスクを複数の小さなタスクに分割します。
-
ログをクエリしてブロッキングしている SQL 文を特定し、データベース管理者と協力して解決します。
-
同期時のソースデータベースの負荷を確認します。
ステージ 4:データ書き込みの低速化 (高い WaitWriterTime)
症状: タスクログに速度 0 の run が表示されます。詳細ログ には 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 の同時実行数クォータを提供します。これは次のことを意味します。
-
同時実行数 1 のオフライン同期タスクを最大 8 つ、または
-
同時実行数 2 のオフライン同期タスクを最大 4 つ。
新しく送信されたタスクが残りのクォータよりも多くの同時実行数を必要とする場合、実行中のタスクが完了してリソースを解放するまで待機します。
タスクの同時実行数がリソースグループの最大クォータを超えると、タスクは無期限に待機し、後続のタスクをブロックします。たとえば、4 vCPU / 8 GiB の ECS インスタンス上のリソースグループに同時実行数 10 のタスクを送信すると、そのタスクは実行されません。
並行性とメモリ
専用リソースグループでのタスクごとのメモリ使用量は、次の数式に従います。
Min{768 + (同時実行数 - 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 |