Ada banyak faktor yang membatasi kinerja ekspor.
- Ukuran data relatif besar dibandingkan dengan memori yang tersedia:~2 TB vs. ~5 GB cache WiredTiger (jika disetel ke default). Yaitu:
- Seluruh cache WiredTiger hanya dapat berisi paling baik ~0,22% dari koleksi, pada kenyataannya sangat mungkin jauh lebih kecil dari ini karena cache akan berisi data dari koleksi dan indeks lain.
- Ini berarti bahwa WiredTiger harus sering mengambil dari disk, sambil mengeluarkan konten cache saat ini. Jika kumpulan replika sedang digunakan secara aktif, ini berarti mengeluarkan data "kotor" dari cache dan menyimpannya ke disk, yang akan memakan waktu.
- Perhatikan bahwa dokumen di dalam cache WiredTiger tidak dikompresi.
- Koleksi berisi dokumen besar, yang Anda hanya memerlukan satu bagian saja. Artinya, diperlukan waktu ekstra untuk memproses dokumen.
- Koleksi dikompresi dengan zlib, artinya waktu ekstra harus digunakan untuk membuka kompresi dokumen.
- ReadPreference adalah
secondaryPreferred
, yang berarti bahwa ia akan mencoba membaca dari sekunder. Jika kumpulan replika sedang ditulis secara aktif, operasi penerapan oplog pada sekunder akan memblokir pembaca. Ini akan menambah penundaan lebih lanjut.
Salah satu peningkatan yang mungkin adalah jika ini adalah operasi yang sering Anda lakukan, membuat indeks pada bidang yang relevan dan mengekspornya menggunakan kueri tercakup dapat meningkatkan kinerja karena indeks akan lebih kecil daripada dokumen lengkap.
Edit:Menjalankan mongoexport
secara paralel dapat membantu dalam kasus ini:
Lebih jauh dari informasi tambahan yang diberikan, saya menjalankan tes yang tampaknya sedikit meringankan masalah ini.
Tampaknya menjalankan mongoexport
secara paralel, di mana setiap mongoexport
menangani subset koleksi mungkin dapat mempercepat ekspor.
Untuk melakukannya, bagi _id
namespace sesuai dengan jumlah mongoexport
proses yang Anda rencanakan untuk dijalankan.
Misalnya, jika saya memiliki 200.000 dokumen, dimulai dengan _id:0
ke _id:199,999
dan menggunakan 2 mongoexport
proses:
mongoexport -q '{"_id":{"$gte":0, "$lt":100000}}' -d test -c test > out1.json &
mongoexport -q '{"_id":{"$gte":100000, "$lt":200000}}' -d test -c test > out2.json &
dimana pada contoh di atas, dua mongoexport
proses masing-masing menangani setengah dari koleksi.
Menguji alur kerja ini dengan 1 proses, 2 proses, 4 proses, dan 8 proses Saya sampai pada waktu berikut:
Menggunakan 1 proses:
real 0m32.720s
user 0m33.900s
sys 0m0.540s
2 proses:
real 0m16.528s
user 0m17.068s
sys 0m0.300s
4 proses:
real 0m8.441s
user 0m8.644s
sys 0m0.140s
8 proses:
real 0m5.069s
user 0m4.520s
sys 0m0.364s
Bergantung pada sumber daya yang tersedia, menjalankan 8 mongoexport
proses secara paralel tampaknya mempercepat proses dengan faktor ~6. Ini telah diuji dalam mesin dengan 8 inti.
Catatan :jawaban halfer serupa dalam ide, meskipun jawaban ini pada dasarnya mencoba untuk melihat apakah ada manfaat dalam memanggil mongoexport
secara paralel.