Por que seguir muitos links simbólicos fica lento e rápido?

Por que seguir muitos links simbólicos fica lento e rápido?

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: /tmpnã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/footem cerca de 90 MB quando ocorre a lentidão. Para find path, que não trava, /tmp/footem 111 MB.

Tenho a mesma lentidão ao redirecionar a saída para ~/foo.

Editar: ao observar iotop, find -Llista uma E/S de 99,99%, mas somente após cerca de 10 segundos, o que é bem depois do findté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

informação relacionada