ฉันมี 1000000 4-20 kb ไฟล์ใน dir ฉันต้องการคัดลอกผบ. แต่ดูเหมือนว่าฉันต้องทำการค้นหาไฟล์แต่ละไฟล์ดังนั้นจึงใช้เวลาค่อนข้างนาน
มีวิธีใดบ้างที่ฉันจะเร่งความเร็วนี้?
ฉันกำลังคิดว่าถ้าฉันสามารถรับบล็อกดิสก์ที่ไฟล์เหล่านี้ครอบครองฉันสามารถเรียงลำดับเหล่านั้นรวมบล็อกที่อยู่ใกล้ (เนื่องจากการอ่านตามลำดับมักจะเร็วกว่าการค้นหา) และอ่านบล็อกเหล่านี้เพื่อให้พวกเขาอยู่ใน RAM แคช (ฉันมี RAM 32 GB) ก่อนทำสำเนา
แต่สำหรับการทำงานฉันต้องการวิธีที่จะระบุว่าบล็อกใดที่เปิดอยู่
ฉันใช้ EXT4 บนอุปกรณ์แม่เหล็ก (เช่นไม่ใช่ SSD)
แก้ไข:
สิ่งนี้ควรใช้งานได้ แต่ไม่ได้:
ls |
parallel -IOO --pipe "sudo parallel -j100 hdparm --fibmap {}'|tail -n +5'" |
sort -nk 2 |
perl -ane 'if($u+10000 < $F[1]) { print "$l ",($u-$l),"\n"; $l=$F[1] } $u=$F[2]' |
sudo parallel --colsep ' ' dd if=/dev/sda1 skip={1} bs=512 count={2} '| cat >/dev/null'
เมื่อทำการทดสอบกับไฟล์ขนาดใหญ่มันจะไม่ทำการแคชไฟล์
Edit2:
นี่คือมาตรฐานบางอย่าง แคชถูกล้าง ( echo 3 >/proc/sys/vm/drop_caches
) ระหว่างการรันแต่ละครั้ง iostats -dkx 5
วัดทำด้วย
rsync -Hav foo/ bar/: 1800 KB/s
cp -a foo/ bar/: 3600 KB/s
cat sort-by-inode | parallel -j1 -X cp foo/{} bar/: 5000 KB/s
cat sort-by-inode | shuf | parallel -j1 -X cp foo/{} bar/: 3000 KB/s
cat sort-by-inode | shuf | parallel -j10 -X cp foo/{} bar/: 7000 KB/s
cat sort-by-inode | parallel -j10 -X cp foo/{} bar/: 8000 KB/s
cat sort-by-inode | parallel -j100 -X cp foo/{} bar/: 9000 KB/s
cat sort-by-inode | parallel -j500 -X cp foo/{} bar/: 10000 KB/s
แล้วเราจะเรียนรู้อะไรได้บ้าง?
ดูเหมือนว่าการเรียงลำดับโดย inode เป็นความคิดที่ดี แต่ดูเหมือนว่าการทำงานแบบหลายขนานจะcp
เพิ่มประสิทธิภาพให้ดียิ่งขึ้นไปอีก เป็นการเน้นว่าแหล่งข้อมูลfoo/
นั้นเป็นดิสก์แม่เหล็กดังนั้นการโจมตีตำนานที่ขนาน I / O กับแกนหมุนเดี่ยวจะไม่เพิ่มความเร็ว I / O: การขนานอย่างชัดเจนและเร่งความเร็วในการคัดลอกที่นี่อย่างสม่ำเสมอ
cp -r /mnt/dir1 /mnt/dirdest
หรืออะไรทำนองนั้นcp /mnt/dir1/* /mnt/dirdest
?