nixp.ru v3.0

19 октября 2017,
четверг,
12:09:05 MSK

DevOps с компанией «Флант»
brokoli написал 11 января 2009 года в 11:52 (397 просмотров) Ведет себя неопределенно; открыл 1 тему в форуме.

Приветствую.

Есть каталог /img , в нем более 12 тыс. картинок.

Нужно оптимизировать размещение рисунков, так чтобы поиск каждой картинки (на диске) занимал минимальное количество системных ресурсов компьютера, на котором располагается сайт. ОС — FreeBSD 6.2-STABLE , размер кластера на диске — 512 байт.

Специальное условние: сайт проиндексирован поисковыми системами и активно посещается — ни те, ни другие «обижать» и показывать им «404» нельзя, поэтому перемещение картинок нужно сделать «прозрачно», чтобы пользователи ничего не заметили.

какими методами можно оптимизировать размещение файлов на диске и доступ ?

pol

а точно проблема в размещении?

просто без просмотра всего содержимого директории,

т.е. при «выдергивании» отдельной картринки проблем со скоростью не будет

Dmitry.Stolyarov

Нет. Проблемы при обращении будут.

В файловой системе диретория — это файл. Каждой «строкой» директории является запись об одном из «лежащих в ней» файлов. Каждая запись состоит из имени файла и номера файла (номера индексного дескриптора). При обращении к файлу осуществляется разрешение имени файла в его номер… поэтому скорость «обращения к файлу» сильно зависит от того, в которой строке это имя в директории… если в начале — будет быстро, если в конце — медленно.

Стандартным решением для таких ситуаций является распределения файлов по под директориям. Обычно делают 2 дополнительных уровня. В качестве «ключа» — используют хэш (MD5/SHA1/256/512/2) имени файла. Название директорий на первом уровне — первые две буквы ключа, на втором — вторые две. На выходе получается уравновешенное дерево (хэш ключи распределяются равномерно по определению). Если считать, что директория работает нормально, если в ней от 500 до 1000 файлов — в такой структуре нормально можно хранить от 32 до 65 миллионов файлов.

P.S. Что касается процесса переезда и т.д. — решается на месте, не должно составлять проблемы (можно придумать систему с симлинками на момент переезда).

Что касается «отдачи этого по http» — наиболее эффективным способом (с точки зрения ресурсов) будет nginx сервер с написанным к нему perl модулем (который будет считать хэши к запрашиваемым именам) и отдавать файл из нужной директории.