Manakah cara tercepat untuk menyalin 400G file dari volume penyimpanan blok elastis EC2 ke s3?


21

Saya harus menyalin 400G file dari volume blok toko elastis ke ember s3 ... Itu adalah sekitar 300k file ~ 1Mb

Saya sudah mencoba s3cmd dan s3fuse , keduanya benar-benar lambat .. s3cmd berlari selama satu hari penuh, mengatakan sudah selesai menyalin, dan ketika saya memeriksa ember, tidak ada yang terjadi (saya kira ada yang salah, tapi setidaknya ada yang salah, tapi setidaknya s3cmd tidak pernah mengeluh tentang apa pun)

S3Fuse bekerja untuk satu hari penuh lainnya, dan menyalin kurang dari 10% file ...

Apakah ada solusi yang lebih baik untuk ini?

Saya menjalankan Linux (ubuntu 12.04) tentu saja


2
Banyak tolok ukur (misalnya yang ini ) telah menunjukkan 3 faktor penentu throughput ke S3: 1) ukuran file 2) jumlah utas paralel dan 3) ukuran instance. Antara 64 dan 128 unggahan secara paralel (simultan) objek 1MB harus memenuhi saturasi uplink 1Gbps yang dimiliki oleh m1.xlarge dan bahkan harus memenuhi saturasi uplink 10Gbps dari cluster compute (cc1.4xlarge) instance. Seharusnya ada banyak skrip dengan pemikiran ini (mis. Modifikasi ini atau s3cmd)
cyberx86

1
s3-parallel-put melakukan trik!
aseba

Jawaban:


20

Ada beberapa faktor kunci yang menentukan throughput dari EC2 ke S3:

  • Ukuran file - file yang lebih kecil membutuhkan jumlah permintaan yang lebih besar dan lebih banyak overhead dan transfer lebih lambat. Keuntungan dengan filesize (ketika berasal dari EC2) dapat diabaikan untuk file yang lebih besar dari 256kB. (Padahal, transfer dari lokasi terpencil, dengan latensi lebih tinggi, cenderung terus menunjukkan peningkatan yang cukup besar hingga antara 1MiB dan 2MiB).
  • Jumlah utas paralel - utas unggahan tunggal biasanya memiliki keseluruhan yang cukup rendah - seringkali di bawah 5MiB / s. Throughput meningkat dengan jumlah utas bersamaan, dan cenderung memuncak antara 64 dan 128 utas. Perlu dicatat bahwa instance yang lebih besar mampu menangani lebih banyak thread bersamaan.
  • Ukuran instance - Sesuai spesifikasi instance , instans yang lebih besar memiliki sumber daya yang lebih khusus, termasuk alokasi bandwidth jaringan yang lebih besar (dan lebih sedikit variabel) (dan I / O secara umum - termasuk membaca dari disk ephemeral / EBS - yang terpasang di jaringan. nilai angka untuk setiap kategori adalah:
    • Sangat Tinggi: Teoretis: 10Gbps = 1250MB / s; Realistis: 8,8Gbps = 1100MB / s
    • Tinggi: Teoretis: 1Gbps = 125MB / s; Realistis: 750Mbps = 95MB / s
    • Sedang: Teoritis: 250Mbps; Realistis: 80Mbps = 10MB / s
    • Rendah: Teoretis: 100Mbps; Realistis: 10-15Mbps = 1-2MB / s

Dalam kasus transfer data dalam jumlah besar, mungkin secara ekonomis praktis untuk menggunakan instance komputasi cluster, karena keuntungan efektif dalam throughput (> 10x) lebih dari perbedaan dalam biaya (2-3x).

Meskipun ide-ide di atas cukup logis (meskipun, per-thread cap mungkin tidak), cukup mudah untuk menemukan tolok ukur yang mendukungnya. Satu yang sangat rinci dapat ditemukan di sini .

Menggunakan antara 64 dan 128 paralel (simultan) mengunggah objek 1MB harus menjenuhkan uplink 1Gbps bahwa m1.xlarge memiliki dan bahkan harus menjenuhkan uplink 10Gbps dari sebuah cluster compute (cc1.4xlarge) instance.

Meskipun cukup mudah untuk mengubah ukuran instance, dua faktor lainnya mungkin lebih sulit untuk dikelola.

  • Ukuran file biasanya diperbaiki - kami tidak dapat menggabungkan file bersama di EC2 dan memisahkannya di S3 (jadi, tidak banyak yang bisa kami lakukan tentang file kecil). Namun file-file besar, kita dapat dipisah di sisi EC2 dan berkumpul kembali di sisi S3 (menggunakan unggahan multi-bagian S3). Biasanya, ini menguntungkan untuk file yang lebih besar dari 100MB.
  • Utas paralel agak sulit untuk dipenuhi. Pendekatan paling sederhana adalah menulis pembungkus untuk beberapa skrip unggahan yang ada yang akan menjalankan banyak salinan sekaligus. Pendekatan yang lebih baik menggunakan API secara langsung untuk mencapai sesuatu yang serupa. Perlu diingat bahwa kuncinya adalah permintaan paralel, tidak sulit untuk menemukan beberapa skrip potensial, misalnya:
    • s3cmd-modifikasi - cabang dari versi awal s3cmd yang menambahkan fungsi ini, tetapi belum diperbarui dalam beberapa tahun.
    • s3-parallel-put - skrip python yang cukup baru yang bekerja dengan baik

8

Jadi, setelah banyak pengujian s3-parallel-put melakukan triknya dengan takjub. Jelas solusinya jika Anda perlu mengunggah banyak file ke S3. Terima kasih kepada cyberx86 untuk komentarnya.


3
Karena penasaran, a) berapa lama waktu yang dibutuhkan untuk mengunggah 400GB b) berapa banyak utas yang Anda gunakan c) ukuran instance apa yang Anda gunakan?
cyberx86

1
@ Cyberx86 Saya baru-baru ini menggunakan s3-parallel-put pada Large Ec2 Instance. Saya menggunakan 5 utas dan menyalin 288,73 GB dalam 10,49 jam.
Gortron


2

Saya menulis aplikasi konsol yang dioptimalkan dalam C # ( CopyFasterToS3 ) untuk melakukan ini. Saya menggunakan EBS vol, saya punya 5 folder dengan lebih dari 2 juta file dalam jumlah 20GB. Script dieksekusi dalam waktu kurang dari 30 menit.

Pada artikel ini saya menunjukkan cara menggunakan fungsi rekursif dengan paralel. Anda dapat menyalinnya ke bahasa lain.

Semoga berhasil!




1

Coba gunakan s3-cli bukan s3cmd. Saya menggunakannya sebagai ganti s3cmd untuk mengunggah file ke ember s3 saya dan itu membuat penyebaran saya lebih cepat hampir 17 menit (dari 21 hingga 4 menit)!

Inilah tautannya: https://github.com/andrewrk/node-s3-cli

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.