В настоящее время у меня очень низкая производительность при использовании в сетевой папке NFS следующего:
time find . | while read f; do test -L "$f" && f=$(readlink -m $f); grp="$(stat -c %G $f)"; perm="$(stat -c %A $f)"; done
Вопрос 1) Внутри цикла разрешения проверяются с помощью переменных grp и perm. Есть ли способ уменьшить количество операций ввода-вывода диска для такого рода проверок по сети (например, прочитать все метаданные сразу с помощью find)?
Вопрос 2) Похоже, что NFS настроена не очень хорошо, та же операция на аналогичном сетевом канале через SSHFS занимает только треть времени. Все параметры согласовываются автоматически. Какие-либо предложения?
Самое быстрое решение, которое я нашел за последний час, было:
failed=$(find -L . -printf "%p %g %M\n" | awk '{ if ($2 != "XYZ"){ printf $1; exit 1 }; if ( substr( $3, 9, 1 ) != "-" ) { printf $1; exit 2 } }')
ret=$?
test ! $ret -eq 0 && echo "Error with file $failed"
который в качестве примера проверяет наличие владельца группы и разрешения. Эта версия, использующая только поиск, но не статистику, и переход по символическим ссылкам как минимум в 100 раз быстрее.
Ваша линия выполняет три вызова для каждого файла; один stat
+ синтаксического анализа вывода было бы достаточно. Для начала измените свой скрипт так, чтобы он звонил stat
только один раз с stat -c "%n %G %A"
... если вам нужна помощь, напишите нам.