Cloudflare удалось высвободить около 100 ТБ оперативной
памяти в своей глобальной инфраструктуре благодаря оптимизации алгоритма
распределения кешированных данных между серверами. Инженеры компании
пересмотрели работу согласованного хеширования в открытом фреймворке Pingora и
обнаружили, что значительная часть используемой памяти фактически была
избыточной.

Cloudflare активно кеширует веб-контент, чтобы отдавать
пользователям запрошенные данные непосредственно из памяти или с диска
ближайшего сервера, не обращаясь каждый раз к исходному сайту. Для выбора
подходящего кеш-сервера компания использует алгоритм Ketama, основанный на
согласованном хешировании.
Система преобразует URL в числовой хеш и сопоставляет его с
хешами серверов. При этом каждому физическому серверу назначается множество
виртуальных точек, случайным образом распределенных по хеш-кольцу. Такая схема
позволяет равномерно перераспределять запросы между оставшимися узлами, если
один из серверов выходит из строя.
Со временем в инфраструктуре Cloudflare на каждый сервер
пришлось около 100 000 таких хешей. Дополнительную сложность создавали разные
веса серверов, региональные особенности инфраструктуры и ограничения, из-за
которых не каждый узел мог обслуживать любой запрос. В результате таблицы
маршрутизации стали занимать огромное количество оперативной памяти.
Инженеры провели статистический анализ и выяснили, что
настолько большое количество виртуальных точек практически не влияет на
качество балансировки. После отметки примерно в 10 000 хешей дальнейшее
увеличение их числа давало лишь минимальный прирост точности распределения
нагрузки.
Cloudflare сократила количество виртуальных точек примерно в
десять раз, практически не ухудшив балансировку. Затем инженеры дополнительно
оптимизировали структуры данных на Rust и уменьшили размер каждой записи
таблицы «хеш — сервер» еще на два байта. Для одной записи это почти незаметная
экономия, но при миллиардах записей она превращается в десятки терабайт памяти.
В совокупности две оптимизации позволили высвободить около
100 ТБ оперативной памяти. При этом Cloudflare не стала сразу полностью
заменять старую реализацию: новую версию алгоритма добавили параллельно с
прежней, чтобы при обнаружении проблем можно было быстро вернуться к
предыдущему варианту.
Это уже не первый случай, когда Cloudflare удается
сэкономить десятки терабайт памяти благодаря относительно небольшим изменениям
в программном обеспечении. Ранее компания также высвободила около 100 ТБ ОЗУ,
оптимизировав структуру записей DNS-кеша сервиса 1.1.1.1.
