วิธีที่ดีที่สุดในการทำสำเนาแบบขนานบน Unix คืออะไร


18

ฉันต้องคัดลอกเนื้อหาของโฟลเดอร์บนระบบไฟล์เครือข่ายไปยังคอมพิวเตอร์ของฉันเป็นประจำ มีไฟล์จำนวนมาก (1000s) ในโฟลเดอร์ระยะไกลที่ค่อนข้างเล็ก แต่เนื่องจากค่าใช้จ่ายเครือข่ายสำเนาปกติcp remote_folder/* ~/local_folder/ใช้เวลานานมาก (10 นาที)

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

วิธีที่ง่ายที่สุดในการเพิ่มความเร็วของสำเนานี้คืออะไร? (ฉันคิดว่ามันคือการทำสำเนาในแบบคู่ขนาน)

การซิปไฟล์ก่อนที่จะทำการคัดลอกนั้นไม่จำเป็นว่าจะเป็นการเพิ่มความเร็วเพราะมันอาจถูกบันทึกไว้ในดิสก์ที่แตกต่างกันบนเซิร์ฟเวอร์ที่แตกต่างกัน


การซิปไฟล์ก่อนที่จะทำการคัดลอกจะเพิ่มความเร็วขึ้นอย่างมากเพราะไม่จำเป็นต้องมีอีกต่อไป "คุณได้รับไฟล์นั้น", "ใช่, ฉันทำได้", "นี่คืออันถัดไป", "โอเค", ... "การหยุดซ่อมบำรุง" ที่ทำให้คุณช้าลง
David Schwartz

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

ในขณะที่การซิปอาจไม่ใช่ความคิดที่ดี (การบีบอัดไฟล์มากกว่า 1000 ไฟล์อาจใช้เวลาสักครู่) tar อาจใช้งานได้
Rob

@JoelCoehoorn ยังมีบางกรณีที่ไม่ใช่กรณีนี้: เช่นหลายแกน + ไฟล์ขนาดเล็ก (หรืออ่านแบบสุ่ม) ในสถานการณ์นี้ "parallel cp" จะช่วยได้
CAFxX

คำตอบ:


8

ตราบใดที่คุณ จำกัด คำสั่งการคัดลอกที่คุณใช้อยู่คุณอาจใช้สคริปต์เช่นเดียวกับที่Scrutinizerโพสต์ไว้

SOURCEDIR="$1"
TARGETDIR="$2"
MAX_PARALLEL=4
nroffiles=$(ls "$SOURCEDIR" | wc -w)
setsize=$(( nroffiles/MAX_PARALLEL + 1 ))
ls -1 "$SOURCEDIR"/* | xargs -n "$setsize" | while read workset; do
  cp -p "$workset" "$TARGETDIR" &
done
wait

1
หมายเหตุของการเตือนว่า: สคริปต์นี้แบ่งกับชื่อไฟล์ที่มีช่องว่างหรือตัวอักษรกลม
slhck

@OldWolf - คุณช่วยอธิบายวิธีการทำงานของสคริปต์นี้ได้อย่างไร ยกตัวอย่างเช่นส่วนใดที่ทำให้ขนาน
dsg

3
@dsg: คำสั่งที่&ท้ายcpคำสั่งอนุญาตให้whileวนซ้ำเพื่อดำเนินการต่อและเริ่มคำสั่ง cp ถัดไปโดยไม่ต้องรอ xargsคำสั่งผ่านชื่อไฟล์ที่อยู่ในกลุ่มที่ 4 (MAX_PARALLEL) กับwhileวง
RedGrittyBrick

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

9

หากคุณติดตั้งGNU Parallel http://www.gnu.org/software/parallel/คุณสามารถทำสิ่งนี้ได้:

parallel -j10 cp {} destdir/ ::: *

คุณสามารถติดตั้ง GNU Parallel ได้ง่ายๆโดย:

$ (wget -O - pi.dk/3 || lynx -source pi.dk/3 || curl pi.dk/3/ || \
   fetch -o - http://pi.dk/3 ) > install.sh
$ sha1sum install.sh | grep 3374ec53bacb199b245af2dda86df6c9
12345678 3374ec53 bacb199b 245af2dd a86df6c9
$ md5sum install.sh | grep 029a9ac06e8b5bc6052eac57b2c3c9ca
029a9ac0 6e8b5bc6 052eac57 b2c3c9ca
$ sha512sum install.sh | grep f517006d9897747bed8a4694b1acba1b
40f53af6 9e20dae5 713ba06c f517006d 9897747b ed8a4694 b1acba1b 1464beb4
60055629 3f2356f3 3e9c4e3c 76e3f3af a9db4b32 bd33322b 975696fc e6b23cfb
$ bash install.sh

ดูวิดีโอแนะนำสำหรับ GNU Parallel เพื่อเรียนรู้เพิ่มเติม: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1


3

วิธีหนึ่งคือใช้rsyncซึ่งจะคัดลอกการเปลี่ยนแปลงเท่านั้น - ไฟล์ใหม่และส่วนที่เปลี่ยนแปลงของไฟล์อื่น

http://linux.die.net/man/1/rsync

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


2

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

มันเป็นอีกระบบหนึ่งในการติดตั้ง แต่อาจเป็นหนึ่งในนั้นที่คุณอาจเรียกใช้แล้วพิจารณาการยอมรับบริการคลาวด์ทั้งหมดในปัจจุบัน


2

rsync ขนานโดยใช้การค้นหา:

export SOURCE_DIR=/a/path/to/nowhere
export DEST_DIR=/another/path/to/nowhere

# sync folder structure first
rsync -a -f'+ */' -f'- *' $SOURCE_DIR $DEST_DIR

# cwd
cd $SOURCE_DIR

# use find to help filter files etc. into list and pipe into gnu parallel to run 4 rsync jobs simultaneously
find . -type f | SHELL=/bin/sh parallel --linebuffer --jobs=4 'rsync -av {} $DEST_DIR/{//}/'

บน LAN ขององค์กร rsync เดียวทำประมาณ 800Mbps; ด้วยงาน 6-8 งานฉันสามารถได้รับมากกว่า 2.5Gbps (ที่ค่าใช้จ่ายในการโหลดสูง) ถูก จำกัด โดยดิสก์


0

มีหลายสิ่งที่คุณอาจต้องพิจารณาขึ้นอยู่กับโทโพโลยีที่คุณมี แต่ก่อนที่คุณจะเริ่มคิดเกี่ยวกับการแก้ปัญหาที่ซับซ้อนคุณสามารถลองแบ่งงานเป็นสองงานและตรวจสอบว่าเวลาที่ต้องการจะลดลงอย่างมากหรือไม่:

ลองครั้งต่อไป:

  cp remote_folder/[a-l]* ~/local_folder/ &
  cp remote_folder/[!a-l]* ~/local_folder/ &
  wait
  wait

(คุณอาจต้องการแทนที่ [al] * เป็นอย่างอื่นที่ตรงกับประมาณครึ่งหนึ่งของไฟล์ - อาจ [0-4] * - ขึ้นอยู่กับเนื้อหาของโฟลเดอร์)

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

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