В современном мире информационных технологий эффективность работы приложений и систем во многом зависит от грамотного использования кеширования. Кеш снижает нагрузку на базу данных и ускоряет доступ к часто запрашиваемым данным, позволяя добиться лучшей масштабируемости и производительности. На рынке доступно множество кеширующих решений, таких как Memcache, Redis, Valkey, Dragonfly, Garnet и Pogocache. Чтобы понять, какое из них наиболее подходит для той или иной задачи, необходимо провести объективное тестирование их производительности, учитывая важнейшие параметры: пропускную способность, задержки и затраты процессорного времени. В данной публикации рассмотрены результаты комплексных бенчмарков на реальном железе с использованием специализированного инструмента memtier_benchmark, что позволяет сделать выводы о преимуществах и недостатках каждого кеша в различных условиях.
Тесты были проведены на высокопроизводительном сервере AWS c8g.8xlarge с архитектурой ARM64 и 32 ядрами без NUMA, что обеспечивает равномерное распределение нагрузки и высокую точность замеров. Особенностью проведённых экспериментов стала локальная связь по UNIX named pipes, что практически исключает влияние сетевых задержек и позволяет сосредоточиться исключительно на возможности серверов кеширования обрабатывать запросы. Важным моментом является то, что у всех кешей была отключена персистентность, то есть операции с диском отсутствовали, и все измерения отражают исключительно работу кеширующего слоя. Для каждого типа кеша запускался отдельный экземпляр, выделенный первому полуторному пулу ядер (cores 0-15), что гарантирует отсутствие конфликтов с клиентской стороной, работающей на ядрах с 16 по 31.
Инструмент memtier_benchmark создавал 256 клиентов, равномерно распределённых по 16 потокам, которые выполняли большие объемы операций — 100 тысяч SET и 100 тысяч GET за один прогон. Количество прогонов доходило до 31, а медианные значения использовались для построения графиков. Такой подход гарантирует статистическую надёжность результатов. Одной из особенностей тестирования была поддержка пайплайнинга запросов с разным уровнем — 1, 10, 25 и 50 команд одновременно. Это критически важный параметр, позволяющий оценить, как кеш справляется с нагрузкой и какой уровень многозадачности способен обеспечить.
Высокоточные метрики задержек включали в себя не только 50-й, 90-й и 99-й процентили, но и экстремальные 99.9 и 99.99 процентили, а также максимум — самый медленный запрос за весь период испытания. Чтобы комплексно оценить эффективность, также использовались данные о потребляемых процессорных циклах, измеренных с помощью утилиты perf Linux. Особое внимание в тестах уделялось конфигурации многопоточности кешей, каждая программа запускалась с максимально возможной оптимизацией под свои возможности.
Memcache и Pogocache использовали параметр -t для задания количества потоков ввода-вывода. Redis поддерживал io-threads, Valkey и Dragonfly — похожие опции, специфические для их архитектуры, а Garnet имел более детальную настройку мини и макси потоков ввода-вывода. Такая гибкость позволяет адаптировать решения под конкретный сервер и тип нагрузки. Результаты показывают, что каждая система имеет свои преимущества. Redis, будучи широко популярным и зрелым продуктом с огромной экосистемой, показал высокий уровень пропускной способности при оптимальной настройке io-threads, сохраняя невысокие задержки даже при больших пулах клиентов.
Memcache продемонстрировал стабильность и низкое использование CPU при тестах с минимальным пайплайнингом, что актуально для простых и предсказуемых сценариев. Valkey и Dragonfly, хотя и менее известны по сравнению с лидерами рынка, впечатлили при работе с массивными потоками запросов. Dragonfly в частности использует продвинутую архитектуру с проакторами (proactor_threads) и может выступать успешно в условиях высоких привлекательных нагрузок с разносом на несколько ядер. Garnet в целом показал хорошие показатели, однако при работе с единичным потоком демонстрировал аномально высокие задержки, что было отмечено в тестовой документации. Pogocache, сравнительно молодой участник, показал баланс между общей производительностью и эффективностью многоядерной обработки, что может быть интересно разработчикам, ищущим альтернативы более тяжеловесным решениям.
Он меньше нагружает CPU, сохраняя приемлемые показатели по латентности и тестовой пропускной способности. Важное значение для принятия решения имеет также масштабируемость решения. Тесты с разным количеством потоков ввода-вывода позволили оценить, насколько эффективно кеши умеют распараллеливать операции и использовать многопроцессорность сервера. Здесь Redis и Dragonfly проявили сильную адаптивность, обеспечивая линейный рост производительности с ростом потоков, в то время как Memcache и Pogocache имели более ограниченный рост и более плавные градиенты. Пропускная способность у всех систем на высоком уровне, но с заметными отличиями — Redis лидирует при больших пайплайнах, позволяя максимально эффективно обрабатывать запросы за счет оптимизаций ядра и перераспределения нагрузки между потоками.
Valkey, с достаточно свежей архитектурой, показывает потенциал для быстрого масштабирования, особенно если разработчики продолжат совершенствовать поддержку современных CPU. Garnet и Pogocache пока уступают в «сыром» быстродействии, но могут быть предпочтительнее с точки зрения простоты настройки и стабильности. Задержки остаются критическим параметром для систем с высокими требованиями к времени отклика. Особенно важны 99-й и 99.9-й процентили, отражающие устойчивость кеша под нагрузкой.
Здесь Redis и Dragonfly демонстрируют устойчивость, сохраняя задержки в пределах приемлемого уровня даже при больших нагрузках и количестве потоков, что важно для приложений реального времени и интерактивных сервисов. Memcache более стабилен при низкой нагрузке, однако начинает проигрывать при возрастании количества одновременных операций. Garnet имеет нестабильные пики, что может негативно сказаться при критических сценариях. CPU cycles стали одним из ключевых критериев для понимания энергоэффективности и возможности аналогичных систем работать на серверных платформах с ограниченным энергопотреблением. Перфоманс Linux показал, что Redis и Valkey используют CPU более эффективно, чем Memcache и Garnet, что позволяет снизить общие затраты на инфраструктуру и повысить общую производительность при одинаковом уровне энергопотребления.
Важно также учесть крайне длительный и скрупулёзный подход к тестированию. Все запуски суммарно заняли около двух недель, с тщательной подготовкой и развертыванием новых инстансов кешей для каждого теста, что сложно обеспечить дома или в небольших компаниях. Использовался специальный скрипт ./bench-all.sh, который водил процесс и собирал результаты, помещая их в специализированную директорию «results» для дальнейшего анализа.
Данные бенчмарки являются ценным ресурсом для технических специалистов, которые ставят перед собой цель выбрать оптимальное решение кеширования под свои нужды. Будь то разработка масштабируемых web-сервисов, систем обработки больших данных или игровых платформ — понимание особенностей производительности каждого кеша позволяет сэкономить время и ресурсы на внедрение, а также обеспечивает лучшие пользовательские впечатления. В целом стоит подчеркнуть, что выбор кеша — это всегда баланс между производительностью, стабильностью, простотой поддержки и функциональностью. Memcache отлично подходит для простых случаем, когда важна минимальная задержка без высокого сетевого взаимодействия. Redis более гибок и мощен, идеально подходит для проектов, требующих сложных структур данных и масштабирования.