Каков наилучший дистрибутив папок в Linux для личных папок пользователей? - PullRequest
2 голосов
/ 03 января 2009

На нашем сайте пользователи могут иметь много личных файлов. Мы думаем, что может быть лучшим дистрибутивом, чтобы избежать снижения производительности сервера. Эти файлы обслуживаются через Apache и должны отображаться в списке каждый раз, когда пользователь должен управлять ими.

Наш первый подход прямо сейчас:

var first_level = (int) $user_id/100;
var files_folder = /uf/$first_level/$user_id

Это дает нам первый уровень из 100 папок и много папок второго уровня. Поскольку не у всех пользователей есть файлы, и сейчас у нас около 80 тысяч пользователей, это означает около 800 папок на папку второго уровня .

Что вы думаете об этом подходе?

Ответы [ 3 ]

1 голос
/ 03 января 2009

Популярная схема именования масштабируемых папок, если вас не интересует удобочитаемость, использует squid: <4-bit>/<8-bit>/<remaining-116-bit-of-md5-of-whatever-lookup-key> или <whatever-unique-key-you-have>, поэтому для идентификатора пользователя 1 путь к папке может быть / c4 / ca42 / 1.

В этом случае первый уровень - до 16 каталогов, а второй уровень - до 256 каталогов.

Большим преимуществом этого подхода является то, что распределение папок является статистически равномерным, независимо от того, есть ли у вас дыры или кластеры в ваших идентификаторах пользователей / именах пользователей (меньшие идентификаторы пользователей, как правило, не используются из-за истощения.)

1 голос
/ 03 января 2009

Вы не говорите, какая файловая система используется для хранения файлов. Вам должно быть легко создать случайное дерево каталогов с характеристиками, которые вы ожидаете от своей реальной нагрузки. Затем вы можете проводить эксперименты , которые скажут вам эффективность различных стратегий, которые вы рассматриваете.

Я не мог легко найти информацию о том, какие файловые системы используют эффективные структуры данных, такие как B-деревья, для больших каталогов. Я нашел утверждение, что MacOS HFS делает. Я хотел бы изучить XFS или другую высокопроизводительную журналируемую файловую систему.

1 голос
/ 03 января 2009

Если ваши значения идентификатора пользователя распределены достаточно равномерно и число будет продолжать расти, то вам, вероятно, следует сбалансировать дерево немного больше. Что лучше всего зависит отчасти от того, где вы думаете, в конечном итоге с точки зрения чисел. Большие каталоги медленнее искать, чем маленькие. В то время как 800 файлов не ужасны, но и не велики. Если вы хотите придерживаться 2-х уровней, и у вас есть N пользователей (в качестве целевого населения), то вы должны стремиться к sqrt (N) папкам на первом уровне с sqrt (N) папок в каждом каталоге второго уровня. Для N = 80 000, что означает около 300 папок на уровень. Если вы хотите рассмотреть трехуровневое расположение, замените квадратный корень на кубический корень. Вы также можете обнаружить, что использование арифметики по модулю обеспечивает более плавное распределение. То есть первый уровень может быть лучше рассчитан как:

var first_level = (int) ($user_id % 300);

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

CPAN использует систему, основанную на 3 уровнях: первый уровень - это первая буква логина пользователя; второй уровень - это первые две буквы, а третий уровень - полный идентификатор входа в систему.

Я где-то читал, что какой-то сайт (университетский, IIRC) обнаружил, что первая и последняя буквы имени дают хорошую систему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...