Как улучшить производительность 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

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