Руководство: Как проверить использование памяти в Node.Js

  1. Что вы узнаете
  2. Как Node.js организует память?
  3. Запрос кучи Node.js
  4. Тестирование использования reverse () памяти для небольшого массива
  5. Тестирование reverse () использования памяти для большого массива
  6. Куда пойти отсюда

Хотя все, похоже, согласны с тем фактом, что преждевременная оптимизация может иметь пагубные последствия, вы должны заботиться о производительности в любом случае: в самом простом случае вам может потребоваться узнать, сколько памяти использует данный процесс Node.js во время его выполнения.

В этом посте мы увидим, как использовать встроенный метод Node.js для получения информации об использовании памяти любым заданным процессом.

Отказ от ответственности: это не является подробным объяснением механизма управления памятью Node.js, на самом деле у меня есть несколько советов для вас в конце статьи.

Что вы узнаете

  1. Как получить информацию о памяти процесса Node.js
  2. Как Node.js организует память

Требования

Для того, чтобы следовать, вам нужно базовое понимание Javascript и Node.js

Node.js можно скачать с официального сайта, установить через менеджер пакетов или даже лучше через Nodesource если ваш дистрибутив Linux не поставляется с последней версией Node.

Как Node.js организует память?

Ну, одного поста в блоге будет недостаточно, чтобы объяснить все механизмы: на данный момент вы должны быть обеспокоены кучей, поэтому давайте начнем с разбора основ.

Я сказал куча ?? Да, сэр: первое, с чем вы будете связываться, запрашивая использование памяти Node.js, - это куча .

Куча - это сегмент памяти, используемый для хранения объектов, строк и замыканий. Здесь происходит вся магия.

Хотя куча является частью чего-то большего: работающий процесс Node.js хранит всю свою память в резидентном наборе . Вы можете думать об этом как о большой коробке, которая содержит еще несколько коробок. Резидентный набор содержит также фактический код Javascript (внутри сегмента кода ) и стек , где находятся все переменные. Надеемся, что следующая иллюстрация прояснит концепцию:

Хотя все, похоже, согласны с тем фактом, что преждевременная оптимизация может иметь пагубные последствия, вы должны заботиться о производительности в любом случае: в самом простом случае вам может потребоваться узнать, сколько памяти использует данный процесс Node

Иллюстрация организации памяти Node.js

Звучит сложно? На данный момент нам нужно сосредоточиться только на куче, поэтому не беспокойтесь, если вы не можете понять всю терминологию прямо сейчас!

Запрос кучи Node.js

Мы знаем, что такое Resident Set, и мы также знаем, что куча - это то, что мы ищем: теперь нам нужно выяснить, сколько кучи используется данным процессом Node.js. Но как нам получить доступ к куче?

С процессом ! процесс является глобальным объектом Node.js, который содержит информацию о текущем процессе Node.js и предоставляет именно то, что мы искали: метод memoryUsage () .

memoryUsage возвращает объект с различной информацией: rss , heapTotal , heapUsedexternal ):

  • rss обозначает Resident Set Size, это общая память, выделенная для выполнения процесса
  • heapTotal - это общий размер выделенной кучи
  • heapUsed - фактическая память, используемая во время выполнения нашего процесса.

Вооружившись знаниями, мы готовы увидеть несколько примеров.

Тестирование использования reverse () памяти для небольшого массива

В нашем первом примере мы увидим, сколько памяти используется очень простым методом Javascript: reverse () . reverse - это метод массива: он принимает массив и обращает его содержимое.

Создайте новый файл с именем reverse_node.js:

const arr = [1, 2, 3, 4, 5, 6, 9, 7, 8, 9, 10]; arr.reverse (); const used = process.memoryUsage (). heapUsed / 1024/1024; console.log (`Скрипт использует приблизительно $ {Math.round (used * 100) / 100} MB`);

Теперь, если вы запустите этот скрипт, вы должны увидеть следующий вывод:

Этот скрипт использует примерно 3,6 МБ памяти

В приведенном выше примере я выбрал свойство heapUsed из process.memoryUsage (), но если вы запустите сам process.memoryUsage (), у вас будет доступ к другим свойствам, перечисленным в предыдущем разделе. Например, запустив:

const arr = [1, 2, 3, 4, 5, 6, 9, 7, 8, 9, 10]; arr.reverse (); const used = process.memoryUsage (); for (пусть введено используется) {console.log (`$ {key} $ {Math.round (используется [ключ] / 1024/1024 * 100) / 100} МБ`); }

Вы увидите следующий вывод:

rss 25,63 МБ heapTotal 5,49 МБ heapUsed 3,6 МБ внешняя 0,01 МБ

Теперь, это не самый точный способ измерения потребления памяти в Node.js, но, по крайней мере, вы сделаете свою работу. При работе с инструментами нужно позаботиться о большем, особенно вы должны учитывать сборщик мусора Node.js. Кроме того, с memoryUsage у вас есть, по крайней мере, представление о том, сколько памяти занимает данный скрипт / процесс.

Давайте продолжим с другим примером!

Тестирование reverse () использования памяти для большого массива

Как насчет тестирования очень большого массива сейчас?

Создайте новый файл в каталоге вашей игровой площадки с именем reverse_node_bigArray.js:

let arr = Array (1e6) .fill («некоторая строка»); arr.reverse (); const used = process.memoryUsage (). heapUsed / 1024/1024; console.log (`Скрипт использует приблизительно $ {used} MB`);

Array (1e6) создает пустой массив со свойством длины 1 миллион. Затем метод fill () заполняет каждую позицию массива строкой. На данный момент у нас есть массив с 1 миллионом элементов в нем.

Запустив новый скрипт, вы должны увидеть следующий вывод:

Этот скрипт использовал примерно 11,23 МБ

Все станет интереснее, если мы увеличим размер нашего массива. В скрипте измените следующую строку:

let arr = Array (1e6) .fill («некоторая строка»)

в

let arr = Array (1e8) .fill («некоторая строка»)

Array (1e8) создает пустой массив со свойством длины 100 миллионов. Опять же, метод fill () заполняет каждую позицию массива строкой. На данный момент у нас есть массив со 100 миллионами элементов, и, запустив скрипт снова, вы увидите, как увеличивается использование памяти:

Этот скрипт использует примерно 1278,83 МБ

Это действительно интересно, верно? Отныне вы сможете измерить, сколько памяти использует процесс Node.js. Проверьте свой код и посмотрите, сможете ли вы оптимизировать некоторые функции!

Куда пойти отсюда

Мы видели, как измерить использование памяти процессом Node.js. Имейте в виду, что для наиболее распространенных потребностей будет достаточно метода memoryUsage (), но если бы вы исследовали утечку памяти в приложении Node.js, вам потребовалось бы нечто большее.

Для начала предлагаю посмотреть, как работает сборка мусора в v8. Вот отличная рецензия: http://jayconrod.com/posts/55/a-tour-of-v8-garbage-collection

Устранить утечку памяти в Node.js непросто, но не бойтесь, есть много доступных библиотек: memwatch-некст это отличная отправная точка, и это стоит посмотреть.

Наконец, если вы хотите подняться, есть также несколько коммерческих инструментов, но в любом случае, понимание того, как работает сборка мусора в Node.js, действительно важно. Начните с основ, а затем переключитесь на инструмент мониторинга, когда вы почувствуете себя более уверенно.

Спасибо за прочтение!

Psst .. вам может понравиться 4 + 1 способ сделать HTTP-запросы с Node.js: async / await edition

Я Валентино Гальярди, и я помогаю занятым людям освоить этот безумный современный JavaScript-материал. Я занимаюсь обучением и консультированием по JavaScript, React, Redux.

Давайте свяжемся!

Js организует память?
Js организует память?
Но как нам получить доступ к куче?