Pekerjaan sinkronisasi batch yang lambat membuang waktu pipeline dan dapat menghambat proses downstream. Tugas Data Integration bisa berjalan lambat karena berbagai alasan—seperti menunggu sumber daya penjadwalan atau eksekusi, pembacaan atau penulisan yang lambat, konkurensi rendah, atau kunci pemisahan (split key) yang salah konfigurasi. Topik ini menjelaskan cara menggunakan log tugas untuk mengidentifikasi tahap bottleneck, menyesuaikan konkurensi dan split key guna memaksimalkan throughput, serta menerapkan rate limiting untuk melindungi database produksi.
Faktor yang memengaruhi kecepatan sinkronisasi
Empat kategori faktor menentukan seberapa cepat pekerjaan sinkronisasi berjalan:
| Factor | Details |
|---|---|
| Source database | CPU, memory, disk, dan network bandwidth. Konkurensi yang lebih tinggi meningkatkan beban database — database dengan performa lebih baik dapat menangani pengaturan konkurensi yang lebih tinggi. |
| Scheduling resource group | Tugas sinkronisasi offline diajukan oleh scheduling resource group ke data integration resource group untuk dieksekusi. Penggunaan sumber daya penjadwalan memengaruhi efisiensi keseluruhan. |
| Task configuration | Kecepatan transfer maksimum, konkurensi (jumlah thread yang membaca dari sumber atau menulis ke tujuan secara paralel), sumber daya WAIT, pengaturan Bytes (default: 1.048.576 byte per thread — kurangi nilai ini jika terjadi timeout jaringan), dan apakah pernyataan kueri menggunakan indeks. |
| Destination database | CPU, memory, disk, dan network bandwidth. Beban tinggi pada tujuan mengurangi efisiensi penulisan. |
Diagnosis pekerjaan sinkronisasi yang lambat
Buka log tugas dan Detail log untuk mengidentifikasi tahap eksekusi mana yang lambat. Tabel berikut merangkum setiap tahap dan sinyal log utamanya:
| Stage | Log signal | What it means |
|---|---|---|
| Waiting for scheduling resources | Tugas sedang menunggu gateway; waktu tunggu sumber daya lama pada halaman properti instans | Scheduling resource group telah mencapai batas maksimum tugasnya |
| Waiting for execution resources | wait dalam log tugas |
Data integration resource group tidak memiliki slot konkurensi tersisa yang cukup untuk tugas tersebut |
| Slow data reading | run dengan kecepatan 0; nilai WaitReaderTime tinggi dalam Detail log |
Tugas menunggu lama untuk menerima data dari sumber |
| Slow data writing | run dengan kecepatan 0; nilai WaitWriterTime tinggi dalam Detail log |
Tugas membutuhkan waktu lama untuk menulis data ke tujuan |
| Non-zero speed but slow overall | run dengan kecepatan bukan nol; durasi total jauh melebihi perkiraan |
Konkurensi rendah, split key salah konfigurasi, data kotor, atau beban database |
Tahap dengan waktu tunggu terlama merupakan bottleneck Anda. Mulailah troubleshooting dari sana.
Untuk informasi lebih lanjut tentang log tugas sinkronisasi offline, lihat Offline sync log analysis.
Stage 1: Waiting for scheduling resources
Symptoms:
-
Log tugas menunjukkan bahwa tugas sedang menunggu gateway.
-
Halaman properti instans menunjukkan waktu tunggu sumber daya yang lama.
Cause: Scheduling resource group telah mencapai batas maksimum jumlah tugasnya. Tugas baru akan menunggu hingga tugas yang sedang berjalan selesai dan melepaskan sumber daya.
Fix: Di Konsol DataWorks, buka halaman Operation Analysis untuk melihat tugas mana saja yang sedang menggunakan sumber daya saat tugas saat ini menunggu.
Jika Anda menggunakan shared resource groups for scheduling, migrasikan tugas Anda ke exclusive resource group atau Serverless resource group.
Stage 2: Waiting for execution resources
Symptom: Log tugas menunjukkan wait.
Cause: Data integration resource group tidak memiliki slot konkurensi tersisa yang cukup untuk tugas tersebut.
Contoh: sebuah resource group mendukung maksimal 8 slot konkurensi. Jika dua tugas berjalan masing-masing dengan konkurensi 3, mereka menggunakan 6 slot, menyisakan 2 slot tersedia. Tugas ketiga yang memerlukan 3 slot konkurensi harus menunggu.
Fix:
-
Buka halaman Operation Analysis untuk melihat tugas mana saja yang mengonsumsi sumber daya.
-
Periksa apakah ada tugas yang sedang berjalan namun macet atau tidak biasa lambat. Jika iya, hentikan atau selesaikan terlebih dahulu.
-
Jika tugas berjalan normal, tunggu hingga selesai dan melepaskan sumber daya.
-
Koordinasikan dengan pemilik tugas untuk mengurangi konkurensi tugas yang bersaing.
-
Kurangi konkurensi tugas saat ini dan ajukan ulang.
-
Perluas kapasitas resource group. Untuk informasi lebih lanjut, lihat Scaling operations.
Jumlah maksimum slot konkurensi bervariasi tergantung spesifikasi resource group. Untuk informasi lebih lanjut, lihat Performance metrics and billing.
Stage 3: Slow data reading (high WaitReaderTime)
Symptom: Log tugas menunjukkan run dengan kecepatan 0. Detail log menunjukkan nilai besar untuk WaitReaderTime, yang mengindikasikan tugas menunggu lama untuk menerima data dari sumber.
Causes:
-
Split key tidak dikonfigurasi dengan benar, sehingga SQL pengambilan data berjalan lambat.
-
Parameter
whereatauquerySqltidak diindeks, sehingga menyebabkan full table scan. -
Database sumber sedang mengalami beban tinggi saat sinkronisasi.
-
Ada masalah bandwidth atau latensi jaringan.
Kecepatan sinkronisasi melalui jaringan publik tidak dapat dijamin.
Fix:
-
Indeks field yang digunakan untuk penyaringan data guna menghindari full table scan.
-
Hindari atau kurangi fungsi kompleks dalam pernyataan pre-SQL atau post-SQL. Jika diperlukan, jalankan operasi tersebut di database sebelum sinkronisasi dimulai.
-
Jika tabel sumber sangat besar, bagi tugas menjadi beberapa tugas yang lebih kecil.
-
Periksa log untuk mengidentifikasi pernyataan SQL yang menjadi penghambat dan koordinasikan dengan administrator basis data Anda untuk menyelesaikannya.
-
Periksa beban database sumber pada saat sinkronisasi.
Stage 4: Slow data writing (high WaitWriterTime)
Symptom: Log tugas menunjukkan run dengan kecepatan 0. Detail log menunjukkan nilai besar untuk WaitWriterTime, yang mengindikasikan tugas membutuhkan waktu lama untuk menulis ke tujuan.
Causes:
-
Pernyataan
preSqlataupostSqldalam writer plug-in berjalan lambat. -
Database tujuan sedang mengalami beban tinggi saat sinkronisasi.
-
Ada masalah bandwidth atau latensi jaringan.
Kecepatan sinkronisasi melalui jaringan publik tidak dapat dijamin.
Fix:
-
Tinjau dan optimalkan pernyataan
preSqldanpostSqldalam konfigurasi writer plug-in. -
Periksa beban database tujuan pada saat sinkronisasi.
Stage 5: Non-zero speed but overall progress is slow
Symptom: Log tugas menunjukkan run dengan kecepatan bukan nol, tetapi pekerjaan sinkronisasi memakan waktu jauh lebih lama dari yang diharapkan.
Causes:
-
Split key untuk tugas database relasional tidak dikonfigurasi atau salah konfigurasi, sehingga pengaturan konkurensi tidak efektif. Tugas berjalan dengan satu thread saja, bukan sesuai konkurensi yang dikonfigurasi.
-
Pengaturan konkurensi terlalu rendah.
-
Volume besar data kotor dihasilkan selama sinkronisasi.
-
Kinerja database tidak mencukupi untuk menopang konkurensi yang dikonfigurasi.
-
Ada masalah bandwidth atau latensi jaringan.
Kecepatan sinkronisasi melalui jaringan publik tidak dapat dijamin.
Fix:
-
Konfigurasikan split key dengan benar. Untuk langkah-langkah konfigurasi, lihat Configure a task in the codeless UI.
-
Tingkatkan konkurensi tugas. Dalam batas kuota konkurensi maksimum yang didukung oleh resource group, rencanakan konkurensi di seluruh tugas dan tingkatkan konkurensi tugas saat ini sesuai kebutuhan. Konfigurasikan konkurensi di antarmuka tanpa kode, atau atur langsung di editor kode. Untuk batasan resource group, lihat Performance metrics and billing. Untuk tugas terdistribusi, pastikan bahwa:
konkurensi tugas ÷ jumlah mesin dalam resource group ≤ konkurensi maksimum per mesin -
Tangani data kotor. Untuk informasi lebih lanjut, lihat Data Integration.
-
Gunakan jaringan pribadi untuk sinkronisasi cross-cloud atau cross-region. Untuk opsi konektivitas jaringan, lihat Network connectivity solutions.
-
Periksa beban database pada saat sinkronisasi.
Limit synchronization speed
Secara default, tugas Data Integration berjalan dengan kecepatan tertinggi yang mungkin dalam batas konkurensi yang dikonfigurasi. Kecepatan tinggi dapat memberikan tekanan berlebihan pada database produksi Anda. Gunakan rate limiting untuk membatasi throughput.
Pertahankan batas laju pada atau di bawah 30 MB/detik untuk menghindari overload pada database produksi Anda.
Contoh berikut menetapkan batas laju 1 MB/detik di editor kode:
"setting": {
"speed": {
"throttle": true, // Setel ke true untuk mengaktifkan rate limiting.
"mbps": 1 // Batas laju dalam MB/detik.
}
}
Perilaku `throttle`:
-
true: Rate limiting diaktifkan. Anda harus menetapkanmbpske nilai tertentu. Jikambpstidak ditetapkan, tugas gagal atau berperilaku tidak normal. -
false: Rate limiting dinonaktifkan. Nilaimbpsdiabaikan.
Pengukuran traffic: Laju yang diukur oleh Data Integration mencerminkan traffic saluran internal, bukan traffic network interface controller (NIC) aktual. Traffic NIC biasanya 1–2 kali lipat traffic saluran, tergantung pada cara sistem penyimpanan data melakukan serialisasi data.
Rate limiting untuk file semi-terstruktur: File semi-terstruktur tunggal tidak dapat dipisah dan tidak menggunakan split key. Untuk beberapa file, tetapkan batas laju pekerjaan untuk meningkatkan throughput. Laju maksimum efektif bergantung pada jumlah file. Untuk n file:
-
Batas
n+1MB/detik menghasilkan throughput aktualnMB/detik. -
Batas
n-1MB/detik menghasilkan throughput aktualn-1MB/detik.
Rate limiting untuk database relasional: Tetapkan batas laju pekerjaan dan split key. Split key memungkinkan partisi tabel sesuai dengan batas laju. Database relasional umumnya hanya mendukung split key numerik. Database Oracle mendukung split key numerik dan string.
FAQ
-
BatchSize dan maxfilesize: Parameter ini mengontrol jumlah record yang dikomit per batch. Nilai yang lebih besar mengurangi round trip jaringan dan meningkatkan throughput, tetapi jika terlalu tinggi dapat menyebabkan error out-of-memory (OOM) dalam proses sinkronisasi. Jika terjadi error OOM, lihat FAQ about offline synchronization.
Appendix: View actual concurrency
Pada halaman detail log tugas, temukan entri log seperti berikut:
JobContainer - Job set Channel-Number to 2 channels
Nilai channels adalah konkurensi aktual yang digunakan oleh tugas tersebut.
[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.
Appendix: Concurrency and resource usage in exclusive resource groups
Memahami bagaimana konkurensi dipetakan ke CPU dan memory membantu Anda merencanakan pengajuan tugas dan menghindari resource contention.
Concurrency and CPU
Dalam exclusive resource group, rasio konkurensi terhadap vCPU adalah 1:0,5. Instance ECS dengan 4 vCPU dan 8 GiB memory menyediakan kuota konkurensi sebesar 8. Artinya:
-
Maksimal 8 tugas sinkronisasi offline dengan konkurensi 1, atau
-
Maksimal 4 tugas sinkronisasi offline dengan konkurensi 2.
Jika tugas yang baru diajukan memerlukan konkurensi lebih besar daripada kuota yang tersisa, tugas tersebut akan menunggu hingga tugas yang sedang berjalan selesai dan melepaskan sumber daya.
Jika konkurensi suatu tugas melebihi kuota maksimum resource group, tugas tersebut akan menunggu tanpa batas dan menghambat tugas berikutnya. Misalnya, mengajukan tugas dengan konkurensi 10 ke resource group pada instance ECS 4 vCPU / 8 GiB berarti tugas tersebut tidak akan pernah berjalan.
Concurrency and memory
Penggunaan memory per tugas dalam exclusive resource group mengikuti rumus berikut:
Min{768 + (concurrency - 1) × 256, 8029} MB
Timpa pengaturan ini di editor kode dengan menyetel path JSON $.setting.jvmOption.
"setting": {
"errorLimit": {
"record": "0"
},
"speed": {
"throttle": false,
"concurrent": 1
},
"jvmOption": "-Xms1024m -Xmx1024m"
}
Untuk menjaga stabilitas tugas, total memory yang digunakan oleh semua tugas yang sedang berjalan harus setidaknya 1 GB di bawah total memory semua mesin dalam resource group. Jika ambang batas ini terlampaui, Linux OOM Killer dapat menghentikan tugas secara paksa.
Jika Anda tidak menimpa pengaturan memory di editor kode, hanya batas kuota konkurensi yang berlaku saat merencanakan pengajuan tugas.
Appendix: Synchronization speed reference
Tabel berikut mencantumkan throughput rata-rata per konkurensi tunggal untuk konektor umum dalam exclusive resource group. Gunakan nilai-nilai ini sebagai garis dasar saat memperkirakan durasi sinkronisasi yang diharapkan dan menetapkan konkurensi.
Angka-angka ini diukur dalam kondisi terkendali di exclusive resource group. Throughput aktual bervariasi tergantung pada kinerja database Anda, kondisi jaringan, volume data, dan spesifikasi resource group.
Writer plug-ins
| Writer | Average single-concurrency speed (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 plug-ins
| Reader | Average single-concurrency speed (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 |