В Cloudflare сэкономили 100 ТБ оперативной памяти, оптимизировав кэш DNS-резолвера 1.1.1.1

В Cloudflare рассказали об опыте, когда небольшая экономия памяти на одной структуре данных, будучи умноженной на сотни миллиардов экземпляров, превращается в десятки терабайт. Сетевые инженеры последовательно внесли пять сравнительно небольших изменений в виде патчей в представление записей кэша DNS-резолвера 1.1.1.1 и в итоге высвободили около 100 ТБ оперативной памяти на серверах IT-инфраструктуры.

Оптимизация кода проводились в рабочей сетевой среде Big Pineapple (это платформа Cloudflare с кодом преимущественно на Rust, на её основе работают проекты публичного DNS‑резолвера 1.1.1.1, Gateway DNS, DNS Firewall, AS112 и другие DNS‑сервисы компании). В каждый момент времени Big Pineapple хранит более 250 млрд записей DNS‑кэша. Например, один лишний байт на запись в этой системе означает более 250 ГБ памяти на всей инфраструктуре.

В Cloudflare начали развёртывание патчей в Big Pineapple с 18 мая и завершили 6 июля 2026 года. Оптимизация состояла из пяти основных этапов:

  • вместо динамических Vec и String для неизменяемых после помещения в кэш данных стали использовать Box и Box. У Vec кроме указателя и длины хранится ещё и ёмкость буфера, необходимая для его последующего расширения, но кэшированные DNS‑ответы больше не изменяются. В каждой записи находилось восемь подобных полей, поэтому экономия только на этом изменении составила 64 байта на запись и более 15 ТБ в масштабах Cloudflare;

  • три отдельных массива DNS‑записей answer, authority и additional объединили в один массив, а границы секций стали задавать двумя 16-разрядными смещениями. Это позволило убрать два указателя и две длины и сэкономить ещё 28 байт на запись. Несколько логических полей заодно были упакованы в битовые флаги, что сократило и выравнивающие промежутки внутри структур Rust;

  • из большинства записей перестали сохранять повторяющееся имя владельца DNS‑записи. Обычно оно совпадает с доменом, уже присутствующим в ключе кэша. Теперь имя сохраняется отдельно только тогда, когда оно действительно отличается, например для записей за CNAME, а в остальных случаях восстанавливается из ключа;

  • инженеры обратили внимание на особенности enum в Rust. Размер перечисления определяется его крупнейшим вариантом: в структуре Cloudflare таким вариантом был NAPTR, из‑за которого RecordData занимал 144 байта. При этом наиболее распространённой записи A требуется всего 4 байта, а AAAA — 16 байт. Поскольку A и AAAA составляют более 80% обрабатываемых записей, большая часть выделенной памяти фактически оставалась пустой. Перенос крупных вариантов в отдельные heap‑объекты позволил значительно уменьшить сам enum;

  • наконец, от хранения разобранных Rust‑структур для содержимого DNS‑записей частично отказались вообще. Данные стали помещать в единый Box практически в сетевом формате DNS, добавляя перед каждой записью двухбайтовую длину. Это убрало множество отдельных выделений памяти и улучшило локальность данных для процессорного кэша. Для A, AAAA, TXT и DNSSEC‑записей данные теперь можно непосредственно копировать в формируемый DNS‑ответ, не выполняя повторную сериализацию. Само это изменение уменьшило задержку поиска примерно на 5%, а использование повторно применяемого временного буфера увеличило скорость добавления записей ещё на 13%.

В результате в тестах средний объём памяти на одну запись сократился с 953 байт до 420 байт, то есть на 56%, а фактически выделяемая память — с 1,1 КБ до 461 байта. На рабочих серверах эффект оказался несколько меньше, поскольку в RSS процесса входит не только DNS‑кэш, но итоговая экономия по всей инфраструктуре всё равно составила примерно 100 ТБ оперативной памяти.

Экономия памяти при этом не потребовала жертвовать производительностью. Наоборот, пропускная способность при добавлении записей в кэш выросла с 625 тыс. до 893 тыс. записей в секунду, или на 43%, а задержка поиска снизилась с 828 нс до 670 нс, или на 19%. В production значение p99 для потребления памяти одним экземпляром Big Pineapple уменьшилось с 9,3 ГБ до 5,3 ГБ, а p90 — с 6,5 ГБ до 3,8 ГБ.

Высвободившиеся 100 ТБ Cloudflare сравнивает с объёмом памяти примерно 130 серверов поколения Gen 13. Однако вынимать DIMM из серверов компания, естественно, не собирается: свободную память планируется направить на увеличение DNS‑кэшей. Более вместительный кэш повысит вероятность нахождения готового ответа и сократит число запросов к внешним авторитетным DNS‑серверам.

Проект Big Pineapple создавался Cloudflare как собственная замена постепенно переросшей свои первоначальные задачи инфраструктуре на основе Knot Resolver. Компания ранее сообщала, что сервис со временем практически полностью переписали на Rust, а расширяемую часть архитектуры построили вокруг изолированных WebAssembly‑модулей.

Источник: habr.com

0 0 голоса
Рейтинг новости
1
0
Подписаться
Уведомить о
0 комментариев