tar + rsync + untar ความเร็วจะได้รับประโยชน์มากกว่า rsync หรือไม่


25

ฉันมักจะพบว่าตัวเองกำลังส่งโฟลเดอร์ที่มี 10K - 100K ของไฟล์ไปยังเครื่องระยะไกล (ภายในเครือข่ายเดียวกันในมหาวิทยาลัย)

ฉันแค่สงสัยว่ามีเหตุผลที่จะเชื่อ

 tar + rsync + untar

หรือเพียงแค่

 tar (from src to dest) + untar

อาจเร็วกว่าในทางปฏิบัติมากกว่า

rsync 

เมื่อถ่ายโอนไฟล์ที่เป็นครั้งแรก

ฉันสนใจคำตอบที่กล่าวถึงข้างต้นในสองสถานการณ์: ใช้การบีบอัดและไม่ใช้

ปรับปรุง

ฉันเพิ่งเรียกใช้การทดลองบางอย่างซึ่งย้ายไฟล์ขนาดเล็ก 10,000 ไฟล์ (ขนาดโดยรวม = 50 MB) และtar+rsync+untarเร็วกว่าการรันrsyncโดยตรงอย่างสม่ำเสมอ(ทั้งที่ไม่มีการบีบอัด)


คุณกำลังเรียกใช้ rsync ในโหมด daemon ที่ปลายอีกด้านหนึ่งหรือไม่?
JBRWilkinson

4
เรื่อง คำถามเสริมของคุณ:tar cf - . | ssh remotehost 'cd /target/dir && tar xf -'
Gilles 'SO- หยุดความชั่วร้าย'

3
การซิงค์ไฟล์ที่มีขนาดเล็กลงเป็นรายบุคคลผ่าน rsync หรือผลลัพธ์ scp ในแต่ละไฟล์เริ่มต้นอย่างน้อยหนึ่งแพ็กเก็ตข้อมูลของตัวเองผ่านเน็ต หากไฟล์มีขนาดเล็กและแพ็กเก็ตมีจำนวนมากผลลัพธ์นี้จะทำให้โอเวอร์เฮดของโปรโตคอลเพิ่มขึ้น ตอนนี้นับว่ามีมากกว่าหนึ่งแพ็กเก็ตข้อมูลสำหรับแต่ละไฟล์โดยใช้โปรโตคอล rsync เช่นกัน (กำลังถ่ายโอน checksums, เปรียบเทียบ ... ), โอเวอร์เฮดโปรโตคอลสร้างขึ้นอย่างรวดเร็ว ดูWikipedia เกี่ยวกับขนาด MTU
Tatjana Heuser

ขอบคุณ @TatjanaHeuser - หากคุณเพิ่มสิ่งนี้ลงในคำตอบของคุณและไม่รังเกียจที่จะสำรองข้อมูลการอ้างสิทธิ์ที่ rsync ใช้อย่างน้อยหนึ่งแพ็กเก็ตต่อไฟล์ฉันจะยอมรับมัน
Amelio Vazquez-Reina

1
ฉันพบว่ามีการอ่านที่น่าสนใจที่ระบุว่าด้วย scp และ rsync การหน่วงเวลาจะถูกตำหนิด้วยเหตุผลที่แตกต่าง: scp ประพฤติโดยทั่วไปเหมือนกับที่ฉันอธิบาย แต่ rsync เพิ่มประสิทธิภาพการรับภาระของเครือข่ายในราคาที่เพิ่มขึ้นของการสร้างโครงสร้างข้อมูลขนาดใหญ่ ฉันได้รวมไว้ในคำตอบของฉันและจะตรวจสอบในวันหยุดสุดสัปดาห์นี้
Tatjana Heuser

คำตอบ:


24

เมื่อคุณส่งไฟล์ชุดเดียวกันrsyncจะเหมาะกว่าเพราะมันจะส่งความแตกต่างเท่านั้น tarมักจะส่งทุกอย่างและนี่เป็นการสิ้นเปลืองทรัพยากรเมื่อมีข้อมูลจำนวนมากอยู่แล้ว การtar + rsync + untarสูญเสียความได้เปรียบนี้ในกรณีนี้รวมถึงข้อดีของการทำให้โฟลเดอร์rsync --deleteต่างๆ

หากคุณคัดลอกไฟล์เป็นครั้งแรกให้ทำการแพ็คครั้งแรกจากนั้นทำการส่งแล้วการเปิดกล่อง (AFAIK rsyncไม่รับอินพุตแบบไพพ์) ยุ่งยากและแย่กว่าการส่งสัญญาณเพราะrsyncจะไม่ต้องทำงานอะไรมากtarไปกว่านี้

เคล็ดลับ: rsync เวอร์ชัน 3 หรือใหม่กว่าทำการเรียกซ้ำแบบเพิ่มขึ้นซึ่งหมายความว่าจะเริ่มการคัดลอกเกือบจะทันทีก่อนที่จะนับจำนวนไฟล์ทั้งหมด

Tip2: หากคุณใช้rsyncเกินsshคุณอาจใช้tar+ssh

tar -C /src/dir -jcf - ./ | ssh user@server 'tar -C /dest/dir -jxf -'

หรือเพียงแค่ scp

scp -Cr srcdir user@server:destdir

กฎทั่วไปทำให้มันง่าย

UPDATE:

ฉันสร้างข้อมูลตัวอย่าง 59M

mkdir tmp; cd tmp
for i in {1..5000}; do dd if=/dev/urandom of=file$i count=1 bs=10k; done

และทดสอบหลายครั้งการถ่ายโอนไฟล์ไปยังเซิร์ฟเวอร์ระยะไกล (ไม่ใช่ใน LAN เดียวกัน) โดยใช้ทั้งสองวิธี

time rsync -r  tmp server:tmp2

real    0m11.520s
user    0m0.940s
sys     0m0.472s

time (tar cf demo.tar tmp; rsync demo.tar server: ; ssh server 'tar xf demo.tar; rm demo.tar'; rm demo.tar)

real    0m15.026s
user    0m0.944s
sys     0m0.700s

ในขณะที่เก็บบันทึกแยกต่างหากจากแพ็กเก็ตข้อมูล ssh ที่ส่ง

wc -l rsync.log rsync+tar.log 
   36730 rsync.log
   37962 rsync+tar.log
   74692 total

ในกรณีนี้ฉันไม่เห็นข้อได้เปรียบใด ๆ ในการรับส่งข้อมูลเครือข่ายที่น้อยลงโดยใช้ rsync + tar ซึ่งคาดว่าเมื่อเริ่มต้น mtu คือ 1500 และในขณะที่ไฟล์มีขนาด 10k rsync + tar สร้างปริมาณการใช้งานมากขึ้นช้าลง 2-3 วินาทีและทิ้งไฟล์ขยะสองไฟล์ที่ต้องล้างข้อมูล

ฉันทำการทดสอบแบบเดียวกันกับสองเครื่องบน LAN เดียวกันและที่นั่น rsync + tar ทำได้ดีกว่ามากและลดปริมาณการใช้เครือข่าย ฉันถือว่าสาเหตุของเฟรมจัมโบ้

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


จริง "สิ่งที่จำเป็นเท่านั้น" เป็นสิ่งสำคัญแม้ว่าบางครั้งมันอาจจะไม่จริงสัตว์ร้ายที่เรียกว่าrsync;)
0xC0000022L

2
BTW ถ้าคุณใช้การตั้งค่าสถานะzด้วย rsync มันจะบีบอัดการเชื่อมต่อ ด้วยปริมาณพลังงานซีพียูที่เรามีอยู่ทุกวันนี้การบีบอัดนั้นไม่สำคัญเมื่อเทียบกับปริมาณแบนด์วิดท์ที่คุณประหยัดซึ่งสามารถ ~ 1/10 ของการบีบอัดไฟล์ข้อความ
Populus

1
@Populus คุณจะสังเกตเห็นว่าฉันกำลังใช้การบีบอัดกับข้อความตอบกลับดั้งเดิมของฉัน อย่างไรก็ตามในการทดสอบที่ฉันเพิ่มในภายหลังมันไม่สำคัญมากข้อมูลจาก urandom ไม่บีบอัดมาก ... ถ้าเลย
forcefsck

8

rsyncยังบีบอัด ใช้-zธง หากทำงานมากกว่าsshคุณยังสามารถใช้โหมดการบีบอัดของ ssh ความรู้สึกของฉันคือการบีบอัดซ้ำหลายครั้งไม่มีประโยชน์ มันจะเผาวงจรโดยไม่มีผลลัพธ์ที่สำคัญ ฉันขอแนะนำให้ทดลองใช้การrsyncบีบอัด ดูเหมือนว่าค่อนข้างมีประสิทธิภาพ และฉันขอแนะนำให้ข้ามการใช้งานtarหรือการบีบอัดล่วงหน้า / โพสต์อื่น ๆ

ฉันมักจะใช้ rsync rsync -abvz --partial...เป็น


โปรดทราบว่าrsyncโดยค่าเริ่มต้นจะข้ามไฟล์บีบอัดที่มีคำต่อท้ายรวมถึง.gzและ.tgzและอื่น ๆ ค้นหาrsyncman page สำหรับ--skip-compressรายการทั้งหมด
Wildcard

5

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

สภาพแวดล้อม: เดสก์ท็อปเครื่อง i7 ที่มาพร้อมฮาร์ดไดรฟ์ SSD เครื่องปลายทาง Synology NAS DS413j บนการเชื่อมต่อกิกะบิต lan ไปยังเครื่องต้นทาง

สเป็คที่แน่นอนของชุดอุปกรณ์ที่เกี่ยวข้องจะส่งผลกระทบต่อประสิทธิภาพตามธรรมชาติและฉันไม่ทราบรายละเอียดของการตั้งค่าที่แน่นอนเกี่ยวกับคุณภาพของฮาร์ดแวร์เครือข่ายที่ปลายแต่ละด้าน

ไฟล์ต้นฉบับคือโฟลเดอร์ ~ / .cache ของฉันซึ่งมีไฟล์ขนาดเล็กมาก 1.2Gb

1a/ tar files from source machine over the network to a .tar file on remote machine

$ tar cf /mnt/backup/cache.tar ~/.cache

1b/ untar that tar file on the remote machine itself

$ ssh admin@nas_box
[admin@nas_box] $ tar xf cache.tar

2/ rsync files from source machine over the network to remote machine

$ mkdir /mnt/backup/cachetest
$ rsync -ah .cache /mnt/backup/cachetest

ฉันเก็บ 1a และ 1b เป็นขั้นตอนแยกจากกันเพียงเพื่อแสดงให้เห็นถึงงาน สำหรับการใช้งานจริงฉันขอแนะนำสิ่งที่ Gilles โพสต์ข้างต้นเกี่ยวกับการส่งออก tar ท่อผ่าน ssh ไปยังกระบวนการที่ไม่ปรากฏบนเครื่องรับ

การกำหนดเวลา:

1a - 33 seconds

1b - 1 minutes 48 seconds

2 - 22 minutes

เป็นที่ชัดเจนว่า rsync ทำงานได้ไม่ดีอย่างน่าประหลาดใจเมื่อเทียบกับการทำงานของ tar ซึ่งน่าจะเป็นผลมาจากประสิทธิภาพของเครือข่ายทั้งสองที่กล่าวถึงข้างต้น

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

กรงขัง


1
-zการทดสอบนี้ดูเหมือนจะไม่สมบูรณ์หากไม่ใช้ให้ rsync ทำการบีบอัด
สัญลักษณ์แทน

1
กลาสีเรือโดยไม่มีการzโต้แย้งของตัวเองตามที่ฉันใช้มันไม่บีบอัดข้อมูล (ดูunix.stackexchange.com/questions/127169/… ) ดังนั้นเท่าที่ฉันเห็นการใช้ rsync โดยไม่บีบอัดเป็นการเปรียบเทียบที่ยุติธรรม ถ้าฉันส่งออก tar ผ่านไลบรารีการบีบอัดเช่น bzip2 หรือ gzip ใช่แล้ว-zจะมีเหตุผล
Neek

3

การใช้ rsync เพื่อส่งไฟล์เก็บถาวร tar ตามที่ถามจริง ๆ แล้วจะเป็นของเสียหรือทรัพยากรอื่นเนื่องจากคุณจะเพิ่มเลเยอร์การยืนยันลงในกระบวนการ Rsync จะตรวจสอบความถูกต้องของไฟล์ tar เมื่อคุณต้องการตรวจสอบความถูกต้องของแต่ละไฟล์ (มันไม่ช่วยรู้ว่าไฟล์ tar ซึ่งอาจมีข้อบกพร่องในด้านการส่งแล้วแสดงผลเดียวกันในปลายรับ) หากคุณกำลังส่งไฟล์เก็บถาวร ssh / scp คือสิ่งที่คุณต้องการ

เหตุผลหนึ่งที่คุณอาจต้องเลือกส่งการเก็บถาวรอาจเป็นเพราะ tar ที่คุณเลือกสามารถรักษาพิเศษของระบบไฟล์ได้มากขึ้นเช่น Access Control List หรือ Metadata อื่น ๆ ที่เก็บไว้ใน Extended Attributes (Solaris) หรือ Ressource Forks (MacOS) ) เมื่อจัดการกับสิ่งต่าง ๆ ข้อกังวลหลักของคุณคือเครื่องมือที่สามารถเก็บรักษาข้อมูลทั้งหมดที่เกี่ยวข้องกับไฟล์บนระบบไฟล์ต้นทางได้ซึ่งระบบไฟล์เป้าหมายจะมีความสามารถในการติดตามพวกเขาเช่นกัน

เมื่อความเร็วเป็นปัญหาหลักของคุณมันขึ้นอยู่กับขนาดของไฟล์ของคุณ โดยทั่วไปไฟล์ขนาดเล็กจำนวนมากจะปรับขนาดได้แย่กว่า rsync หรือ scp เนื่องจากจะทำให้แต่ละเครือข่ายแต่ละแพ็กเก็ตเสียซึ่งไฟล์ tar จะรวมหลายไฟล์ไว้ในการโหลดข้อมูลของแพ็กเก็ตเครือข่ายเดียว ดียิ่งขึ้นหากไฟล์ tar ถูกบีบอัดเนื่องจากไฟล์ขนาดเล็กน่าจะบีบอัดได้ดีกว่าโดยรวมมากกว่าทีละตัว เท่าที่ฉันรู้ทั้ง rsync และ scp ล้มเหลวในการปรับให้เหมาะสมเมื่อส่งไฟล์เดียวทั้งหมดในการถ่ายโอนครั้งแรกการมีแต่ละไฟล์ครอบครอง data frame ทั้งหมดพร้อมกับโอเวอร์เฮดโปรโตคอลทั้งหมด อย่างไรก็ตามJanecekระบุว่าสิ่งนี้เป็นจริงสำหรับ scp เท่านั้นการยกเลิกการ rsync จะปรับการรับส่งข้อมูลเครือข่ายให้เหมาะสม แต่ด้วยค่าใช้จ่ายในการสร้างโครงสร้างข้อมูลขนาดใหญ่ในหน่วยความจำ ดูบทความ การโอนเงินที่มีประสิทธิภาพไฟล์ Janecek 2006 ดังนั้นตามที่เขาพูดมันยังคงเป็นความจริงที่ทั้ง scp และ rsync ปรับขนาดได้ไม่ดีในไฟล์ขนาดเล็ก แต่ด้วยเหตุผลที่ต่างกันโดยสิ้นเชิง เดาฉันจะต้องขุดลงไปในแหล่งที่มาในสุดสัปดาห์นี้เพื่อค้นหา

สำหรับความเกี่ยวข้องในทางปฏิบัติหากคุณรู้ว่าคุณกำลังส่งไฟล์ที่มีขนาดใหญ่กว่านั้นจะไม่มีความแตกต่างของความเร็วมากนักและการใช้ rsync จะมีประโยชน์มากขึ้นในการรับตำแหน่งที่เหลือเมื่อถูกขัดจังหวะ

Postscriptum: สมัยนี้rdistดูเหมือนจะจมอยู่กับการให้อภัย แต่ก่อนวัน rsync มันเป็นเครื่องมือที่มีความสามารถมากและใช้กันอย่างแพร่หลาย (ปลอดภัยเมื่อใช้กับ ssh ไม่ปลอดภัย) ฉันจะไม่ทำงานได้ดีเท่า rsync แต่เนื่องจากมันไม่ได้เพิ่มประสิทธิภาพเพียงแค่ถ่ายโอนเนื้อหาที่มีการเปลี่ยนแปลง ความแตกต่างที่สำคัญของ rsync นั้นคือวิธีการกำหนดค่าและวิธีการสะกดคำในการอัปเดตไฟล์


Rsync ไม่ได้เพิ่มชั้นการตรวจสอบ ใช้ checksums เพื่อค้นหาความแตกต่างของไฟล์ที่มีอยู่เท่านั้นไม่ใช่เพื่อตรวจสอบผลลัพธ์ ในกรณีที่สำเนาสดไม่มีการตรวจสอบ ในกรณีที่สำเนาไม่สด checksums ช่วยคุณแบนด์วิดธ์
forcefsck

2

สำหรับไดเร็กทอรีขนาดเล็ก (เล็กเหมือนในพื้นที่ดิสก์ที่ใช้) ขึ้นอยู่กับโอเวอร์เฮดของการตรวจสอบข้อมูลไฟล์สำหรับไฟล์ที่ซิงค์ ในอีกด้านหนึ่งrsyncช่วยประหยัดเวลาในการถ่ายโอนไฟล์ที่ไม่ได้แก้ไขในทางกลับกันแน่นอนว่ามันจะต้องถ่ายโอนข้อมูลเกี่ยวกับแต่ละไฟล์

ผมไม่ทราบว่า internals rsyncของ ไม่ว่าไฟล์สถิติจะทำให้เกิดความล่าช้าหรือไม่นั้นขึ้นอยู่กับวิธีการrsyncถ่ายโอนข้อมูล - หากสถิติไฟล์ถูกถ่ายโอนทีละไฟล์ RTT อาจทำให้ tar + rsync + untar เร็วขึ้น

แต่ถ้าคุณมีให้บอกว่า 1 GiB ของข้อมูล rsync จะเร็วขึ้นดีกว่าเว้นแต่ว่าการเชื่อมต่อของคุณจะเร็วมาก!


1

ฉันต้องย้ายข้อมูลไม่กี่เทราไบต์ทั่วประเทศเพียงครั้งเดียว เป็นการทดลองฉันใช้การถ่ายโอนสองรายการโดยใช้rsyncและssh/tarเพื่อดูว่าพวกเขาเปรียบเทียบอย่างไร

ผลลัพธ์ที่ได้:

  • rsync ถ่ายโอนไฟล์ในอัตราเฉลี่ย 2.76 เมกะไบต์ต่อวินาที
  • ssh/tar ถ่ายโอนไฟล์ในอัตราเฉลี่ย 4.18 เมกะไบต์ต่อวินาที

รายละเอียด: ข้อมูลของฉันประกอบด้วยไฟล์บีบอัด. gz หลายล้านไฟล์ขนาดเฉลี่ยคือ 10 เมกะไบต์ แต่บางไฟล์มีขนาดมากกว่ากิกะไบต์ มีโครงสร้างไดเรกทอรี แต่ถูกแคระแกร็นโดยขนาดของข้อมูลภายในไฟล์ หากฉันมีเกือบจะทำสิ่งอื่นฉันจะใช้rsyncแต่ในกรณีนี้ssh/tarมันเป็นทางออกที่ทำงานได้

งานของฉันrsyncประกอบด้วย:

rsync --compress --stats --no-blocking-io --files-from=fileList.txt -av otherSystem:/the/other/dir/ dest/

โดยที่ fileList.txt เป็นรายการชื่อพา ธ แบบสัมพัทธ์ของไฟล์ที่อยู่อีกด้านหนึ่ง (ฉันสังเกตเห็นว่า--compressมันไม่ได้ผลสำหรับไฟล์บีบอัดหลังจากที่ฉันเริ่ม แต่ฉันจะไม่กลับไปเริ่มใหม่)

ฉันเริ่มต้นด้วย ssh และ tar ที่มี:

ssh otherSystem "cd /the/other/dir/;  tar cf - ." | tar xvf -

คุณจะสังเกตเห็นสำเนานี้ทุกอย่างขอโทษนี่ไม่ใช่แอปเปิ้ล 100% เปรียบเทียบแอปเปิ้ล

ฉันควรเพิ่มสิ่งนั้นในขณะที่ฉันใช้เครือข่าย บริษัท ภายในฉันต้องผ่านคนกลางเพื่อไปยังคอมพิวเตอร์ของแหล่งข้อมูล เวลา ping จากคอมพิวเตอร์เป้าหมายของฉันไปยังตัวกลางคือ 21 ms และจากตัวกลางไปยังแหล่งข้อมูลคือ 26 ms นี่คือเหมือนกันสำหรับการถ่ายโอนทั้งสอง

การเชื่อมต่อ SSL ผ่านตัวกลางสามารถทำได้ผ่าน~/.ssh/configรายการ:

Host otherSystem
    Hostname dataSource.otherSide.com
    User myUser
    Port 22
    ProxyCommand ssh -q -W %h:%p intermediary.otherSide.com
    IdentityFile   id_rsa.priv

อัปเดต: หกชั่วโมงในการถ่ายโอน ssh / tar ระบบของฉันตัดสินใจที่จะยกเลิกการเชื่อมต่อกับอุปกรณ์ SAN ที่ฉันกำลังย้ายข้อมูลไป ตอนนี้ฉันจะต้องคิดออกว่ามีการถ่ายโอนและสิ่งที่ไม่ได้ซึ่งฉันอาจจะทำกับ rsync บางครั้งมันไม่คุ้มค่ากับเวลาที่คุณต้องใช้เพื่อประหยัดเวลา
user1683793

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