INTEGRITY Документация

Профилирование памяти

Понимание использования памяти Worker поможет оптимизировать производительность и избежать ошибок нехватки памяти (OOM) при достижении Лимиты памяти Worker, и исправлять утечки памяти.

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

При использовании DevTools для профилирования памяти бывает сложно воспроизвести конкретное поведение, которое вы наблюдаете в продакшене. Чтобы имитировать поведение продакшена, убедитесь, что запросы к локальному Worker похожи на запросы в продакшене. Это может означать отправку большого количества запросов, обращение к конкретным маршрутам или использование данных, приближенных к продакшену, с помощью --remote flag.

Создание снимка

Чтобы создать снимок памяти:

Теперь можно проверять память Worker.

Пример снимка

Рассмотрим пример, чтобы разобраться, как читать снимок памяти. Представим, что у вас есть следующий Worker:

index.js
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.