#node.js #socket.io #pm2
#node.js #socket.io #pm2
Вопрос:
У нас есть чат, встроенный в nodejs/SocketIO, который хорошо работает. мы используем pm2 для запуска приложения. Наш мониторинг показывает, что использование памяти увеличивается медленно и намного больше во время обмена чатами. Вчера у нас было около 1500 пользователей в чате, и внезапно память заняла около 200 МБ… и так и осталась. Когда пользователи в чате покинули его, мы просто получили небольшое снижение использования.
socketio 4.0.1 версия узла 10.24.0 pm2 версия 3.5.0 rhel 7
Память никогда не освобождалась ночью, пока мы не начали «чат перезагрузки pm2».
Я попытался проверить использование памяти : PID ПОЛЬЗОВАТЕЛЯ %MEM КОМАНДА 5195 корневой узел 2.4 /appli/chatvideodiff/server/server.js 25836 root 0.3 PM2 v3.5.0: Демон Бога (/root/.pm2)
общая площадь узла : 1285928 тыс. кв. м Общая площадь : 913644 тыс.
и запустил pmap, чтобы получить больше информации.
Не было никаких проблем, но мне было бы интересно узнать, что вызывает «утечку» памяти, так что, если у вас есть идея.
Спасибо, Нико
Комментарии:
1. Вы должны удалить переменные, которые вы больше не используете, это не проблема node.js у него сильный сборщик мусора. Это проблема вашей программы, избегайте циклических ссылок, если возможно, сборщик мусора не смог их найти (мог бы найти, но не уверен, особенно когда циклические ссылки создают большие и сложные графики
2. спасибо @tommaso за эту информацию, у меня есть несколько строк с «этим». и, читая некоторые статьи, я вижу, что они являются круглыми ссылками. Я читал также, что я могу попробовать добавить «использовать строгий»; поверх кода, о чем вы думаете ? Спасибо
3. трудно сказать, но может быть, сборщик мусора не удаляет объекты «или, по крайней мере, не пытается найти эти ссылки», пока не освободится место в памяти. node.js используйте сборщик мусора поколений, чтобы объекты, которые не умирают молодыми, проверялись всегда меньше раз. если ваш чат остается активным в течение очень долгого времени, сборщик мусора помещает эти объекты в зарезервированную область, и эта область будет проверяться меньше раз «как последний ресурс перед выбросом ошибки памяти». чем больше существует ссылка на объект, тем больше он будет их игнорировать. Или это может быть ошибка с вашим кодом, я не знаю, у меня нет вашей трески
Ответ №1:
Это проблема, с которой я тоже сталкиваюсь. Я придумал решение:
require('expose-gc')
модуль npm.
Nodejs имеет встроенный метод сбора мусора..
global.gc();
Этот подход удаляет все ненужные объекты из вашей памяти. В результате, пожалуйста, запустите код на setInterval timelimit ваш лимит времени для запуска кода.
setInterval(function(){ global.gc(); },10000);
Очистите оперативную память с помощью этой процедуры. пожалуйста, требуйте модуль npm expose-gc.