ทำให้ Linux เขียนไปยังระบบไฟล์เครือข่ายพร้อมกันกับการอ่านดิสก์ในเครื่อง


17

สรุป

คุณจะกำหนดค่า Linux ให้อ่านจากดิสก์ / ระบบโลคัลและเขียนไปยังเครือข่ายร่วมกันในเวลาเดียวกันได้อย่างไรเมื่อเทียบกับการอ่านในขณะที่ไม่มีข้อมูลผ่านเครือข่ายจากนั้นส่งข้อมูลผ่านเครือข่ายในขณะที่โลคัลดิสก์ ว่าง?

มันเร็วกว่ามากในการอ่านและเขียนในเวลาเดียวกันแทนที่จะทำการแสดงเพียงครั้งเดียวจากนั้นทำการอีกครั้งในลักษณะสลับกัน

รายละเอียด

ฉันกำลังย้ายข้อมูลจำนวนมากจากดิสก์ภายในเครื่องบน Linux ไปยังอุปกรณ์ NAS

ฉันใช้rsyncพื้นคัดลอก/srv/dataลงใน/mnt/nasซึ่งเป็น CIFS ติด

มันเริ่มต้นได้ดีอ่านได้ที่ 100MB / วินาทีและเขียนถึง NAS ที่ 100MB / วินาที (จำกัด เครือข่ายกิกะบิต) ด้วยการอ่านและเขียนที่เกิดขึ้นพร้อมกัน

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

จำเป็นต้องพูดการอ่าน 200MB จากนั้นการเขียน 200MB จะใช้เวลานานกว่าการอ่านและการเขียน 200MB ในเวลาเดียวกัน

ฉันจะกำหนดค่าเคอร์เนลเพื่อให้พฤติกรรมการอ่านและการเขียนก่อนหน้านี้ในเวลาเดียวกันได้มากกว่าที่จะสลับระหว่างการอ่านแล้วการเขียนการดำเนินการเพียงครั้งเดียว?

ข้อสังเกตบางอย่าง: เมื่อดิสก์ภายในเครื่องอ่านที่ 100 + MB / วินาทีทุกอย่างดูเหมือนว่าจะเกิดขึ้นในแนวขนานได้ แต่เมื่อดิสก์ช้าลง (ดูเหมือนจะไปที่ 20MB / วินาทีในขณะนี้ด้วยเหตุผลบางอย่าง) นั่นคือเมื่อการอ่าน / เขียนนี้ การสลับดูเหมือนจะเกิดขึ้น

ฉันยังสามารถทำงานได้syncด้วยตนเองทุกไม่กี่วินาทีที่จะได้รับการเขียนสิ่งที่เกิดขึ้นควบคู่ไปกับการอ่าน ( แต่เห็นได้ชัดว่าที่ความเร็วที่ลดลง) แต่การวางsyncในwhileวงเพื่อที่จะทำงานทุกห้าวินาทีไม่ได้ดูเหมือนทางออกที่ถูกต้อง ...

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


1
เครื่องมือ unix ส่วนใหญ่ไม่ได้รับการปรับให้เหมาะสมสำหรับแบนด์วิดท์ในแง่นี้ไม่ใช่ rsync ไม่ใช่แม้แต่ซีพีธรรมดา พวกเขาเป็นแอพพลิเคชั่นเธรดเดียวโดยใช้การบล็อก IO
peterh - Reinstate Monica

1
ที่ใดที่หนึ่งประมาณ 100 MB / s ก็เป็นสิ่งที่คุณคาดหวังที่จะเห็นในปัจจุบัน HDD 7200 รอบต่อนาทีหมุนที่ทันสมัยในปริมาณงานตามลำดับอย่างหมดจด มันจะลดลงเมื่อคุณเริ่มค้นหาเช่นสำหรับการปรับปรุงข้อมูลเมตาหรือถ้าระบบไฟล์มีการแยกส่วนเพราะคุณจะกลายเป็นผูกพัน IOPS
CVn

คุณสามารถติดตั้ง rsync บน NAS ได้ไหม?
Jasen

คำตอบ:


27

หลังจากการตรวจสอบเพิ่มเติมดูเหมือนว่าปัญหานี้จะเกี่ยวข้องกับเคอร์เนลน้อยลงและเพิ่มเติมเกี่ยวกับวิธีการrsyncและ CIFS โต้ตอบ

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

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

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

วิธีแก้ปัญหาคือการเมาท์การแบ่งปัน CIFS ด้วยตัวเลือกcache=noneที่ปิดใช้งานคุณลักษณะนี้และทำให้ I / O ทั้งหมดไปยังเซิร์ฟเวอร์โดยตรง สิ่งนี้จะช่วยขจัดปัญหาและอนุญาตให้อ่านและเขียนเพื่อดำเนินการแบบคู่ขนานอย่างไรก็ตามข้อเสียเปรียบของโซลูชันนี้คือประสิทธิภาพค่อนข้างต่ำ ในกรณีของฉันความเร็วในการถ่ายโอนข้อมูลของเครือข่ายลดลงจาก 110MB / วินาทีเป็น 80MB / วินาที

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

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

แก้ไข:ฉันยืนยันว่าcache=noneจะช่วยได้อย่างแน่นอนเมื่อถ่ายโอนไฟล์ขนาดเล็กจำนวนมาก (นำมาจาก 10MB / วินาทีสูงสุด 80MB / วินาที) แต่เมื่อถ่ายโอนไฟล์ขนาดใหญ่ (1GB +) cache=noneจะลดการถ่ายโอนจาก 110MB / วินาทีลงไปที่ 80MB / วินาทีเดียวกัน สิ่งนี้ชี้ให้เห็นว่าการถ่ายโอนข้อมูลช้าจากไฟล์ขนาดเล็กจำนวนมากนั้นน้อยกว่าการค้นหาดิสก์ต้นทางและอีกมากเกี่ยวกับการมีแคชจำนวนมากจากไฟล์ขนาดเล็กทั้งหมด


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

1
ฉันคิดว่าโซลูชันอื่นคือคุณไม่สามารถเรียกใช้rsyncบน NAS จะใช้rsyncผ่านเครือข่าย (เช่นrsync -a files localhost:/dest/path) ในขณะที่วิธีการที่แนะนำบัฟเฟอร์ขนาดใหญ่ (เช่น multple megabytes อย่างน้อย) อย่างน้อยในการเชื่อมต่อเครือข่าย ไม่แน่ใจว่าแฮ็คที่ดีที่สุดในการทำเช่นนั้นจะเป็นอย่างไร
Celada

@ Celada: ขอบคุณ! ใช่ฉันคิดว่าทำงานrsyncบนกล่อง NAS เองก็จะแก้ไขปัญหาได้เช่นกัน แม้ว่าจะซับซ้อนกว่านี้เล็กน้อย (การอนุญาต NAS ที่แปลกประหลาด, ต้องลบ symlink ฯลฯ ) แต่ถ้าฉันมีข้อมูลอีกเล็กน้อยที่จะคัดลอกมันจะคุ้มค่ากับการลงทุนเวลาที่จะทำอย่างนั้นฉันคิดว่า
Malvineous

2
อาจไม่เกี่ยวข้องกับกรณีของคุณ: ฉันมีปัญหาที่คล้ายกันไม่กี่ปีที่ผ่านมาเขียนผลผลิตของdump(8)NAS ที่ติดตั้งผ่าน NFS ในขณะที่ฉันวินิจฉัยปัญหาว่ามีการใช้ CPU ใน NAS สูงสุดเนื่องจากผลรวมของเซิร์ฟเวอร์ NFS และไฟร์วอลล์ที่ทำงานบน NAS (กล่องไม่ได้ถูกรูทและไฟร์วอลล์ไม่สามารถปิดการใช้งานได้อย่างสมบูรณ์จาก เว็บอินเตอร์เฟส) ปัญหาหายไปเมื่อเราแทนที่ NAS ด้วยพีซีเครื่องเก่า FWIW
Satō Katsura

@SatoKatsura: เป็นไปได้แน่นอนสำหรับอุปกรณ์ NAS รุ่นเก่าถึงแม้ว่าในกรณีนี้ฉันคิดว่าคุณจะเห็นการถ่ายโอนโดยรวมที่ช้ากว่าแทนที่จะเป็นแบบนี้ NAS ของฉันเป็น dual-core Atom (~ 2GHz) ซึ่งอยู่ที่ประมาณ 30% ของ CPU ที่ใช้งานเมื่อ maxing ออกหนึ่งกิกะบิต NIC โดยไม่ต้องใช้จัมโบ้เฟรมดังนั้นจึงควรมี
Malvineous
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.