Node, как среда выполнения Javascript на стороне сервера, значительно обогащает сценарии применения Javascript.
Однако среда выполнения Node.js сама по себе является черным ящиком. Мы не можем оценить состояние среды выполнения, и воспроизвести проблемы в Интернете сложно .
Поэтому мониторинг производительности является краеугольным камнем «нормальной работы» приложений Node.js. В любое время можно не только отслеживать различные индикаторы времени выполнения, но и помогать устранять неполадки в аномальных сценариях.
Мониторинг производительностиможно разделить на две части:
сбор и отображение показателей производительности
сбор и анализ данных о производительности
, таких как QPS, медленный HTTP, журналы каналов бизнес-обработки и т. д.На рисунке выше вы можете увидеть преимущества и недостатки трех текущих основных решений для мониторинга производительности Node.js. Ниже приводится краткое введение в состав этих трех решений:
Prometheus
AliNode.
Alinode — это расширенная среда выполнения, совместимая с официальным nodejs, предоставляющая некоторые дополнительные функции:
Agenthub — это резидентный процесс, используемый для сбора показателей производительности. и сообщать о них.
образуют замкнутый цикл мониторинга, отображения, снимков и анализа. Доступ удобен и прост, но все же существуют риски при расширении среды выполнения,
Easy-Monitor
xprofilerNode.js Addon
для реализацииДанные о потреблении процессорного времени текущим процессом можно получить с помощью process.cpuUsage()
Единица возвращаемого значения — микросекунды.
Данные о выделении памяти текущего процесса можно получить с помощью process.memoryUsage()
. Единица возвращаемого значения — байты.
Как видно из рисунка выше, rss
включает в себя сегмент кода ( Code Segment
), память стека ( Stack
) и кучу памяти ( Heap
).
могут получать данные анализа памяти кучи и пространства кучи с помощью v8.getHeapStatistics()
и v8.getHeapSpaceStatistics()
На следующем рисунке показано распределение состава памяти кучи v8:
Пространство кучи памяти сначала делится на пробелы, а затем на страницы. Память выгружается в соответствии с выравниванием по 1 МБ.
Новое пространство: пространство нового поколения, используемое для хранения некоторых данных объекта с относительно коротким жизненным циклом, разделенное на два пространства (тип пространства — semi space
): from space
to space
.
Старое пространство
: пространство старого поколения, используемое для хранения объектов, продвигаемых New Space
Пространство кода: хранит исполняемый код, скомпилированный JIT версии 8.
Пространство карты: хранит объект-указатель скрытого класса, на который указывает Object. Указатель скрытого класса записывается. v8 в зависимости от среды выполнения. Структура макета объекта используется для быстрого доступа к элементам объекта.
Большое пространство объектов: используется для хранения объектов размером более 1 МБ, которые не могут быть выделены на страницы.
Алгоритм сборки мусора в
Mark-Sweep-Compact
для переработки объектов в старом поколении.Scavenge
используется для переработки объектов вПредпосылка: New space
разделено на два пространства объектов: from
и to
Время срабатывания: когда New space
заполнено.
Шаги:
В from space
выполните обход в ширину
и обнаружите, что уцелевший (достижимый) объект
Old space
иto space
Когда копирование заканчивается, в to space
остаются только выжившие объекты, from space
очищается,
происходит обмен from space
to space
и начинается следующий раунд Scavenge
.
подходит для частого повторного использования и недостаточного объема памяти. Для больших объектов типичная стратегия «пространство-время» имеет тот недостаток, что тратится в два раза больше места, чем
Три шага: маркировка, очистка и организация
. Время срабатывания: когда Old space
заполнено.
Шаги:
Маркировка (метод трехцветной маркировки).
marking queue
(явный стек) и пометьте эти объекты как серые.pop
его из marking queue
и отмечайте его черным.push
в marking queue
.для
. Компактная
Old space
, чтобы очищенное пространство было непрерывным и полным.Когда версия 8 изначально выполняет сбор мусора, ей необходимо остановить программу, просканировать всю кучу и освободить память перед повторным запуском программы. Такое поведение называется полной паузой ( Stop-The-World
).
Хотя активные объекты в новом поколении малы и часто перезапускаются, полная остановка оказывает незначительное влияние. Однако сохранившиеся объекты в старом поколении многочисленны и велики. и паузы, вызванные маркировкой, уборкой, сортировкой и т. д. Это будет посерьезнее.
Эта концепция на самом деле немного похожа на архитектуру Fiber в среде React. Только в свободное от работы время браузер будет проходить по дереву Fiber для выполнения соответствующих задач. В противном случае выполнение будет отложено, что минимально повлияет на задачи основного потока. , избегая задержек приложений и улучшая производительность приложений.
поскольку v8 имеет ограничение по умолчанию на пространство нового и старого поколений.
New space
ограничение по умолчанию: 32 МБ для 64-битных систем и 16 МБ для 32-битных систем.Old space
ограничения по умолчанию: 1400 МБ для 64-битных систем. 700M для 32-битных систем.Таким образом, для настройки верхнего предела пространства нового и старого поколений предусмотрены два node
--max-semi-space-size
: Установите максимальное значение пространства New Space
пространства--max-old-space-size
: установите максимальное значение Old Space
Spacenode
предоставляет три способа просмотра журналов GC:
--trace_gc
: строка журнала кратко описывает время, тип, изменения размера кучи и причины каждого GC--trace_gc_verbose
: отображает каждую кучу V8 после каждого GC. Подробный статус пространства--trace_gc_nvp
: подробная информация о паре ключ-значение каждого GC, включая тип GC, время паузы, изменения памяти и т. д.Поскольку журнал GC относительно примитивен и требует Для вторичной обработки вы можете использовать v8-gc-, разработанный командой AliNode.
делает снимок кучи работающей программы и может использоваться для анализа потребления памяти и изменения
файлов Heapsnapshot .heapsnapshot
генерироваться следующими способами:
с использованием дампа памяти
Использование профиля кучи v8
v8.getHeapSnapshot()
предоставляемый встроенным модулем v8 nodejs.
v8.writeHeapSnapshot(fileName)
Использование v8-profiler-next
.heapsnapshot
загрузить в память на панели инструментов инструментов разработчика Chrome, и результаты будут отображены, как показано ниже:
Представление по умолчанию — представление Summary
. Здесь нам нужно обратить внимание на два крайних правых столбца: Shallow Size
и Retained Size
Shallow Size
: указывает размер самого объекта, выделенного в куче v8.Retained Size
: указывает сумму. Shallow Size
всех объектов, на которые имеются ссылки.Если обнаружено, что Retained Size
особенно велик, внутри объекта может возникнуть утечка памяти. Вы можете расширить его, чтобы найти проблему
Comparison
проанализировать снимки кучи за два разных периода. Столбец Delta
можно использовать для фильтрации объектов с наибольшими изменениями памяти.
выполняет выборку моментального снимка процессора , на котором работает программа, который можно использовать для анализа и соотношения времени процессора.
Существует несколько способов создания файла .cpuprofile
:
Это 5-минутная коллекция образцов профилей ЦП
.Файл .cpuprofile
, Javascript Profiler
Представление по умолчанию — « Heavy
». Здесь мы видим два столбца: Self Time
и Total Time
Total Time
время выполнения самой функцииSelf Time
исключая другие вызовы).Total Time
Self Time
вычисления, требующие большого количества времени. Вы также можете выполнить дальнейшее устранение неполадок.
приложение неожиданно выходит из строя и завершает работу. система автоматически запишет его. В этот момент процесс сбрасывает информацию о выделении памяти, счетчик программ, указатель стека и другую ключевую информацию для создания
. Три метода создания файлов .core
:
ulimit -c unlimited
открывает предел ядра.node --abort-on-uncaught-exception
Добавление этого параметра при запуске узла может создать файл дампа при возникновении неперехваченного исключения в приложении.gcore <pid>
Вручную сгенерируйте. После получения файла .core
выполните анализ и. Диагностика может быть достигнута с помощью таких инструментов, как mdb, gdb, lldb и т. д. Фактическая причина сбоя процесса
llnode `which node` -c /path/to/core/dump
Из мониторинга видно, что память кучи продолжает увеличиваться, поэтому для устранения неполадок
По heapsnapshot
мы можем проанализировать и выяснить, что существует объект newThing
, который всегда поддерживал относительно большой объем памяти
newThing
unused
theThing
случаи replaceThing
, вызванные замыканиями.Обычные
утечки памяти включают в себя следующие ситуации:
Поэтому в вышеуказанных ситуациях необходимо тщательно подумать, будет ли объект в памяти автоматически переработан. не подлежат автоматической переработке, вам необходимо выполнить переработку вручную, например вручную установить для объектов значение null
, удалить таймеры, отменить привязку прослушивателей событий и т. д.
. В этой статье представлено подробное введение во всю систему мониторинга производительности Node.js.
Во-первых, в нем представлены проблемы, решаемые с помощью мониторинга производительности, его компонентов, а также сравнение преимуществ и недостатков основных решений.
Затем подробно представлены две основные части индикаторов производительности и инструментов моментальных снимков.
Наконец, на основе наблюдений, анализа и устранения неполадок воспроизводится простой случай утечки памяти, а также суммируются распространенные ситуации с утечками памяти и способы их решения.
Я надеюсь, что эта статья поможет каждому понять всю систему мониторинга производительности Node.js.