Dmitry Prostoy
Улучшение методов кеширования
January 25, 2010 05:34AM
Уважаемые,

Оптимизируя сайт, решил заняться задачей оптимизации кеширования вызовов
удаленного веб-сервиса. Смысл в следующем: при обращении к странице, php
вызывает удаленный веб-сервис. Результат кеширует локально. При следующем
обращении, если данные есть в кеше - удаленный вызов не осуществляется,
используются закешированные данные.

Первая реализация выглядела следующим образом:

- Локальная папка ".cache", в которую файлы складывались с именем md5(
$remote_url ).
- Таблица в базе данных, в которой фиксировались все закешированные
файлы, количество обращений к ним, дата создания, дата последнего обращения
и т.д.

Буквально за несколько дней папка разрастается на ~50k файлов. Через
несколько месяцев доростает до 250k. Как показала статистика, файлы хорошо
ранжируются по частоте обращений. От тех, которые нужны буквально каждому
пользователю до тех, которые запрашивались по несколько раз за весь период.
Реально часто используемых файлов около 20-30k.

Понимая, что хранить такое количество файлов в одной папке не очень хорошо,
а также, что в БД реальной необходимости нет - решил модифицировать
алгоритм, предварительно полностью очистив базу. Текущая реализация
следующая:

- В локальной папке ".cache" лежат папки "0", "1"...."z".
- В каждой из этих папок в свою очередь также лежат папки "0",
"1"...."z".
- Далее, файлы складываю по следующему принципу:
- $hash = md5( $remote_url)
- $dir1 = substr( $hash, 7, 1 );
- $dir2 = substr( $hash, 13, 1 );
- $local_path = ".cache/" . $dir1 . "/" . $dir2 . "/" . $hash;
- от БД отказался - фактом наличия данных в кеше является успешное
выполнение file_get_contents( $local_path );

Наблюдаю следующий эффект:

- количество запросов к БД заметно уменьшилось, что логично
- кеш в памяти уменьшился
- Inode table usage резко упал, но буквально через пару часов опять
взлетел до 300к (кеш в памяти вместе с ним)
- к слову, Inode table usage скакал и ранее, то падая то взлетая до 500к

Иллюстрация - тут: img39 imageshack us/img39/2070/98814698 jpg

Возникли следующие вопросы:

- Колбасня inode table usage - это нормально или нет?
- Пиковые значения inode table usage в районе 500к - это нормально или
нет?
- Есть ли взаимосвязь между тем, что делал и показателем inode table
usage (я сильно сомневаюсь, что количество файлов в кеше у меня изменяется
не плавно)
- Насколько хорош текущий алгоритм кеширования файлов, что можно
улучшить?
- Как его сделать поумнее, так чтобы редко используемые файлы не грузили
ОС? Из того, что приходит в голову - поставить в крон задачу, которая будет
очищать папку от файлов, созданных более суток назад, и к которым последнее
обращение было более суток назад.

P.S.: И еще вопрос: можно ли мне в группу писать без модерации и ограничений
на размер сообщения, вкладывая ссылки не через пробелы :)

-
wbr, Dmitry
Sorry, only registered users may post in this forum.

Click here to login

Online Users

Guests: 249
Record Number of Users: 8 on April 13, 2023
Record Number of Guests: 421 on December 02, 2018
Powered by nginx      Powered by FreeBSD      PHP Powered      Powered by MariaDB      ipv6 ready