Наконец, у меня накопился достаточный инструментарий для того, чтобы без особых затрат провести тестирование различных механизмов кеширования данных в PHP. Основные кандидаты, с которых начиналось тестирование:
- Memcached
- MySQL в виде кеш-таблицы
- Redis
- Файловый кеш фреймворка Zend
(список будет пополняться по мере дописания материала)
Зачем, вообще, понадобился этот тест. Традиционно считается, что из подручных инструментов лучшим является Memcache. Многие широко его используют, вроде бы, заметно разгружая им свои системы. Однако, не менее традиционны уже и тесты, показывающие чрезмерную медлительность memcache, нередко обычный файловый кеш работает много быстрее! Поскольку хранение данных в файловой системе крайне накладно для дисковой подсистемы и скорость работы может сильно падать при параллельной работе нескольких процессов, тестирование явно должно подразумевать многопоточность. Вот на этом моменте я в своё время и заткнулся, так как с многопоточностью в PHP разбираться было лениво.
Но шаг за шагом, реализуя иные вещи, мне пришлось последнее время заняться и вопросом многопоточности. Что сразу же подвело и к реализации теста.
Итак, в чём суть теста.
- Пишутся классы кеш-бэкендов под фреймворк BORS. До последнего времени практически использовался только один такой класс, cache_smart, использующий совмещённое хранение данных в памяти процесса, memcache и mysql. Были для тестов когда-то реализованы bors_cache_zend_file для проверки эффективности разрекламированного файлового кеша Zend и bors_cache_redis для работы с популярным key-value хранилищем Redis. В дальнейшем работа была приостановлена, пока я к ней не вернулся на днях.
- Каждый кеш заполняется некоторым набором хаотичных, но детерминированных данных, часть из которых имеет малое, часть — более долгое время хранения. Результат считывается сразу после заполнения, чтобы проверить на сохраняемость данных, затем происходит ожидание, в течении времени, гарантирующего устаревание части данных и актуальность другой части данных и ещё одна проверка на оба случая. Таким образом тест производительности автоматически становится и тестом на работоспособность.
- Измеряется время работы и работоспособность теста как в одиночном, так и в многопоточном режимах.
Продолжение следует