GNU/Linux >> Znalost Linux >  >> Linux

Zrychlete kopírování 1 000 000 malých souborů?

Mám 1000000 4-20 kb souborů v adresáři (Můžete generovat podobné soubory jako tento:seq 10000 | gzip > a; seq 1000000 | parallel --bar 'head -c{=$_=int(rand()*16)+4=}k a > {}' )

. Potřebuji zkopírovat ten adresář. Ale zdá se, že musím hledat každý soubor, takže to trvá docela dlouho.

Existuje způsob, jak to mohu urychlit?

Momentálně přemýšlím, že kdybych mohl získat bloky disku, které tyto soubory zabírají, mohl bych je seřadit, sloučit bloky, které byly blízko (vzhledem k tomu, že sekvenční čtení je často rychlejší než hledání) a přečíst tyto bloky tak, aby byly v paměti RAM. cache (mám 32 GB RAM) před provedením kopírování.

Ale aby to fungovalo, potřebuji způsob, jak identifikovat, na kterých blocích jsou soubory.

Používám EXT4 na magnetickém zařízení (tj. ne SSD).

Upravit:

To by mělo fungovat, ale nefunguje:

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'

Při testování na velkém souboru neukládá soubor do mezipaměti.

Edit2:

Zde jsou některé benchmarky. Mezipaměť byla vyprázdněna (echo 3 >/proc/sys/vm/drop_caches ) mezi každým spuštěním. Měření se provádí pomocí 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

Co se z toho tedy můžeme naučit?

Zdá se, že třídění podle inodu je dobrý nápad. Zdá se však, že paralelizuje více cp ještě více zvyšuje výkon. Je třeba zdůraznit, že zdroj foo/ je magnetický disk, takže to útočí na mýtus, že paralelizace I/O na jedno vřeteno nezrychlí I/O:Paralelizace zde jasně a konzistentně urychluje kopírování.

Přijatá odpověď:

Za předpokladu, že

  • položky vrácené readdir nejsou seřazeny podle čísla inodu
  • čtení souborů v pořadí inode snižuje počet operací hledání
  • obsah většiny souborů je v počáteční alokaci 8k (optimalizace ext4), což by také mělo přinést méně operací vyhledávání
Související:Znovu provést členy protokolu a kontrolní soubory v Oracle DB Standard Edition?

můžete zkusit urychlit kopírování kopírováním souborů v pořadí inode.

To znamená použít něco takového:

$ cd /mnt/src
$ ls -U -i | sort -k1,1 -n | cut -d' ' -f2- > ~/clist
$ xargs cp -t /mnt2/dst < ~/clist

Linux
  1. Kopírování souborů na základě data modifikace v Linuxu

  2. Kopírování souborů pomocí scp:vypršel časový limit připojení

  3. `gcloud compute copy-files`:oprávnění odepřeno při kopírování souborů

  1. Jak vyloučit soubory určité velikosti z kopírování v Linuxu

  2. Ssh – Kopírování chráněných souborů mezi servery v jednom řádku?

  3. Jak urychlit vyhledávání ve velké sbírce textových souborů (1 TB)

  1. Linux – Obnova dat po zkopírování souboru do blokovaného zařízení?

  2. Zrychlete rsync při migraci linuxového serveru z příkazového řádku

  3. .o soubory vs. .a soubory