วิธีใดที่เร็วที่สุดในการคัดลอกไฟล์ 400G จากปริมาณการจัดเก็บบล็อกยืดหยุ่น EC2 ไปยัง s3


21

ฉันต้องคัดลอกไฟล์ 400G จากไดรฟ์ข้อมูลที่เก็บบล็อกแบบยืดหยุ่นไปยังที่เก็บข้อมูล s3 ... ไฟล์เหล่านี้มีขนาดประมาณ 300k ไฟล์ ~ 1Mb

ฉันลองs3cmdและs3fuseทั้งสองอย่างช้ามาก .. s3cmd วิ่งมาทั้งวันกล่าวว่าการคัดลอกเสร็จสิ้นและเมื่อฉันตรวจสอบที่ฝากข้อมูลไม่มีอะไรเกิดขึ้น (อย่างน้อยฉันคิดว่ามีบางอย่างผิดปกติ แต่อย่างน้อย s3cmd ไม่เคยบ่นอะไรเลย)

S3Fuse กำลังทำงานตลอดทั้งวันและคัดลอกไฟล์น้อยกว่า 10% ...

มีวิธีแก้ปัญหาที่ดีกว่านี้หรือไม่?

ฉันใช้งาน Linux (ubuntu 12.04) แน่นอน


2
เกณฑ์มาตรฐานจำนวนมาก (เช่นอันนี้ ) ได้แสดงให้เห็นถึง 3 ปัจจัยที่กำหนดปริมาณงานถึง S3: 1) ขนาดไฟล์ 2) จำนวนเธรดแบบขนานและ 3) ขนาดอินสแตนซ์ ระหว่าง 64 และ 128 ขนาน (พร้อมกัน) การอัปโหลดวัตถุ 1MB ควรอัปโหลดอัปลิงค์ 1Gbps ที่ m1.x large มีและควรอัปโหลดอัปลิงค์ 10Gbps ของอินสแตนซ์ของการคำนวณคลัสเตอร์ (cc1.4xlarge) ด้วย ควรมีสคริปต์จำนวนมากที่มีสิ่งนี้ในใจ (เช่นอันนี้หรือการดัดแปลง
s3cmd

1
s3-parallel-put ได้หลอกลวง!
aseba

คำตอบ:


20

มีปัจจัยสำคัญหลายประการที่กำหนดปริมาณงานจาก EC2 ถึง S3:

  • ขนาดไฟล์ - ไฟล์ขนาดเล็กต้องการจำนวนคำขอที่มากกว่าและค่าใช้จ่ายที่มากกว่าและการถ่ายโอนช้าลง การเพิ่มขนาดไฟล์เมื่อมาจาก EC2 นั้นเล็กน้อยสำหรับไฟล์ที่มีขนาดใหญ่กว่า 256kB (ในขณะที่การถ่ายโอนจากสถานที่ห่างไกลโดยมีความหน่วงแฝงที่สูงกว่ามีแนวโน้มที่จะแสดงการปรับปรุงที่เห็นได้อย่างต่อเนื่องจนกระทั่งระหว่าง 1MiB และ 2MiB)
  • จำนวนเธรดแบบขนาน - เธรดการอัปโหลดเดียวมักจะมีค่าค่อนข้างต่ำตลอด - มักจะต่ำกว่า 5MiB / s ปริมาณงานเพิ่มขึ้นตามจำนวนเธรดที่เกิดขึ้นพร้อมกันและมีแนวโน้มสูงระหว่าง 64 ถึง 128 เธรด ควรสังเกตว่าอินสแตนซ์ขนาดใหญ่สามารถจัดการเธรดพร้อมกันจำนวนมากขึ้น
  • ขนาดอินสแตนซ์ - ตามข้อกำหนดของอินสแตนซ์อินสแตนซ์ที่ใหญ่กว่ามีทรัพยากรที่ทุ่มเทมากกว่ารวมถึงการจัดสรรแบนด์วิธเครือข่าย (และ I / O โดยทั่วไปที่ใหญ่กว่า (และน้อยกว่า) - รวมถึงการอ่านจากดิสก์ ephemeral / EBS - ซึ่งเชื่อมต่อเครือข่าย ค่าตัวเลขสำหรับแต่ละประเภทคือ:
    • สูงมาก: เชิงทฤษฎี: 10Gbps = 1250MB / s; สมจริง: 8.8Gbps = 1100MB / s
    • สูง: ตามทฤษฎี: 1Gbps = 125MB / s; สมจริง: 750Mbps = 95MB / s
    • ปานกลาง: ตามทฤษฎี: 250Mbps สมจริง: 80Mbps = 10MB / s
    • ต่ำ: ตามทฤษฎี: 100Mbps; สมจริง: 10-15Mbps = 1-2MB / s

ในกรณีของการถ่ายโอนข้อมูลจำนวนมากอาจเป็นประโยชน์ทางเศรษฐกิจในการใช้อินสแตนซ์การคำนวณแบบคลัสเตอร์เนื่องจากการเพิ่มประสิทธิภาพในปริมาณงาน (> 10x) มีค่ามากกว่าความแตกต่างของต้นทุน (2-3x)

ในขณะที่ความคิดข้างต้นค่อนข้างสมเหตุสมผล (แม้ว่าอาจจะไม่ได้ต่อเธรด) แต่ก็เป็นเรื่องง่ายที่จะหาเกณฑ์มาตรฐาน หนึ่งในรายละเอียดโดยเฉพาะอย่างยิ่งสามารถพบได้ที่นี่

การใช้การอัพโหลดระหว่าง 1 ถึง 64 และ 128 ขนาน (พร้อมกัน) ของวัตถุ 1MB ควรทำให้อัปลิงค์อัป 1Gbps ที่ m1.x large มีและควรทำให้อัปลิงค์ 10Gbps ของอินสแตนซ์ของคลัสเตอร์คำนวณ (cc1.4xlarge) ด้วย

แม้ว่าการเปลี่ยนขนาดอินสแตนซ์จะค่อนข้างง่าย แต่ปัจจัยอีกสองประการอาจจัดการได้ยากกว่า

  • ขนาดไฟล์มักจะได้รับการแก้ไข - เราไม่สามารถเข้าร่วมไฟล์ด้วยกันบน EC2 และแบ่งไฟล์ออกเป็น S3 (ดังนั้นไม่มีอะไรที่เราสามารถทำได้เกี่ยวกับไฟล์ขนาดเล็ก) ไฟล์ขนาดใหญ่อย่างไรก็ตามเราสามารถแยกทางด้าน EC2 และรวมกันอีกด้านของ S3 (โดยใช้การอัปโหลดหลายส่วนของ S3) โดยทั่วไปจะเป็นประโยชน์สำหรับไฟล์ที่มีขนาดใหญ่กว่า 100MB
  • เธรดแบบขนานนั้นค่อนข้างยากที่จะรองรับ วิธีที่ง่ายที่สุดในการเขียน wrapper สำหรับสคริปต์อัพโหลดที่มีอยู่ซึ่งจะเรียกใช้หลาย ๆ ชุดพร้อมกัน แนวทางที่ดีกว่านั้นใช้ API โดยตรงเพื่อให้ได้สิ่งที่คล้ายกัน โปรดทราบว่าคีย์นั้นเป็นคำขอแบบขนานจึงไม่ยากที่จะค้นหาสคริปต์ที่อาจเกิดขึ้นได้หลายตัวอย่างเช่น:
    • s3cmd-modified - ทางแยกของรุ่นก่อนหน้าของ s3cmd ที่เพิ่มฟังก์ชั่นนี้ แต่ยังไม่ได้รับการปรับปรุงในหลายปีที่ผ่านมา
    • s3-parallel-put - สคริปต์ python ล่าสุดที่ใช้งานได้ดี

8

ดังนั้นหลังจากการทดสอบs3-parallel-putจำนวนมากกลอุบายก็สุดยอดมาก ชัดเจนวิธีแก้ปัญหาถ้าคุณต้องการอัปโหลดไฟล์จำนวนมากไปยัง S3 ขอบคุณcyberx86สำหรับความคิดเห็น


3
จากความอยากรู้ก) ใช้เวลานานแค่ไหนในการอัปโหลด 400GB ข) คุณใช้เธรดจำนวนเท่าใด c) อินสแตนซ์ขนาดใดที่คุณใช้
cyberx86

1
@ Cyberx86 ฉันเพิ่งใช้ s3-parallel-put กับอินสแตนซ์ขนาดใหญ่ Ec2 ฉันใช้ 5 เธรดและคัดลอก 288.73 GB ใน 10.49 ชั่วโมง
Gortron

4

ปรับแต่ง AWS CLI S3 การตั้งค่าคอนฟิกค่าตามhttp://docs.aws.amazon.com/cli/latest/topic/s3-config.html

ด้านล่างเพิ่มความเร็วในการซิงค์ S3 อย่างน้อย 8x!

ตัวอย่าง:

$ more ~/.aws/config
[default]
aws_access_key_id=foo
aws_secret_access_key=bar
s3 =
   max_concurrent_requests = 100
   max_queue_size = 30000

2

ฉันเขียนแอปพลิเคชั่นคอนโซลที่ปรับให้เหมาะสมใน C # ( CopyFasterToS3 ) เพื่อทำสิ่งนี้ ฉันใช้ใน EBS ฉบับฉันมี 5 โฟลเดอร์ที่มีไฟล์มากกว่า 2 ล้านไฟล์ในปริมาณ 20Gb สคริปต์ทำงานในเวลาน้อยกว่า 30 นาที

ในบทความนี้ฉันแสดงให้เห็นถึงวิธีการใช้ฟังก์ชั่นซ้ำด้วยขนาน คุณสามารถถอดเสียงเป็นภาษาอื่นได้

โชคดี!




1

ลองใช้s3-cliแทน s3cmd ฉันใช้มันแทน s3cmd เพื่ออัปโหลดไฟล์ไปยังที่เก็บ s3 ของฉันและทำให้การปรับใช้ของฉันเร็วขึ้นเกือบ 17 นาที (จาก 21 ถึง 4 นาที)!

นี่คือลิงค์: https://github.com/andrewrk/node-s3-cli

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.