rsync เร็วขึ้นของไดเรกทอรีใหญ่ซึ่งไม่ได้เปลี่ยน


13

เราใช้ rsync กับเซิร์ฟเวอร์สำรอง

น่าเสียดายที่เครือข่ายไปยังเซิร์ฟเวอร์บางแห่งช้า

ใช้เวลาสูงสุดห้านาทีในการตรวจสอบ rsync ว่าไม่มีอะไรเปลี่ยนแปลงในไดเรกทอรีขนาดใหญ่ แผนผังไดเร็กทอรีขนาดใหญ่เหล่านี้มีไฟล์ขนาดเล็กจำนวนมาก (ประมาณ 80k ไฟล์)

ฉันเดาว่าไคลเอนต์ rsync จะส่งข้อมูลสำหรับไฟล์ 80k แต่ละไฟล์

เนื่องจากเครือข่ายช้าฉันต้องการหลีกเลี่ยงการส่งข้อมูล 80k เท่าของแต่ละไฟล์

มีวิธีบอก rsync ให้แฮชผลรวมของต้นไม้ไดเรกทอรีย่อยหรือไม่

วิธีนี้ไคลเอ็นต์ rsync จะส่งเพียงไม่กี่ไบต์สำหรับทรีไดเรกทอรีขนาดใหญ่

ปรับปรุง

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

Update2

มีไฟล์ 80k ในไดเรกทอรีหนึ่งต้นไม้ แต่ละไดเรกทอรีเดียวไม่มีไฟล์หรือไดเรกทอรีย่อยมากกว่า 2k

Update3

รายละเอียดเกี่ยวกับความช้าของเครือข่าย:

time ssh einswp 'cd attachments/200 && ls -lLR' >/tmp/list
real    0m2.645s

ขนาดของไฟล์ tmp / list: 2MByte

time scp einswp:/tmp/list tmp/
real    0m2.821s

สรุป: SCP มีความเร็วเท่ากัน (ไม่แปลกใจ)

time scp einswp:tmp/100MB tmp/
real    1m24.049s

ความเร็ว: 1.2MB / s


1
คุณอาจอ่านบน zsync ฉันไม่ได้ใช้ด้วยตัวเอง แต่จากสิ่งที่ฉันอ่านมันจะแสดงเมทาดาทาที่ฝั่งเซิร์ฟเวอร์ล่วงหน้าและอาจทำให้การถ่ายโอนเร็วขึ้นในกรณีของคุณ อาจเป็นการทดสอบที่คุ้มค่า นอกเหนือจากนั้นโซลูชันอื่น ๆ เท่านั้นที่ฉันทราบคือการทำข้อมูลให้ตรงกันแบบเรียลไทม์ระดับบล็อกที่มาพร้อมกับโซลูชันของ san / nas
แอรอน

คำตอบ:


36

บางจุดที่ไม่เกี่ยวข้อง:

80K เป็นไฟล์จำนวนมาก

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

ตรวจสอบเวอร์ชั่น rsync ของคุณ

rsync ที่ทันสมัยจัดการกับไดเรกทอรีขนาดใหญ่ได้ดีกว่าในอดีต ตรวจสอบให้แน่ใจว่าคุณใช้เวอร์ชันล่าสุด

แม้ rsync แบบเก่าจะจัดการไดเรกทอรีขนาดใหญ่ได้ค่อนข้างดีผ่านลิงก์เวลาแฝงที่สูง ... แต่ไฟล์ 80k นั้นไม่ใหญ่ ... มันใหญ่มาก

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

ตรวจสอบให้แน่ใจ - ไม่ได้ตรวจสอบการใช้งาน

--checksum(หรือ-c) ต้องอ่านแต่ละบล็อคของไฟล์ทุกไฟล์ คุณอาจจะได้รับจากพฤติกรรมเริ่มต้นเพียงแค่อ่านเวลาแก้ไข (เก็บไว้ในไอโหนด)

แบ่งงานออกเป็นชุดเล็ก ๆ

มีบางโปรเจ็กต์เช่นGigasyncซึ่งจะ "สับภาระงานโดยใช้ Perl เพื่อหักทอนไดเรกทอรีไดเรกตอรีสร้างรายการไฟล์ขนาดเล็กเพื่อถ่ายโอนด้วย rsync"

การสแกนไดเรกทอรีพิเศษจะมีค่าใช้จ่ายจำนวนมาก แต่อาจเป็นการชนะสุทธิ

ค่าเริ่มต้นของระบบปฏิบัติการไม่ได้ถูกสร้างขึ้นมาสำหรับสถานการณ์นี้

หากคุณใช้ Linux / FreeBSD / etc พร้อมค่าเริ่มต้นทั้งหมดประสิทธิภาพจะแย่สำหรับแอปพลิเคชันทั้งหมดของคุณ ค่าเริ่มต้นจะถือว่าไดเรกทอรีขนาดเล็กเพื่อไม่ให้เสีย RAM ในแคชที่มีขนาดใหญ่

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

ดูที่ "แคช namei"

ระบบปฏิบัติการที่คล้าย BSD มีแคชที่เร่งการค้นหาชื่อไปยัง inode ("แคช" namei ") มีแคช namei สำหรับแต่ละไดเรกทอรีหากมีขนาดเล็กเกินไปจะเป็นอุปสรรคมากกว่าการปรับให้เหมาะสม เนื่องจาก rsync กำลังทำ lstat () ในแต่ละไฟล์ inode จะถูกเข้าถึงสำหรับไฟล์ 80k ทุกไฟล์ซึ่งอาจทำให้แคชของคุณขาดหายลองศึกษาวิธีปรับแต่งประสิทธิภาพของไดเรกทอรีไฟล์ในระบบของคุณ

พิจารณาระบบไฟล์อื่น

XFS ถูกออกแบบมาเพื่อจัดการกับไดเรกทอรีที่ใหญ่กว่า ดูระบบไฟล์จำนวนมากในหนึ่งไดเรกทอรี

อาจจะเป็น 5 นาทีที่ดีที่สุดที่คุณสามารถทำได้

พิจารณาการคำนวณจำนวนดิสก์บล็อกที่กำลังอ่านและคำนวณความเร็วที่คุณควรคาดหวังว่าฮาร์ดแวร์จะสามารถอ่านบล็อกจำนวนนั้นได้

บางทีความคาดหวังของคุณสูงเกินไป พิจารณาจำนวนดิสก์บล็อกที่ต้องอ่านเพื่อทำ rsync โดยไม่มีไฟล์ที่เปลี่ยนแปลง: แต่ละเซิร์ฟเวอร์จะต้องอ่านไดเรกทอรีและอ่านหนึ่ง inode ต่อไฟล์ สมมติว่าไม่มีแคชใด ๆ เพราะไฟล์ 80k อาจทำให้คุณมีแคช สมมุติว่ามันเป็นบล็อกขนาด 80k ที่ทำให้คณิตศาสตร์ง่ายขึ้น นั่นคือข้อมูลประมาณ 40M ซึ่งควรอ่านได้ในไม่กี่วินาที อย่างไรก็ตามหากจำเป็นต้องมีดิสก์ค้นหาระหว่างแต่ละบล็อกซึ่งอาจใช้เวลานานกว่านั้นมาก

ดังนั้นคุณจะต้องอ่านดิสก์บล็อกประมาณ 80,000 บล็อก ฮาร์ดไดรฟ์ของคุณสามารถทำเช่นนั้นได้เร็วแค่ไหน? พิจารณาว่านี่เป็น I / O แบบสุ่มไม่ใช่การอ่านเชิงเส้นยาว 5 นาทีอาจยอดเยี่ยมมาก นั่นคือ 1 / (80000/600) หรือดิสก์อ่านทุก ๆ 7.5 มิลลิวินาที เร็วหรือช้าสำหรับฮาร์ดไดรฟ์ของคุณหรือไม่ มันขึ้นอยู่กับรุ่น

เปรียบเทียบกับสิ่งที่คล้ายกัน

วิธีคิดอีกอย่างคือว่านี่ หากไม่มีไฟล์ใดเปลี่ยนแปลงls -Llrกิจกรรมของดิสก์จะเท่ากัน แต่จะไม่อ่านข้อมูลไฟล์ใด ๆ เวลาที่ls -Llrใช้ในการวิ่งคือขอบเขตสูงสุดของคุณ

  • rsync (โดยไม่มีการเปลี่ยนแปลงไฟล์) ช้ากว่าอย่างมากls -Llrหรือไม่ จากนั้นตัวเลือกที่คุณใช้สำหรับ rsync สามารถปรับปรุงได้ อาจ-cถูกเปิดใช้งานหรือตั้งค่าสถานะอื่นที่อ่านมากกว่าไดเรกทอรีและข้อมูลเมตา (ข้อมูล inode)

  • rsync (โดยไม่มีการเปลี่ยนแปลงไฟล์) เกือบเร็วเท่ากับls -Llrหรือไม่ จากนั้นคุณได้ปรับ rsync ให้ดีที่สุดเท่าที่จะทำได้ คุณต้องปรับแต่งระบบปฏิบัติการเพิ่ม RAM รับไดรฟ์ที่เร็วกว่าเปลี่ยนระบบไฟล์ ฯลฯ

คุยกับ devs ของคุณ

ไฟล์ 80k เป็นเพียงการออกแบบที่ไม่ดี ระบบไฟล์และเครื่องมือระบบน้อยมากที่จัดการไดเรกทอรีขนาดใหญ่เช่นนี้ได้เป็นอย่างดี หากชื่อไฟล์เป็น abcdefg.txt ให้พิจารณาจัดเก็บไว้ใน abdc / abcdefg.txt (จดบันทึกการทำซ้ำ) สิ่งนี้จะแบ่งไดเรกทอรีออกเป็นไดเรกทอรีที่เล็กกว่า แต่ไม่ต้องการการเปลี่ยนแปลงโค้ดมากนัก

นอกจากนี้ .... พิจารณาใช้ฐานข้อมูล หากคุณมีไฟล์ 80k ในไดเรกทอรีบางทีนักพัฒนาของคุณกำลังแก้ไขข้อเท็จจริงที่ว่าสิ่งที่พวกเขาต้องการจริงๆคือฐานข้อมูล MariaDB หรือ MySQL หรือ PostgreSQL จะเป็นตัวเลือกที่ดีกว่าสำหรับการจัดเก็บข้อมูลจำนวนมาก

เฮ้เกิดอะไรขึ้นกับ 5 นาที?

สุดท้ายนี้ 5 นาทีแย่จริงๆเหรอ? หากคุณเรียกใช้การสำรองข้อมูลนี้วันละครั้ง 5 นาทีไม่ใช่เวลามาก ใช่ฉันรักความเร็ว อย่างไรก็ตามหาก 5 นาทีนั้น "ดีพอ" สำหรับลูกค้าของคุณก็จะดีพอสำหรับคุณ หากคุณไม่มี SLA เป็นลายลักษณ์อักษรคุณจะได้รับการสนทนาอย่างไม่เป็นทางการกับผู้ใช้ของคุณเพื่อดูว่าพวกเขาคาดหวังว่าการสำรองข้อมูลจะดำเนินไปอย่างรวดเร็ว

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

อัปเดต:หลังจากการสนทนาเราได้พิจารณาแล้วว่าคอขวดเป็นเครือข่าย ฉันจะแนะนำ 2 อย่างก่อนที่จะยอมแพ้ :-)

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

80K เป็นจำนวนมากของไฟล์ .: มี 80k ไฟล์ในไดเรกทอรีหนึ่งต้นไม้ แต่ละไดเรกทอรีเดียวไม่มีไฟล์ / ไดเรกทอรีย่อยมากกว่า 2k
guettli

ตรวจสอบเวอร์ชั่น rsync ของคุณ: เสร็จแล้วตรวจสอบให้แน่ใจว่าไม่ได้ใช้งาน แบ่งงานออกเป็นชุดเล็ก ๆ : ขอบคุณฉันจะดู gigasync ค่าเริ่มต้นของระบบปฏิบัติการไม่ได้ถูกสร้างขึ้นสำหรับสถานการณ์นี้: ทำแล้ว (คอขวดไม่ใช่เครือข่าย OS) ดูที่ "namei cache": เสร็จสิ้น (เป็น net ไม่ใช่ OS) พิจารณาระบบไฟล์อื่น: net อีกครั้งไม่ใช่ OS อาจจะเป็น 5 นาทีที่ดีที่สุดที่คุณทำได้: ฉันคิดว่ามันอาจเร็วกว่านี้มาก พูดคุยกับ devs ของคุณ (ใช้ DB): นี่จะเป็นการเปลี่ยนแปลงครั้งใหญ่ บางทีระบบไฟล์ที่มีการสนับสนุนการสำรองข้อมูลที่ดีกว่าอาจแก้ไขได้
guettli

ไฟล์ 2k ต่อไดเรกทอรีดีกว่ามาก ขอบคุณสำหรับการอัพเดท คุณไม่ได้พูดว่าเครือข่ายนั้นช้า แบนด์วิดธ์ต่ำความหน่วงสูงหรือทั้งสองอย่างต่ำหรือไม่ rsync มักจะทำงานได้ดีบนลิงก์เวลาในการตอบสนองสูง (ซึ่งได้รับการพัฒนาโดยคนที่ทำงานด้าน PhD ของเขาจากออสเตรเลียในขณะที่ทำงานกับคอมพิวเตอร์ในสหรัฐอเมริกา) ลองทำเช่นนั้น "ls -lLR" เหนือ ssh และเวลาที่ใช้ในการส่งผลลัพธ์ "time ssh remotehost 'cd / dest && ls -lLR'> / tmp / list" ตรวจสอบให้แน่ใจว่ารายการ / tmp / ถูกสร้างขึ้นบนโลคัลโฮสต์
TomOnTime

ใช่เครือข่ายช้า มันเป็นเรื่องน่ากลัว
guettli

ช้าแค่ไหน? หากคุณใช้ "scp" เพื่อคัดลอกไฟล์ 100M ต้องใช้เวลานานเท่าไหร่? นอกจากนี้เอาต์พุตของ "time ssh remotehost 'cd / ปลายทาง && ls -lLR'> / tmp / list" คืออะไร
TomOnTime

2

ไม่นั่นเป็นไปไม่ได้ที่ rsync และมันจะค่อนข้างไม่มีประสิทธิภาพในเรื่องอื่น:

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


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

ใช่คุณถูกต้อง แต่rsyncไม่ทำเช่นนี้
สเวน

2

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


ใช่ตัวเลือกเวลากลางคืนเหมาะสม เราใช้มันมาหลายปีแล้ว ฉันเดาว่าจำเป็นต้องใช้ทางเลือก rsync
guettli

2

คุณยังสามารถลอง lsyncd ซึ่งจะ rsync เฉพาะเมื่อตรวจพบการเปลี่ยนแปลงในระบบไฟล์และเพียงแค่ไดเรกทอรีย่อยที่มีการเปลี่ยนแปลง ฉันใช้มันเพื่อไดเรกทอรีที่มีไฟล์มากถึงสองล้านไฟล์บนเซิร์ฟเวอร์ที่เหมาะสม


1

ใช้ rsync ในโหมด daemon ที่ปลายเซิร์ฟเวอร์เพื่อเพิ่มความเร็วในกระบวนการแสดงรายการ / เช็คซัม:

โปรดทราบว่ามันไม่ได้เข้ารหัส แต่อาจสามารถสร้างช่องสัญญาณได้โดยไม่สูญเสียการปรับปรุงประสิทธิภาพของรายชื่อ

การมี rsync ก็ทำการบีบอัดมากกว่า ssh ควรปรับปรุงประสิทธิภาพ

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