Cloudflare объявила о доступности профилирования использования процессора и памяти по запросу для сервисов Workers и Durable Objects. Разработчики могут собирать профили непосредственно в производственной среде и просматривать их в виде интерактивных пламенных графиков. Эта функция позволяет определить функции, потребляющие процессорное время или выделяющие наибольший объём памяти, вместо того чтобы полагаться только на журналы и агрегированные метрики.
Профилирование можно запустить со страницы Workers Observability на панели Cloudflare или через интерфейс командной строки. Разработчик выбирает тип профиля — CPU или memory — и продолжительность сбора, а также может выбрать разные версии Worker. После завершения сеанса можно просмотреть интерактивный график и скачать файл профилирования для анализа с помощью других инструментов.
Что показывают пламенные графики?
Каждый прямоугольник на графике представляет вызов функции, а его ширина отражает объём связанного с ней процессорного времени или памяти. Можно нажимать на функции, чтобы сосредоточиться на них, или использовать табличное представление для сортировки результатов по числу образцов. Cloudflare рекомендует собирать несколько профилей и искать самые широкие функции, а также включать source maps в проектах TypeScript, чтобы имена функций не отображались в нечитаемом виде.
Для профилирования необходимо выбрать опубликованную версию, получающую достаточный трафик: сервис не создаёт новую изоляцию специально для измерений, поскольку цель заключается в наблюдении за реальным выполнением в производственной среде. Для сбора пятиминутного CPU-профиля можно использовать следующую команду:
cf workers versions profile latest --worker-id "$WORKER_ID_OR_NAME" --duration-ms 5000 --profile-type cpu > worker-cpu.pprof
Практические результаты, представленные Cloudflare
Cloudflare использовала инструмент для анализа Worker, реализующего привязку R2. Профилирование показало, что функция genericR2JsonReplacer повторно проходила дерево JSON во время выполнения JSON.stringify, из-за чего в некоторых случаях вложенное значение обрабатывалось пять раз. После исправления функция стала работать в 2,7 раза быстрее. Профилирование также выявило повторный вызов metrics; сохранения результата и его повторного использования оказалось достаточно, чтобы снизить потребление процессора.
В другом случае один из Workers превышал лимит памяти в 128 мегабайт: потребление P999 достигало примерно 133 мегабайт, что приводило к ошибкам «Exceeded Memory». Профиль heap показал, что код Prometheus, отвечавший примерно за 66,7% выделений, всё ещё частично выполнялся, хотя считалось, что он отключён. После полного удаления этого участка кода значение P999 снизилось со 133 до 118 мегабайт, а P50 — с 70 до 54 мегабайт.
Что меняется на практике?
Эта функция даёт командам разработки прямое представление о выполнении Workers в реальных условиях, где трафик и распределение изоляций могут отличаться от локальной среды разработки. Платформа учитывает сложность распределения Workers между несколькими центрами обработки данных и устройствами, а в Durable Objects разработчик может указать объект по имени, чтобы получить профиль именно той изоляции, в которой он выполняется.
Механизм выполнения сохраняет возможность принимать запросы во время сбора: блокировка изоляции удерживается только при запуске и остановке профилирования, после чего образцы CPU собираются с интервалом в одну миллисекунду в течение заданного периода. Durable Objects используют свою природу с сохранением состояния, чтобы направить запрос на профилирование к изоляции и владельцу указанного объекта.
Ограничения и следующий шаг
Профилирование не запускается автоматически, поэтому сеанс может пропустить короткие или редкие периоды, в которые возникает проблема. Профилировщик памяти показывает только выделения, произошедшие в течение окна измерения, и не обязательно зафиксирует потребление, связанное с запуском. Cloudflare сообщает, что работает над непрерывным профилированием, которое будет автоматически собирать образцы и позволит позднее просматривать их на панели управления.