Cloudflare освободила 100 ТБ оперативной памяти простой оптимизацией кода
Компания радикально оптимизировала 1.1.1.1
Cloudflare освободила около 100 ТБ оперативной памяти на своей глобальной серверной инфраструктуре, не заменив ни одной планки ОЗУ и не перенастроив физическое оборудование. Инженеры компании просто переработали структуру DNS-кэша платформы Big Pineapple, которая лежит в основе публичного DNS-сервиса 1.1.1.1.
Изображение сгенерировано Gemini // Источник изображения: Gemini
После пяти изменений в коде на Rust размер одной кэшированной DNS-записи удалось сократить с 953 до 420 байт — примерно на 56%. На масштабе Cloudflare это дает огромную экономию: в Big Pineapple одновременно хранится более 250 млрд DNS-записей. Поэтому даже один лишний байт на каждую запись обходится инфраструктуре более чем в 250 ГБ оперативной памяти.
Более 15 ТБ удалось высвободить после замены динамических контейнеров Rust Vec и String на структуры фиксированного размера. После попадания данных в кэш увеличивать их емкость уже не требовалось, поэтому дополнительная память фактически расходовалась впустую.
Инженеры также объединили три списка DNS-записей в единый буфер с двухбайтовыми смещениями, отказались от хранения повторяющихся доменных имен. Сами данные теперь хранятся в компактном сетевом формате с указанием длины. Раньше, например, небольшая четырехбайтовая DNS-запись типа A могла занимать в памяти те же 144 байта, что и значительно более крупные записи.
Оптимизация не только освободила память, но и ускорила работу сервиса. Скорость добавления записей в кэш выросла на 43%. Задержка поиска снизилась с 828 до 670 наносекунд.
В сумме принятых мер Cloudflare получила около 100 ТБ свободной оперативной памяти — примерно столько же, сколько установлено в 130 серверах поколения Gen 13 с 768 ГБ DDR5-6400 в каждом. На фоне высоких цен на серверную память такая оптимизация особенно полезна.
При этом Cloudflare не собирается убирать освободившуюся память из серверов. Компания планирует использовать ее для увеличения DNS-кэшей. Благодаря этому больше запросов можно будет обслуживать непосредственно из кэша, реже обращаясь к авторитетным DNS-серверам. Это одновременно снизит сетевую нагрузку и ускорит обработку DNS-запросов.