Оптимизация UEFI-загрузки bare-metal серверов: как Cloudflare сократила время перезапуска с часов до минут
В инфраструктуре крупных технологических компаний скорость перезагрузки серверов напрямую влияет на непрерывность бизнес-процессов. Инженерная команда Cloudflare подробно описала решение критической проблемы, возникшей в их централизованных bare-metal дата-центрах (core-кластерах), которые обеспечивают работу управляющего контура (control plane), биллинга и аналитики. В отличие от глобальной распределенной сети (edge), задержки в core-кластерах способны вызывать каскадные сбои во внутренних сервисах.
После планового обновления прошивок (firmware update) часть серверов возвращалась в строй не за минуты, а примерно за четыре часа. Из-за этого стандартный однодневный процесс обновления парка машин растягивался на несколько суток, а новые серверные узлы часами простаивали в ожидании завершения циклов загрузки.
Хронология расследования и математика таймаутов
Анализ логов последовательного порта (serial console) и мониторинга этапов POST (Power-On Self-Test) показал, что задержка происходит до начала загрузки ядра операционной системы (kernel startup). Проблема заключалась в неэффективной логике работы прошивки UEFI при выборе сетевого интерфейса для загрузки.
По умолчанию материнская плата последовательно опрашивала все доступные интерфейсы сетевой загрузки (Network Boot Interfaces):
- Опрос интерфейса IPv4 HTTPS boot (завершался неудачей по таймауту).
- Опрос интерфейса IPv4 iPXE (завершался неудачей по таймауту).
- Повторный цикл опроса.
- Успешный запуск через целевой интерфейс IPv6 HTTPS boot.
Каждая неудачная попытка сетевой загрузки сжигала ровно пять минут в ожидании ответа сети. Четыре ошибочных шага перед выходом на правильный интерфейс давали около двадцати минут чистых потерь на один цикл перезапуска. Поскольку автоматизация обновления прошивок требует нескольких последовательных перезагрузок сервера для применения микрокода различных компонентов (процессоров, контроллеров дисков, сетевых карт), эти двадцатиминутные задержки суммировались, превращаясь в катастрофические четыре часа простоя на один сервер.
Скрытые барьеры автоматизации BIOS
Попытка быстро исправить порядок загрузки в настройках BIOS выявила глубокие архитектурные ограничения проприетарного программного обеспечения.
- Ленивая загрузка настроек (Lazy Loading): Настройка порядка сетевой загрузки в интерфейсе прошивки была скрыта в структуре
EFI_IFR_REF3. Она динамически материализовалась в памяти только после того, как графический интерфейс BIOS получал обратный вызов (callback) от пользователя. Это исключало возможность простой автоматизации через стандартные скрипты конфигурирования. - Неизменяемые приоритеты вендора (Immutable Priorities): В прошивке была жестко зашита неотключаемая настройка
Force Priority Httpv4 Httpv6 Pxev4 Pxev6, блокировавшая любые попытки переопределить порядок загрузки. Для ее обхода команде потребовалось взаимодействовать с вендором материнских плат для выпуска отладочной версии BIOS. - Различия в именовании интерфейсов: Сетевые адаптеры от разных производителей возвращали отличающиеся строки идентификаторов интерфейсов в UEFI. Это делало невозможным использование жестко заданных имен в конфигурации. Инженерам пришлось реализовать гибкий механизм сопоставления строк по шаблонам (wildcard matching), например, с помощью регулярных выражений вида
.*HTTP.*IPv4.*P1, для автоматического определения нужного порта.
Архитектура решения: idempotent pre-boot и iPXE scripting
Cloudflare активно использует PXE/iPXE на ранних стадиях загрузки. Инструмент iPXE поддерживает полноценное скриптование и современные сетевые протоколы, что позволяет превратить инициализацию железа в управляемый программный workflow.
Инженеры перенесли объявление порядка сетевой загрузки непосредственно в pre-boot PXE-стадию. Это позволило отказаться от долгого перебора интерфейсов силами прошивки на раннем этапе и сэкономило около часа на всем цикле обновлений.
Вторым важным шагом стало внедрение контроля состояния конфигурации (state validation). Если после обновления прошивка сбрасывала настройки к заводским (что является стандартным поведением для многих материнских плат), автоматизация обнаруживала отклонение (drift), принудительно переустанавливала нужный порядок и отправляла сервер на один финальный перезапуск.
Для реализации этой логики на уровне скриптов iPXE команда столкнулась с тем, что iPXE считывает системные переменные в шестнадцатеричном формате (hex), что затрудняет сравнение строк. Чтобы избежать сложных вычислений, был реализован флаг uefi-same-hex. Логика работы выглядит следующим образом:
- Скрипт конструирует путь к переменной в EFI:
efivar/CfHIIVarUpd-${guid}. - С помощью подписанного приложения конфигурации UEFI (
imgexec) устанавливается целевое значение настройки. - Происходит сравнение обновленной переменной. Если зафиксировано изменение, локальная переменная обновляется, и инициируется быстрый перезапуск.
Благодаря такой схеме процесс настройки стал полностью идемпонентным: система при каждом запуске проверяет соответствие текущего порядка загрузки целевому и вносит изменения только при обнаружении расхождений.
В результате оптимизации время прохождения Firmware Upgrade Automation сократилось с почти 4 часов до 3 минут, а время одиночного перезапуска сервера снизилось с 20 минут до менее чем 60 секунд.
Уроки для SRE и инфраструктурных команд
Опыт Cloudflare позволяет сформулировать ключевые принципы управления крупными парками bare-metal серверов:
- Инфраструктурная телеметрия. Избыточные таймауты на этапе инициализации оборудования невозможно обнаружить с помощью стандартных метрик операционной системы, так как ОС еще не запущена. Для выявления таких задержек необходимо собирать и анализировать данные с последовательных консолей (serial console) и собирать телеметрию с контроллеров управления материнской платой (BMC/OpenBMC).
- Конфигурация BIOS как desired state. Настройки сетевой загрузки и параметры BIOS должны управляться так же, как конфигурационные файлы приложений или параметры ядра Linux (kernel arguments). Необходим непрерывный мониторинг дрейфа конфигурации, особенно после выполнения плановых обновлений микрокода.
- Явное декларирование вместо автовыбора. Автоматический перебор интерфейсов допустим в домашних лабораториях или небольших офисах. В масштабах дата-центра любой неопределенный шаг умножается на тысячи серверов и оборачивается часами простоя. Целевой загрузочный интерфейс должен быть жестко и явно назначен конфигуратором.
- Абстракция от аппаратных вендоров. При написании шаблонов для конфигурации сетевых портов следует использовать абстрактные свойства (протокол, номер порта, слот), избегая привязки к конкретным MAC-адресам или специфичным для вендора строкам, чтобы избежать сбоев при замене сетевых карт.
- Стандартизация прошивок. Для управления масштабной инфраструктурой критически важно иметь один унифицированный образ BIOS для всех типов серверов (SKU), а специфичные для конкретных узлов настройки накладывать динамически в процессе загрузки через сетевые сценарии.

