LINUX.ORG.RU

Cloudflare высвободила 100 ТБ оперативной памяти оптимизацией DNS-кэша

 , , , ,


0

6

27 августа в Cloudflare рассказали о событии из разряда «однострочный патч с мультипликативным эффектом»: небольшая экономия памяти на одной структуре данных, будучи умноженной на сотни миллиардов экземпляров, превращается в десятки терабайт. Правда, в данном случае одним однострочным патчем дело не ограничилось — инженеры последовательно внесли пять сравнительно небольших изменений в представление записей DNS-кэша и в итоге высвободили около 100 ТБ оперативной памяти.

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

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

  • Вместо динамических Vec<T> и String для неизменяемых после помещения в кэш данных стали использовать Box<[T]> и Box<str>. У 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<[u8]> практически в сетевом формате 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-модулей.

>>> Источник

★★★★★

Проверено: maxcom ()
Последнее исправление: unclestephen (всего исправлений: 1)
Ответ на: комментарий от maxcom

А как будет выглядеть запрос: вот код, сделай классно. Или: обрати внимание вот на этот енум, что с ним можно сделать? Во втором случае сам вопрос - уже 70% ответа.

С запуском тоже интересно: нет, запустить-то можно, но это ж теоретическая задача: такая-то структура занимает столько-то, такая - столько. Значит надо сделать так. Особо мне интересно про добавление байт для выравнивания данных. Короче, я бы послушал (почитал) как он с этим справится.

bbc69
()
Ответ на: комментарий от bbc69

А как будет выглядеть запрос: вот код, сделай классно

Я много раз так делал с JVM – даю heap dump модели, спрашиваю, что можно оптимизировать чтобы уменьшить потребление память. Помогать ей в этом особо не надо, только выдать пути/права к диагностическим утилитам. У модели обычно штук десять идей разной степени разумности. Если приложение никто раньше не анализировал, то там вполне очевидные вещи которые любой разработчик и сам бы легко нашел.

Если приложением уже занимались, то, как правило, большая часть идей имеет сомнительную эффективность. Чтобы не тратить время на проверку, надо модели выдать повторяемый тест и отправить проверять ее саму гипотезы. Дополнительно еще можно навесить ограничений, чтобы она не портила производительность. Вот в таком варианте модель иногда творит чудеса (а иногда нет).

maxcom ★★★★★
()
Ответ на: комментарий от cobold

у тебя в подвале стойка?

К сожалению в мечтах только =( Перед подорожанием памяти успел купить два комплекта по 128гб озу и собрал:

  1. Сервер Proxmox и хранилище в одном лице - на двух xeon v4 2680, 128gb ecc, 6x16tb hdd и 4х1tb ssd
  2. Сервер Proxmox на amd am4 5700x, 128gb ddr4 не ecc, 1tb ssd

Только как захотел нормальный rack собрать на epyc sp3\5 так цены дали газ. Если 1тб озу будет меньше 200к снова - точно закуплюсь в прок

AntonyRF ★★★★
()
Ответ на: комментарий от bbc69

А как будет выглядеть запрос: вот код, сделай классно.

Согласен со мнением maxcom. Если модель не дура, то можно просто прислать скриншот от профайлера и сказать прооптимизировать. Чудеса могут быть, а могут и не быть, если там придраться не к чему, но в моих Ява-проектах это давало результат. Например, я не замечал некоторого узкого места в алгоритме (нет, не матан).

Самое главное, чтобы айяй смог проверить результат быстро (успешная компиляция, тесты, бенчмарки).

Vest
()
Последнее исправление: Vest (всего исправлений: 2)
Ответ на: комментарий от maxcom

Если приложение никто раньше не анализировал, то там вполне очевидные вещи которые любой разработчик и сам бы легко нашел.

Ну так я про это и говорил, в том числе: очевидные вещи ИИ итак делать умеет. А на неочевидных не сможет.

Хотя ладно, в топике вещи сравнительно очевидные, кмк.

bbc69
()
Ответ на: комментарий от LINUX-ORG-RU

Я так и не понял в чём новость.

Ну как же… В эпоху тотального блоатинга и квик-прототайпинга, они таки догадались до тривиальных оптимизаций, которые давно уже ни кто не делает. И офигели от результата. :)

anonmyous ★★★
()

100ТБ конечно для обывателя ого-го, но в бизнесе CloudFlare какое-то это значение?

смогли они на освободившейся памяти что-то заработать?

spigel
()

Как вы добились такого высвобождения памяти?

Перезагрузили сервера, которые работали 10 лет.

Ukka
()
Ответ на: комментарий от spigel

ну это как минимум не потребовало затрат, 2.5М высвободившихся ресурсов, разработчик оправдал свою работу в течении нескольких лет

unclestephen ★★★★★
() автор топика
  1. Используешь Rust потому что «безопасно»
  2. Замечаешь, что «безопаность» стоит ресурсов
  3. Вместо того чтобы докупить ресурсов, что для компании уровня Cloudflare вполне реалистично, начинаешь ломать «безопасный» Rust кривыми патчами\костылями
  4. Вы великолепны!!!

P.S. можно было и сразу Си использовать, потому что сдвиги, офсеты, приведения и прочие игры в наперстки с последствиями там это классика жанра. экономия на спичках.

oOoOo
()
Последнее исправление: oOoOo (всего исправлений: 1)
Ответ на: комментарий от kirill_rrr

требуемая квалификация возможно больше чем существует Раст

Раст внедряют как раз для того чтобы можно было кодить не имея квалификации. С соответствующим качеством продукта, но зато без сегфолтов.

firkax ★★★★★
()
Ответ на: комментарий от gagarin0

Если ты его строил от балды, то считай по умолчанию что он сырой. Если же всё грамотно проектировалось (включая моделирование всех возможных сезонных и погодных условий), то никаких неожиданностей не будет.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 1)
Ответ на: комментарий от dataman

Я и не знал что Stephen и Стивен родственные слова. Всегда читал его Стэпхэн, а в переводе вроде как Стёпа получается.

firkax ★★★★★
()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.