Профилирование показывает, что время зависит от:
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
Мобильная версия