← Усі статті

Cloudflare: 100 ТБ пам’яті завдяки розкладці DNS-кешу

П’ять правок у Rust у Big Pineapple: Vec→Box, одна секція, wire-байти — −56% на запис і +43% до вставок на 1.1.1.1.

Cloudflare: 100 ТБ пам’яті завдяки розкладці DNS-кешу
Зміст

Коротко

Платформа Big Pineapple за DNS-сервісами Cloudflare (зокрема 1.1.1.1) тримає понад 250 млрд записів кешу. П’ять послідовних правок розкладки в пам’яті на Rust зменшили слід одного запису більш ніж удвічі — з 953 до 420 байт. По флоту це близько 100 ТБ звільненої оперативної пам’яті; вставка в кеш прискорилася на 43%, затримка читання впала на 19%.

Що сталося

На холодному старті кеш порожній і заповнюється запитами до ліміту, після чого витісняють менш популярні записи. За EDNS Client Subnet той самий запит кешується в кількох варіантах — і кількість записів, і ціна байта зростають.

Кожен запис — ключ (ім’я, тип, теги) і значення з секціями відповіді плюс метадані (TTL, лічильник потраплянь). У продакшені збережену відповідь майже не змінюють, але типи на кшталт Vec<T> і String все одно несуть поле ємності й запас на купі. Заміна на Box<[T]> / Box<str> прибрала зайві вісім байт на поле й хвіст алокацій — близько 15 ТБ на всьому флоті.

Далі три списки секцій DNS звели в один із короткими зміщеннями u16. Власника запису, що збігається із запитаним ім’ям, перестали дублювати — його відновлюють із ключа. Великі варіанти enum даних винесли на купу, потім перейшли до зберігання корисного навантаження сирими байтами відповіді в одному буфері: краща локальність кешу процесора і менше серіалізації на шляху відповіді.

Чому це важливо

На масштабі «байт на запис × сотні мільярдів» мікрооптимізація структури даних стає економікою заліза: 100 ТБ — це приблизно 130 серверів покоління Gen 13 за оцінкою Cloudflare. При цьому швидкість не принесли в жертву: менше алокацій і щільніша пам’ять дали й економію, і прискорення.

Для команд поза DNS урок той самий: профілюйте не лише алгоритми, а й «мертву» ємність контейнерів, вирівнювання структур і розмір enum за найважчим варіантом. Бенчмарки на синтетиці плюс замір резидентної пам’яті в проді після поетапного викату — обов’язкова пара.

На практиці

  1. Якщо об’єкт після запису незмінний — розгляньте Box<[T]> / Box<str> замість Vec / String.
  2. Кілька маленьких списків з одним життєвим циклом часто дешевші як один буфер зі зміщеннями.
  3. У enum з рідкісними важкими варіантами перевірте, чи не платите розміром рідкісних полів за кожен A-запис.
  4. Сирі байти відповіді на гарячому шляху можуть бути швидшими за «гарне» розібране дерево — якщо рідкісні типи все ще розбираєте точково.
  5. Катіть по одній ідеї й дивіться 90-й і 99-й процентилі резидентної пам’яті: на графіку Cloudflare вона падала сходинками з травня по липень 2026.

Підсумок

Cloudflare показав, як серія нудних на вигляд правок розкладки кешу дає терабайти економії без жертви затримкою. Звільнену пам’ять планують вкласти в більший обсяг кешу — менше запитів угору по ієрархії DNS.