← Cloudflare Workers / workers / observability / dev-tools
Профилирование памяти
Понимание использования памяти Worker поможет оптимизировать производительность и избежать ошибок нехватки памяти (OOM) при достижении Лимиты памяти Worker, и исправлять утечки памяти.
Использование памяти можно профилировать с помощью снимков в DevTools. Снимки памяти позволяют просмотреть сводку использования памяти, увидеть, сколько памяти выделено под разные типы данных, и получить подробную информацию о конкретных объектах в памяти.
При использовании DevTools для профилирования памяти бывает сложно воспроизвести конкретное поведение, которое вы наблюдаете в продакшене. Чтобы имитировать поведение продакшена, убедитесь, что запросы к локальному Worker похожи на запросы в продакшене. Это может означать отправку большого количества запросов, обращение к конкретным маршрутам или использование данных, приближенных к продакшену, с помощью --remote flag.
Создание снимка
Чтобы создать снимок памяти:
- Запустите
wrangler devчтобы запустить ваш Worker - Нажмите клавишу
Dв терминале, чтобы открыть DevTools - Откройте вкладку «Memory»
- Отправляйте запросы своему Worker, чтобы начать выделение памяти
- При необходимости подключите отладчик, чтобы иметь возможность приостановить выполнение в нужный момент
- Выберите
Take snapshot
Теперь можно проверять память Worker.
Пример снимка
Рассмотрим пример, чтобы разобраться, как читать снимок памяти. Представим, что у вас есть следующий Worker:
let responseText = "Hello world!";
export default {
async fetch(request, env, ctx) {
let now = new Date().toISOString();
responseText = responseText + ` (Requested at: ${now})`;
return new Response(responseText.slice(0, 53));
},
};Хотя изначально этот код работал хорошо, со временем вы замечаете более медленные ответы и ошибки Out of Memory. С помощью DevTools можно выяснить, не связано ли это с утечкой памяти.
Сначала, как упоминалось выше, откройте DevTools, нажав D ключ после выполнения wrangler dev.
Затем перейдите на вкладку «Memory».
Затем создайте большой объём трафика на Worker, отправляя запросы. Это можно сделать с помощью curl или путём
многократной перезагрузки браузера. Обратите внимание, что для воспроизведения утечки памяти в других Workers могут потребоваться более специфичные запросы.
Затем нажмите кнопку "Take Snapshot" и просмотрите результаты.
Сначала перейдите к разделу «Statistics» в выпадающем списке, чтобы получить общее представление о том, что занимает память.
Судя по этой статистике, значительная часть памяти приходится на строки: 67 КБ. Вероятно, именно они являются источником утечки памяти. Если вы отправите больше запросов и сделаете ещё один снимок, вы увидите, что это число продолжает расти.
В сводке по памяти перечислены типы данных с указанием объема занимаемой ими памяти. Если щелкнуть "(string)", можно увидеть строку, которая значительно больше остальных. Судя по тексту, вы раз за разом добавляете "Requested at" и дату, нечаянно перезаписывая глобальную переменную все более длинной строкой:
responseText = responseText + ` (Requested at: ${now})`;С помощью Memory Snapshotting в DevTools вы определили объект и строку кода, вызывающие утечку памяти. Теперь вы можете исправить это небольшим изменением кода.
Дополнительные материалы
Подробнее о том, как использовать Memory Snapshotting, см. Документация Google о снимках памяти кучи ↗.
Чтобы узнать, как использовать DevTools для анализа использования CPU, см. Документация по профилированию CPU.