Eu tenho um diretório com cerca de 2 milhões de links simbólicos que apontam para arquivos reais na mesma unidade, que é um disco rígido local real (não é uma montagem de rede). Os nomes dos arquivos são todos exclusivos e os arquivos para os quais eles apontam estão espalhados entre diretórios diferentes, mas todos compartilham o mesmo caminho pai. Estou consolidando arquivos em vários diretórios usando links simbólicos.
/some/full/path/consolidated/my_file -> /some/full/path/mydir2/my_file
/some/full/path/consolidated/my_file2 -> /some/full/path/mydir3/my_file2
/some/full/path/consolidated/my_file3 -> /some/full/path/mydir4/my_file3
/some/full/path/consolidated/my_file4 -> /some/full/path/mydir4/my_file4
/some/full/path/consolidated/my_file5 -> /some/full/path/mydir2/my_file5
/some/full/path/consolidated/my_file6 -> /some/full/path/mydir3/my_file6
Os links simbólicos têm garantia de não serem quebrados.
O problema é que
time find "/some/full/path/consolidated/" -maxdepth 1 -type l -print > /tmp/foo
termina rapidamente:
1.24 user 0.83 system 0:02.08elapsed
No entanto,
time find -L "/some/full/path/consolidated/" -maxdepth 1 -type f -print > /tmp/foo
seguido pela
watch wc -l /tmp/foo
mostra que chega a aproximadamente 660.000 linhas muito rapidamente e depois para, adicionando alguns milhares de resultados de vez em quando.
Por que isso pode parar? E é possível tornar o segundo comando tão rápido quanto o primeiro?
Editar:
/tmp
não aparece mount
(então presumo que não seja um tmpfs). De acordo com o htop, não estou com pouca memória; Tenho cerca de 50 GB livres. O uso da CPU também é baixo. O For find -L path
, que trava, /tmp/foo
tem cerca de 90 MB quando ocorre a lentidão. Para find path
, que não trava, /tmp/foo
tem 111 MB.
Tenho a mesma lentidão ao redirecionar a saída para ~/foo.
Editar: ao observar iotop
, find -L
lista uma E/S de 99,99%, mas somente após cerca de 10 segundos, o que é bem depois do find
término do normal.
Responder1
tente aumentar seu cache de inode com
echo 50 | sudo tee /proc/sys/vm/vfs_cache_pressure
o valor 100 é a média, valores mais baixos = maior inode+dentry cache
desvantagem: um cache maiorpode ser mais lento, então você também pode tentar diminuir seu cache com
echo 200 | sudo tee /proc/sys/vm/vfs_cache_pressure
ou você pode usar uma lista de arquivos em cache com
sudo updatedb
locate /some/full/path/consolidated
também fique de olho no uso de inodes, links simbólicos ocupam inodes (hardlinks também)
df -i
relacionado:https://serverfault.com/questions/338097/tuning-linux-cache-settings-for-inode-caching
mais sobre ajuste de disco:https://unix.stackexchange.com/questions/30286/can-i-configure-my-linux-system-for-more-aggressive-file-system-caching/41831