Я использую Kyoto Cabinet (хранилище ключей) для своего проекта. Конкретный тип БД, который я использую, - это DirDB, который создает много файлов в каталоге для хранения пар ключ-значение. Сервер, на котором я запускаю этот проект, имеет файловую систему ext4. Проблема, с которой я сталкиваюсь, заключается в том, что задержка ввода-вывода увеличивается с увеличением количества файлов в каталоге. Кроме того, когда в каталоге слишком много файлов (скажем, более 1 миллиона файлов), когда я пытаюсь удалить всю папку, это занимает вечность (уже более 5 часов и все еще работает). Может кто-нибудь объяснить, почему задержка ввода / вывода увеличивается с увеличением количества файлов и почему rm требует навсегда, чтобы удалить папку?

1 ответ1

0

Простейшим примером задержек является то, что, очевидно, время для вывода всего каталога будет зависеть от размера каталога.

Во-вторых, в зависимости от настроек файловой системы ext4 использует либо связанные списки, либо хешированное b-дерево для поиска в каталоге. Вам нужно только посмотреть, как работают эти две структуры данных, чтобы получить представление о различиях, которые может иметь неправильная конфигурация. Короткая версия заключается в том, что связанные списки довольно медленные и подходят только для небольших каталогов, тогда как хэши гораздо быстрее и гораздо лучше подходят для больших каталогов.

Обработка связанного списка означает прохождение каждого элемента в списке, потому что, в большинстве случаев, только элемент n-1 знает, где находится элемент n, поэтому вы должны сначала прочитать элемент n.

Обработка хеш-дерева включает вычисление числа в памяти и переход непосредственно к деталям на основе этого числа. Хотя для больших каталогов, возможно, придется делать это несколько раз, это намного быстрее, чем обрабатывать каждый узел.

В любом случае, если вы действительно хотите понять детали, вся документация доступна онлайн. Вы можете начать здесь, например: https://ext4.wiki.kernel.org/index.php/Ext4_Disk_Layout#Hash_Tree_Directories

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .