วิธีที่เร็วที่สุดในการคัดลอกไฟล์แบบกระจายคืออะไร? วิธีใดที่ทำให้ไฟล์มีขนาดเล็กที่สุด?


11

ความเป็นมา : ฉันกำลังคัดลอกอิมเมจ qcow2 VM ที่มีขนาด 200GB แต่มีบล็อกจัดสรร 16GB ฉันได้ลองวิธีการต่าง ๆ เพื่อคัดลอกไฟล์กระจัดกระจายภายในเซิร์ฟเวอร์เดียวกันและมีผลลัพธ์เบื้องต้น สภาพแวดล้อมคือ RHEL 6.6 หรือ CentOS 6.6 x64

ls -lhs srcFile 
16G -rw-r--r-- 1 qemu qemu 201G Feb  4 11:50 srcFile

ผ่าน cp - ความเร็วที่ดีที่สุด

cp --sparse=always srcFile dstFile
Performance Notes:
    Copied 200GB max/16GB actual VM as 200GB max/26GB actual, bloat: 10GB
    Copy time: 1:02 (mm:ss) 

Via dd - นักแสดงโดยรวมที่ดีที่สุด

dd if=srcFile of=dstFile iflag=direct oflag=direct bs=4M conv=sparse
Performance Notes:
    Copied 200GB max/16GB actual VM as 200GB max/21GB actual, bloat: 5GB
    Copy time: 2:02 (mm:ss)

ผ่าน cpio

mkdir tmp$$
echo srcFile | cpio -p --sparse tmp$$; mv tmp$$/srcFile dstFile
rmdir tmp$$
Performance Notes:
    Copied 200GB max/16GB actual VM as 200GB max/26GB actual, bloat: 10GB
    Copy time: 9:26 (mm:ss)

ผ่าน rsync

rsync --ignore-existing -aS srcFile dstFile
Performance Notes:
    Copied 200GB max/16GB actual VM as 200GB max/26GB actual, bloat: 10GB
    Copy time: 24:49 (mm:ss)

ผ่าน virt-sparsify - ขนาดที่ดีที่สุด

virt-sparsify srcFile dstFile
    Copied 200GB max/16GB actual VM as 200GB max/16GB actual, bloat: 0
    Copy time: 17:37 (mm:ss)

บล็อกที่ต่างกันไป

ฉันกังวลเกี่ยวกับ 'bloat' ในระหว่างการคัดลอกวันที่ (เพิ่มขนาดไฟล์จากต้นฉบับ) ดังนั้นฉันจึงเปลี่ยนแปลงขนาดบล็อก ฉันใช้ 'เวลา' เพื่อรับเวลารวมและ CPU% ไฟล์ต้นฉบับในกรณีนี้คือไฟล์ 200GB แบบกระจายขนาด 7.3GB:

4K:   5:54.64, 56%, 7.3GB
8K:   3:43.25, 58%, 7.3GB
16K:  2:23.20, 59%, 7.3GB
32K:  1:49.25, 62%, 7.3GB
64K:  1:33.62, 64%, 7.3GB
128K: 1:40.83, 55%, 7.4GB
256K: 1:22.73, 64%, 7.5GB
512K: 1:44.84, 74%, 7.6GB
1M:   1:16.59, 70%, 7.9GB
2M:   1:21.58, 66%, 8.4GB
4M:   1:17.52, 69%, 9.5GB
8M:   1:10.92, 76%, 12GB
16M:  1:17.09, 78%, 16GB
32M:  2:54.10, 90%, 22GB

คำถาม : คุณสามารถตรวจสอบได้หรือไม่ว่าฉันได้ระบุวิธีที่ดีที่สุดสำหรับการคัดลอกไฟล์แบบกระจายเพื่อให้ได้ประสิทธิภาพโดยรวมที่ดีที่สุด ข้อเสนอแนะใด ๆ เกี่ยวกับวิธีการทำสิ่งนี้ให้ดีขึ้นนั้นยินดีรับเช่นเดียวกับข้อกังวลที่คุณอาจมีกับวิธีการที่ฉันใช้


สิ่งเดียวที่ฉันจะลองด้วยความพยายามที่น่ายกย่องของคุณคือ rsync กับตัวเลือก - อาจเป็นไปได้ว่าขนาดบล็อกที่แตกต่างกันใน dd จะช่วยเพิ่มความเร็วหรือขยายตัว
mpez0

น้ำมันดินก็เป็นสิ่งที่ดีที่จะลองเช่นกัน
Olivier Dulac

@OlivierDulac ฉันลองใช้ tar แต่นี่เป็นนักแสดงที่แย่มากจนฉันไม่ได้ใส่มันเข้าไปด้วย ฉันควรจะมี ด้านบนเป็นสำเนาในเครื่อง ฉันจะเพิ่มข้อมูลประสิทธิภาพการคัดลอกเครือข่ายสำหรับเครือข่าย 10Gbps โดยคัดลอกในซับเน็ตเดียวกัน เมื่อฉันได้สิ่งนั้นมาแล้วฉันคิดว่าฉันจะมีข้อมูลมากพอที่จะสรุปได้ซึ่งเป็นผลงานที่ดีที่สุดโดยรวม
Steve Amerige

rsync ยังสนับสนุน - ขนาดเล็กสำหรับการทำสำเนาลักษณะนี้ คุณอาจต้องการลอง นอกจากนี้ยังมีประโยชน์เพิ่มเติมของการวัดได้ทั้งในระบบโลคอลและเครือข่าย
Travis Campbell

@TravisCampbell ฉันเพิ่มข้อมูลสำหรับ rsync แล้ว มันเป็นนักแสดงที่แย่ที่สุดในการทดสอบทั้งหมดที่ฉันวิ่ง
Steve Amerige

คำตอบ:


5

จากการเปรียบเทียบข้างต้นดูเหมือนว่าการใช้ dd บนฮาร์ดแวร์เป้าหมายของเราด้วยขนาดบล็อก 64K ทำให้เราได้ผลลัพธ์ที่ดีที่สุดโดยรวมเมื่อพิจารณาเวลาคัดลอกและขยาย:

dd if=srcFile of=dstFile iflag=direct oflag=direct bs=64K conv=sparse

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