Как улучшить производительность shutil.rmtree в файловой системе PolarDB по сравнению с FUSE?Python

Программы на Python
Ответить
Anonymous
 Как улучшить производительность shutil.rmtree в файловой системе PolarDB по сравнению с FUSE?

Сообщение Anonymous »

Я использую Shutil.rmtree Python для удаления каталога, содержащего около 5000 файлов и 2000 подкаталогов. На родном ext4 это занимает около 0,2 секунды. Но при работе с файловой системой PolarDB, смонтированной через FUSE, та же операция занимает более 3 секунд, хотя базовым хранилищем является локальный SSD.
Профилирование показывает, что время зависит от:
cProfile snippet
5000 1.918 0.000 1.918 0.000 {built-in method posix.unlink}
2003 0.540 0.000 0.540 0.000 {built-in method posix.rmdir}

Это говорит о том, что проблема не в пропускной способности ввода-вывода, а в операциях с метаданными с высокой задержкой из-за того, что файловая система PolarDB реализована как файловая система на основе FUSE.
Основные наблюдения:
  • Файловая система PolarDB использует FUSE для управления метаданными в пользовательском пространстве.
  • Every unlink() и rmdir() запускает обратный путь через /dev/fuse к демону PolarDB-Filesystem.
  • Даже при поддержке локального диска каждый системный вызов имеет значительные накладные расходы (в среднем ~600 мкс).
  • rm -rf также работает медленно — подтверждает, что это не проблема Python.
Вопросы:
  • Существуют ли известные параметры монтирования (например, async_unlink, writeback_cache), которые помогают снизить стоимость удаления каждого файла в системах на основе FUSE, таких как PolarDB-Filesystem?
  • Могу ли я обнаружить это во время выполнения находится ли путь в монтировании PolarDB-Filesystem/FUSE и переключится на оптимизированную стратегию удаления?
  • Будет ли вызов внешних инструментов, таких как find . -delete или гипотетический pfs-cli rm --batch будет более эффективным, чем чистые циклы Python?
Пример резервной логики:
def rmtree_optimized(path):
if is_on_pfs_fuse(path):
subprocess.run(['find', path, '-delete'], check=True)
else:
shutil.rmtree(path)

Цель: найти программный способ в Python адаптировать поведение рекурсивного удаления при работе в файловых системах с поддержкой FUSE, таких как файловая система PolarDB, где задержка метаданных для каждого системного вызова высока.
Будем очень признательны за любой опыт оптимизации приложений для облачных файловых систем FUSE.


Подробнее здесь: https://stackoverflow.com/questions/798 ... -over-fuse
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»