Node Server падает через несколько часов

Я использую Nodemon с модулем Forever на сервере Ubuntu.

Я использую эту команду для запуска моего Node Server:

forever start -c nodemon app.js  --exitcrash

Он отлично работает в течение нескольких часов (около 48 часов), но после этого мой сервер перестает работать с этими ошибками:

Error: getaddrinfo EMFILE   
TypeError: Cannot call method 'indexOf' of undefined
Error: Handshake inactivity timeout

Эти ошибки вызваны превышением лимита открытых файлов/сокетов.

Теперь мой вопрос:

Могу ли я использовать -m (который устанавливает неограниченное количество в моей операционной системе):

max memnory size   (kbytes, -m) unlimited

Должен ли я использовать указанную выше команду с -m? Есть ли недостатки?

Или есть другое эффективное решение для исправления сбоя сервера?


person Irtiza shahid    schedule 09.04.2015    source источник
comment
Как насчет закрытия открытых файлов/сокетов?   -  person Aleksandr M    schedule 09.04.2015
comment
проверьте эти ответы stackoverflow.com/questions/410616/ serverfault.com/questions/48717/   -  person Edgar Zakaryan    schedule 09.04.2015
comment
@AleksandrM У меня большое количество пользователей на моем сайте, я проверил, что сервер узла сам закрывает сокеты. socket.on('disconnect', function () { var socketIndex = connectionArray.indexOf( socket ); console.log('socket = ' + socketIndex + 'disconnected'); if (socketIndex ›= 0) { connectionArray.splice( socketIndex, 1);} console.log(socketIndex + 'Количество подключений:' + connectionArray.length); }); журнал консоли показывает количество открытых в настоящее время сокетов.   -  person Irtiza shahid    schedule 09.04.2015
comment
@EdgarZakaryan, есть ли недостаток, если я использую команду # ulimit -n 99999, чтобы увеличить ограничение на количество файлов на моем сервере?   -  person Irtiza shahid    schedule 09.04.2015
comment
@Irtizashahid это может исчерпать системные ресурсы   -  person Edgar Zakaryan    schedule 09.04.2015
comment
@EdgarZakaryan, что произойдет, если я использую команду forever start -c nodemon app.js --exitcrash с -m вместо -C? я могу использовать это? есть ли недостаток? потому что максимальный размер памяти уже установлен на неограниченный на моем сервере   -  person Irtiza shahid    schedule 09.04.2015


Ответы (2)


Если у вас большое количество пользователей, скорее всего, вы используете максимальное количество запросов в очереди для прослушивания сокета. Если вы уверены, что ваш сервер справится с нагрузкой, вы можете увеличить значение со 128 по умолчанию до 1024.

И да, увеличьте ulimit, чтобы система могла справляться с большей нагрузкой, но не устанавливайте неограниченный, просто проверьте, чего достаточно для текущей нагрузки.

Также пройдите через это Увеличение максимального количества tcp/ip соединения в linux также получат полезную информацию

person Edgar Zakaryan    schedule 09.04.2015
comment
мой текущий лимит открытых файлов составляет 2048 открытых файлов (-n) 2048 - person Irtiza shahid; 09.04.2015
comment
@Irtizashahid, ты можешь удвоить это - person Edgar Zakaryan; 09.04.2015
comment
я увеличил значение (-n) открытых значений. Мне нужно подождать минимум два дня, чтобы протестировать сервер. У вас есть идеи, что произойдет, если я изменю -c на -m в моей команде Linux? - person Irtiza shahid; 10.04.2015
comment
@Irtizashahid, ты хочешь передать -m навсегда? -m MAX Запускать только указанный скрипт MAX раз - person Edgar Zakaryan; 10.04.2015
comment
все та же проблема :( сервер узла перестает работать. Я увеличил значение открытых файлов (-n). - person Irtiza shahid; 11.04.2015
comment
@Irtizashahid, если ваш сервер выходит из строя более 2 дней, возможно, у вас есть утечки, возможно, вы не закрываете открытые соединения - person Edgar Zakaryan; 11.04.2015
comment
Уважаемый, я реализовал событие «отключение» на моем сервере узла, в консоли отображаются только открытые сокеты, вы можете увидеть мой код отключения...... socket.on('disconnect', function () { var socketIndex = connectionArray.indexOf ( socket ); console.log('socket = ' + socketIndex + 'disconnected'); if (socketIndex ›= 0) {connectionsArray.splice( socketIndex, 1); } console.log(socketIndex + 'Количество подключений:' + массив соединений.длина);}); - person Irtiza shahid; 11.04.2015
comment
@Irtizashahid, можете ли вы проверить, включено ли пульсирование сокета, оно должно быть включено, поэтому, если в соединении нет активности, оно автоматически закрывается - person Edgar Zakaryan; 12.04.2015

Это, вероятно, не идеальный ответ, но использование forever-service с nodemon гарантирует, что ваш сервер перезапустится после него. сбои.

Это команда, которая сработала для меня. Я включаю его, потому что заставить навсегда-сервис и нодмон хорошо работать может быть сложно.

Он делает следующее: каждый раз, когда файл json или raml в папке приложений dist/assets изменяется, подождите 10 секунд, а затем перезапустите приложение node (скрипт server.js):

$ forever-service install raml --script server.js -f " -c nodemon" -o " --delay 10 --watch dist/assets -e json,raml --exitcrash" -e "PATH=/usr/local/bin:$PATH"

Тогда я могу запустить:

$ service raml start|stop|restart|status

Я также могу запустить службу при перезагрузке сервера с помощью утилиты chkconfig:

$ chkconfig --add raml
$ chkconfig raml on
person Julia Anne Jacobs    schedule 15.04.2015
comment
Проблема на моем сервере превышена, если количество сокетов на моем сервере увеличивается. Можно ли решить ее, если я использую службу raml или chkconfig? я понятия не имею о службе rmal и chkconfig - person Irtiza shahid; 16.04.2015
comment
Прошу прощения за путаницу. Это всего лишь способ автоматического перезапуска сервера при его сбое. Это не устраняет вашу первоначальную ошибку. Остальная информация включена, чтобы показать вам, как создать службу, поскольку это может быть сложно. - person Julia Anne Jacobs; 17.04.2015