ฉันสามารถคัดลอกไฟล์ขนาดใหญ่ได้เร็วขึ้นโดยไม่ใช้แคชไฟล์หรือไม่?


19

หลังจากเพิ่มpreloadแพคเกจแอปพลิเคชันของฉันดูเหมือนจะเร็วขึ้น แต่ถ้าฉันคัดลอกไฟล์ขนาดใหญ่แคชไฟล์จะเพิ่มขนาดไฟล์เป็นสองเท่า

ด้วยการถ่ายโอนไฟล์อิมเมจเสมือนหรือไฟล์วิดีโอขนาด 3-4 GB ไปยังไดรฟ์ภายนอกแคชขนาดใหญ่นี้ดูเหมือนว่าจะลบแอปพลิเคชันที่โหลดไว้ล่วงหน้าทั้งหมดออกจากหน่วยความจำซึ่งนำไปสู่เวลาในการโหลดที่เพิ่มขึ้นและประสิทธิภาพทั่วไปลดลง

มีวิธีการคัดลอกไฟล์ขนาดใหญ่หลายกิกะไบต์โดยไม่แคชพวกเขา (เช่นข้ามแคชไฟล์)? หรือวิธีกำหนดรายการที่ปลอดภัยหรือโฟลเดอร์ที่ไม่อนุญาตในรายการบัญชีดำหรือไม่

คำตอบ:


19

มีเป็นnocacheยูทิลิตี้ซึ่งสามารถใช้ได้กับคำสั่งเหมือนและionice niceมันทำงานได้โดยการโหลดห้องสมุดที่เพิ่มเข้ามาposix_fadviseพร้อมกับการPOSIX_FADV_DONTNEEDโทรที่เปิดอยู่

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

มันมหัศจรรย์สำหรับงานถ่ายสำเนาขนาดใหญ่เช่นหากคุณต้องการสำรองข้อมูลดิสก์หลายเทราไบต์ในพื้นหลังโดยมีผลกระทบน้อยที่สุดต่อระบบที่คุณใช้งานคุณสามารถทำสิ่งต่าง ๆnice -n19 ionice -c3 nocache cp -a /vol /vol2ได้

แพ็คเกจจะพร้อมใช้งานใน Ubuntu 13.10 ขึ้นไป หากคุณอยู่ในรุ่นก่อนหน้าคุณสามารถติดตั้งแพ็กเกจ 13.10หรือเลือกรับแบ็กพอร์ท 12.04 นี้โดยFrançois Marier


ฉันหวังว่าจะมีบางสิ่งที่สามารถทำได้ผ่าน GUI เช่นเดียวกับวิธีการเพียงแค่ขึ้นบัญชีดำโฟลเดอร์ 'no cache' แต่สิ่งนี้จะต้องทำในตอนนี้
Veazer

12

สำหรับไฟล์ขนาดใหญ่ไฟล์เดียวใช้ddกับdirect I / O เพื่อข้ามแคชไฟล์:

หากคุณต้องการถ่ายโอนไฟล์หลายกิกะไบต์ขนาดใหญ่ (หรือสองสาม) มันเป็นเรื่องง่ายที่จะทำdd:

dd if=/path/to/source of=/path/to/destination bs=4M iflag=direct oflag=direct
  • directธงบอกddจะใช้เคอร์เนลของ I / O ตัวเลือกโดยตรง ( O_DIRECT) ในขณะที่การอ่านและการเขียนจึงสมบูรณ์อ้อมแคชไฟล์
  • bsตัวเลือกบล็อคจะต้องตั้งค่าให้เป็นค่าที่มีขนาดใหญ่พอสมควรตั้งแต่เพื่อลดจำนวนของการดำเนินงานดิสก์ทางกายภาพddต้องดำเนินการตั้งแต่อ่าน / เขียนจะถูกเก็บไว้ไม่ได้และการดำเนินงานโดยตรงขนาดเล็กจำนวนมากเกินไปจะส่งผลให้เกิดการชะลอตัวที่รุนแรง
    • ทดลองใช้ค่าได้ตั้งแต่ 1 ถึง 32 MB การตั้งค่าด้านบนคือ 4 MB ( 4M)

สำหรับการคัดลอกไดเรกทอรีซ้ำหลายครั้งแต่น่าเสียดายที่ไม่มีเครื่องมือที่ใช้งานได้ง่าย ตามปกติcpและอื่น ๆไม่รองรับ I / O โดยตรง

/ e iflags & oflags เปลี่ยนเป็น iflag & oflag ที่ถูกต้อง


1
ซ้ำสามารถทำได้ด้วยzshของ**ผู้ประกอบการ zshจะต้องติดตั้งด้วยตนเองจาก repos
Reinstate Monica - ζ--

1
จริงๆแล้วไม่มี ddซินแท็คซ์ของไวยากรณ์ทำให้ฟาร์เดอเรเตอร์ที่ผิดพลาดขึ้น คุณยังคงสามารถใช้สคริปต์เชลล์ที่มีข้อโต้แย้งตามปกติ ( dd.sh in.file out.fileมี ** ในชื่อไฟล์) และให้ชื่อไฟล์ที่จะddใช้$1, $2ฯลฯ ซึ่งไม่ควรทำฟาวล์ต่อไวยากรณ์แปลก DD ของ
Reinstate Monica - ζ--

1
Direct direct ช้ามากเพราะ AFAIK ยังปิดการใช้งานแคช readahead ซึ่งอาจไม่ใช่สิ่งที่คุณต้องการและไม่เหมือนจริงในสถานการณ์การเปรียบเทียบ ใช้ "iflag = nocache oflag = nocache" แทนซึ่งบอกกับระบบปฏิบัติการอย่างแน่นอนว่าคุณไม่จำเป็นต้องใช้ in-file หรือไฟล์แคช
stolsvik

1

คุณสามารถคัดลอกไดเรกทอรีซ้ำด้วยการddใช้findและmkdir

เราจำเป็นต้องแก้ไขปัญหาสองประการ:

  1. dd ไม่ทราบว่าจะทำอย่างไรกับไดเรกทอรี
  2. dd สามารถคัดลอกไฟล์ได้ครั้งละหนึ่งไฟล์เท่านั้น

อันดับแรกให้กำหนดไดเรกทอรีอินพุตและเอาต์พุต:

SOURCE="/media/source-dir"
TARGET="/media/target-dir"

ทีนี้cdมาที่ไดเรกทอรีต้นทางเพื่อfindจะรายงานไดเรกทอรีสัมพัทธ์ที่เราสามารถจัดการ:

cd "$SOURCE"

ทำซ้ำแผนผังไดเรกทอรีจาก$SOURCEถึง$TARGET

find . -type d -exec mkdir -p "$TARGET{}" \;

ทำซ้ำไฟล์จาก$SOURCEเพื่อ$TARGETไม่ให้เขียนแคช (แต่ใช้ read cache!)

find . -type f -exec dd if={} of="$TARGET{}" bs=8M oflag=direct \;

โปรดทราบว่าสิ่งนี้จะไม่รักษาเวลาการแก้ไขไฟล์ความเป็นเจ้าของและคุณสมบัติอื่น ๆ

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