Форум программистов, компьютерный форум, киберфорум
Node.js
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
 Аватар для Fixer_84
1505 / 969 / 812
Регистрация: 30.04.2016
Сообщений: 3,337

Детектирование утечки памяти для скриптов на NodeJS

02.04.2021, 16:25. Показов 2144. Ответов 23
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, уважаемые форумчане! Сделал все согласно переписке в этой теме NodeJS и потребление оперативной памяти. Пытаюсь понять есть ли учечка в моих скриптах. В прикрепленном файле статистика по всем скриптам (их 10) за вчера и сегодня (замерял каждые 30 секунд для каждого скрипта). Учечка, все-таки, есть, но я не знаю как с ней бороться. Если кто-то сталкивался с подобной проблемой, прошу объяснить как можно устранить утечку в скриптах (если нужно могу показать скрипты). Память постепенно увеличивается и рано или поздно достигнет своего предела (придется перезагружать сервер). Очень буду благодарен за ваш ответ.
Вложения
Тип файла: zip PossibleMemoryLeakageStats.zip (64.7 Кб, 10 просмотров)
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
02.04.2021, 16:25
Ответы с готовыми решениями:

Утилиты для поиска утечки памяти
Привет всем! Созданная прога работает ооооочень медленно, похоже, что там много утечек памяти, потому что используется множество...

Утечки памяти при использовании new/delete для двумерных массивов
Добрый день. Суть в том, что есть несколько функций, получающих на вход и возвращающих двумерные массивы. Реализация передачи массивов...

Как избежать утечки памяти при данном выделении памяти?
Всем привет. В проекте MFC делаю следующие манипуляции MY_STRUCT *ms = new MY_STRUCT(); m_tree_control.SetItemData(hChild,...

23
Coding is art
Эксперт JS
540 / 423 / 154
Регистрация: 04.09.2013
Сообщений: 1,066
02.04.2021, 17:04
скидывайте скрипты, так не разобраться.. + можете профайлинг настроить (можно найти видео в нете, как с ним отслеживать утечки).. и ещё, о каком количестве памяти идёт речь?
1
 Аватар для Fixer_84
1505 / 969 / 812
Регистрация: 30.04.2016
Сообщений: 3,337
02.04.2021, 17:37  [ТС]
muxahuk1214, здравствуйте! Спасибо за ваш ответ. Памяти RAM на сервере 4Гб, но было так, что рано или поздно она переполнялась. Я, конечно, настрою cron-задачу и смогу перезапустить проект и nodejs-скрипты, но, все-таки, хочется, чтобы не было такого, если это, конечно, возможно. Прикрепил скрипты. Очень буду благодарен за вашу помощь.
Вложения
Тип файла: zip info-planet.ru_nodejs_scripts.zip (14.6 Кб, 4 просмотров)
0
 Аватар для Fixer_84
1505 / 969 / 812
Регистрация: 30.04.2016
Сообщений: 3,337
02.04.2021, 17:40  [ТС]
Цитата Сообщение от muxahuk1214 Посмотреть сообщение
можете профайлинг настроить (можно найти видео в нете, как с ним отслеживать утечки)
Я в первом посте прикрепил статистику по отслеживаниям за вчера и сегодня. Они в архиве.
0
Coding is art
Эксперт JS
540 / 423 / 154
Регистрация: 04.09.2013
Сообщений: 1,066
02.04.2021, 18:11
Цитата Сообщение от Fixer_84 Посмотреть сообщение
Прикрепил скрипты
в самих скриптах нет ничего такого.. не понимаю конечно почему у вас для каждого пути своё приложение, можно ведь всё в 1 поместить...
Но, вообщем, там везде GC должен отрабатывать нормально, возможно кроме cron где вы используете.. или что-то в db модуле
1
 Аватар для Fixer_84
1505 / 969 / 812
Регистрация: 30.04.2016
Сообщений: 3,337
02.04.2021, 18:50  [ТС]
muxahuk1214,
Цитата Сообщение от muxahuk1214 Посмотреть сообщение
или что-то в db модуле
В db-модуле просто подключение к PostgreSQL через Pool:

JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
const { Pool } = require('pg');
 
const conn = new Pool({
    user: "*****",
    host: "*****",
    database: "*****",
    password: "*****",
    port: 5432
});
 
//Проверяем подключение к БД PostgreSQL
conn.connect((err) => {
    if (!err) {
        console.log("PostgreSQL connected successfully.");
    } else {
        console.log("PostgreSQL connection failed.");
    }
});
//Проверяем подключение к БД PostgreSQL
 
module.exports = conn;
Здесь действительно происходит выделение памяти. Ее тут очищать нужно?

Добавлено через 2 минуты
Цитата Сообщение от muxahuk1214 Посмотреть сообщение
не понимаю конечно почему у вас для каждого пути своё приложение, можно ведь всё в 1 поместить...
Я еще новичок в NodeJS. Попробую сделать как вы советуйте.

Добавлено через 1 минуту
Цитата Сообщение от muxahuk1214 Посмотреть сообщение
возможно кроме cron где вы используете
Нет, cron я начал использовать, когда заметил учечку через Linux atop.
0
Coding is art
Эксперт JS
540 / 423 / 154
Регистрация: 04.09.2013
Сообщений: 1,066
02.04.2021, 19:04
Цитата Сообщение от Fixer_84 Посмотреть сообщение
Ее тут очищать нужно?
нет..

Цитата Сообщение от Fixer_84 Посмотреть сообщение
Нет, cron я начал использовать, когда заметил учечку через Linux atop.
я не вижу ничего, что могло бы привести к утечке.. ну и в файлах у вас добавляется по пол мегабайта каждые полтара часа.. я всё же склоняюсь к тому, что это из-за скрона который держит файл в памятя и аппендит в него новую строку..

Вы пробовали делать запросы в момент когда логали данные? или аппликация просто на фоне работала?
1
 Аватар для Fixer_84
1505 / 969 / 812
Регистрация: 30.04.2016
Сообщений: 3,337
02.04.2021, 19:29  [ТС]
muxahuk1214, Я сейчас читаю про Pool и пишут, что его закрывать надо, так как возможна утечка памяти, связанная с БД. Попробую сейчас найти решение.

Цитата Сообщение от muxahuk1214 Посмотреть сообщение
что это из-за скрона который держит файл в памятя и аппендит в него новую строку..
Нет, я уже наблюдал увеличение памяти в скриптах через Linux atop. Утечки были еще до добавления cron. Я использовал cron, чтобы зафиксировать статистику по этим утечкам в текстовые файлы (так как в консоли было неудобно наблюдать за всем этим и приходилось постоянно прокручивать консоль).

Добавлено через 15 минут
Цитата Сообщение от muxahuk1214 Посмотреть сообщение
Вы пробовали делать запросы в момент когда логали данные? или аппликация просто на фоне работала?
Я открывал файлы и, возможно, это как-то и добавляло дополнительные утечки, но, все же, они были еще до использования cron.
0
 Аватар для Fixer_84
1505 / 969 / 812
Регистрация: 30.04.2016
Сообщений: 3,337
02.04.2021, 19:35  [ТС]
Цитата Сообщение от muxahuk1214 Посмотреть сообщение
ну и в файлах у вас добавляется по пол мегабайта каждые полтара часа
Растет вверх и если долго ждать, то используемая память, все-таки, может закончиться. Может быть, сам React требует столько памяти. Мне очень не хочется перезапускать приложение, ведь все должно быть ровно, ну плюс минус какие-то мегабайты, если я правильно все понимаю. Впервые испытываю подобные проблемы. Вот, что я уже зафиксировал (см. прикрепленный скриншот).
Миниатюры
Детектирование утечки памяти для скриптов на NodeJS  
0
 Аватар для Fixer_84
1505 / 969 / 812
Регистрация: 30.04.2016
Сообщений: 3,337
02.04.2021, 20:05  [ТС]
muxahuk1214, в режиме реального времени наблюдаю резкое снижение во всех скриптах (возврат к первоначальному значению) показателей использованной памяти (см. прикрепленный архив). Я добавил везде, где были запросы к БД conn.release() и судя по последним показателям проблема была именно в этом. Спасибо вам огромное, что помогли.
Вложения
Тип файла: zip nodejs_scripts_memory_info_after_closing_db_connection.zip (80.3 Кб, 3 просмотров)
0
Coding is art
Эксперт JS
540 / 423 / 154
Регистрация: 04.09.2013
Сообщений: 1,066
02.04.2021, 21:00
Цитата Сообщение от Fixer_84 Посмотреть сообщение
(см. прикрепленный скриншот).
скриншот не от этих файлов.. так-то, что бы сервить react приложение - его нужно сбилдить сначала, а потом через nginx отдавать... "react-script start" не предназначен для продакшена, только для разработки.. ищите "how to build and run react application"... https://create-react-app.dev/docs/deployment/
1
 Аватар для Fixer_84
1505 / 969 / 812
Регистрация: 30.04.2016
Сообщений: 3,337
02.04.2021, 21:13  [ТС]
Цитата Сообщение от Fixer_84 Посмотреть сообщение
не понимаю конечно почему у вас для каждого пути своё приложение, можно ведь всё в 1 поместить...
Вы не могли бы более подробно объяснить, что имеется ввиду? Что мне нужно сделать?
0
Coding is art
Эксперт JS
540 / 423 / 154
Регистрация: 04.09.2013
Сообщений: 1,066
02.04.2021, 21:21
Цитата Сообщение от Fixer_84 Посмотреть сообщение
Вы не могли бы более подробно объяснить, что имеется ввиду? Что мне нужно сделать?
условно, 1 скрипт, в котором задаются все пути..

JavaScript
1
2
3
4
5
const app = express();
 
app.post('/something1', (...)...);
 
app.post('/something2', (...)...);
а не разбивать каждый app.post в отдельный файл...
1
 Аватар для Fixer_84
1505 / 969 / 812
Регистрация: 30.04.2016
Сообщений: 3,337
03.04.2021, 13:38  [ТС]
muxahuk1214, все-таки не удалось исправить утечки в скиптах. Мне показалось, что в режиме реального времени все пошло на спад после conn.release() - оказалось это был просто перезапуск скриптов. Я никак не могу понять почему происходят эти утечки. Наверное, придется вернуться к PHP у которого таких проблем не наблюдалось.

P.S. Неужели никто не сталкивался с подобными проблемами?
Цитата Сообщение от muxahuk1214 Посмотреть сообщение
"react-script start" не предназначен для продакшена, только для разработки
Я слышал, что в режиме development (как сейчас, - не build) ReactJS может показывать неверную статистику. Это правда? Нужно ли перейти к build? Говорят это как-то оптимизирует приложение. Но будут ли устранены утечки в скриптах?

Добавлено через 11 минут
muxahuk1214, но все-таки, текут именно те скрипты, в которых я делаю запросы к БД. Значит, все-таки, что-то не так там?

Добавлено через 22 минуты
muxahuk1214, вообщем, неясно. То есть скачки без БД, то нет. Ничего не понятно. Где утечка и почему...
0
Coding is art
Эксперт JS
540 / 423 / 154
Регистрация: 04.09.2013
Сообщений: 1,066
03.04.2021, 13:46
Цитата Сообщение от Fixer_84 Посмотреть сообщение
То есть скачки без БД, то нет. Ничего не понятно. Где утечка и почему...
в скриптах у вас нет утечек.. вы явно что-то не то или не так смотрите..
утечка памяти обычно берётся из скриптов в которых в функции сохраняют что-то в глобальный стейт и из-за этого память не может автоматически очиститься.. у вас в тех скриптах которые вы прислали такого нет...
1
 Аватар для Fixer_84
1505 / 969 / 812
Регистрация: 30.04.2016
Сообщений: 3,337
03.04.2021, 14:42  [ТС]
muxahuk1214, из-за чего еще память в nodejs-скриптах увеличиваться может? Ведь видно в файлой статистике, что используемая память постоянно растет. Это может как-то зависеть от используемого сервера?

Добавлено через 5 минут
muxahuk1214, как часто GС вообще приходит, вы знаете?
0
Coding is art
Эксперт JS
540 / 423 / 154
Регистрация: 04.09.2013
Сообщений: 1,066
03.04.2021, 14:47
Вы понимаете что такое память?.. в файловой статистике видно что она увиличивается +- на 0.5 мегабайта в час... тупо из-за футпринта того же экспресса.. это нормально.. Если бы у вас память увиличиволась на 100 мегабайт каждый час - это было бы memory leak - то, что там меньше 1 мегабайта - это нормально... нет у вас memory leak...

Добавлено через 46 секунд
Цитата Сообщение от Fixer_84 Посмотреть сообщение
как часто GС вообще приходит, вы знаете?
автоматически, как только посчитает, что все референсы на какой-то из объектов больше не используются
1
 Аватар для Fixer_84
1505 / 969 / 812
Регистрация: 30.04.2016
Сообщений: 3,337
03.04.2021, 14:50  [ТС]
muxahuk1214,
Цитата Сообщение от muxahuk1214 Посмотреть сообщение
нет у вас memory leak
Так а что делать, когда она будет полностью израсходована? Просто перезапускать вручную? Это нормальная практика?
0
Coding is art
Эксперт JS
540 / 423 / 154
Регистрация: 04.09.2013
Сообщений: 1,066
03.04.2021, 14:58
Цитата Сообщение от Fixer_84 Посмотреть сообщение
Так а что делать, когда она будет полностью израсходована? Просто перезапускать вручную? Это нормальная практика?
у меня на практике за лет 6 такого ни разу не было, даже когда я делал игравой сервер.. там на 1 нодовский процесс выделяется 2 гигабайта памяти и когда она закончится (что у меня ни разу не случалось) - GC отработает.. а если привысит 2 гб - я хз... по идеи он будет чистить память и работать очень медленно.. но это случиться должно не раньше чем через дней 166 дней... исходя из вашей статистики

Добавлено через 2 минуты
а если не хотите сами перезагружать - можете подключить pm2 и задать ему авто перезагрузку каждый день или неделю или месяц...
1
 Аватар для Fixer_84
1505 / 969 / 812
Регистрация: 30.04.2016
Сообщений: 3,337
03.04.2021, 15:00  [ТС]
muxahuk1214, muxahuk1214, вообщем, я еще понаблюдаю несколько дней, вам отпишусь. Там в некоторых скриптах растет медленно, но в первом, по новым данным увеличение но 6Мб за пол часа - это все таки не мало.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
03.04.2021, 15:00
Помогаю со студенческими работами здесь

Утечки памяти без выделения памяти?
Человек использует _CrtDumpMemoryLeaks() для отлова утечек, и обратился ко мне в сязи с тем, что есть утечка, но памяти он никому не...

утечки памяти
есть обертка над неуправляемым кодом. если вызвать метод 1000 раз то отжирается 500 метров памяти. подскажите как быть? сделал через...

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

Утечки памяти
Здравствуйте, уважаемые господа. Недавно заметил через диспетчер задач, что в моей программе присутствуют утечки памяти. Кол-во...

Утечки памяти
Не могу найти и "убить" в программе СЕМЬ утечек памяти. Уже впору вешаться. Архив с полным проектом прилагается. За здравие свечку...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! в-строка - входное арифметическое выражение в инфиксной(обычной). . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru