Tcp сервер не принимает соединение через определенное время
Я реализую tcp-сервер в nodejs, который принимает подключения от устройств GPS, и код отслеживается навсегда. Код не падает, но по истечении определенного времени сервер не принимает новые подключения. После перезапуска сервера он снова работает нормально. Я понятия не имею, что не так. ОС Ubuntu 14.04. Любая помощь приветствуется.
Редактировать:
Время, после которого сервер не принимает подключения, составляет около 6 дней.
net.createServer(function(sock){
sock.on('data',function(data){
//converting data to ascii.
//parsing data,doing calculation
//fetching user_id from redis.(i will get device id from gps device, there are user_id associated to device ids).
//posting to api using rest-client
});
});
Изменить 2: Есть ли что-нибудь с размером виртуальной памяти. Размер виртуальной памяти составляет около 940 МБ.?
1 ответ
Я работал на основе однотипных систем, поэтому этот вопрос вызывает у меня некоторую ностальгию. Ваша проблема - дескриптор файла:
В Unix и связанных с ним компьютерных операционных системах дескриптор файла (FD, реже fildes) является абстрактным индикатором (дескриптором), используемым для доступа к файлу или другому ресурсу ввода / вывода, такому как канал или сетевое соединение.
Затем вам нужно увеличить лимит файловых дескрипторов на вашем сервере Linux следующим образом:
Отредактируйте файл параметров ядра /etc/sysctl.conf. Добавьте в него строку fs.file-max=[новое значение].
vim /etc/sysctl.conf
fs.file-max = 500000
Примените изменения:
sysctl -p
Чтобы изменить настройку ulimit, отредактируйте файл /etc/security/limits.conf и установите жесткие и мягкие ограничения.
vi /etc/security/limits.conf
* soft nofile 90000
* hard nofile 90000
Примените изменения:
reboot
Теперь протестируйте новые настройки системы, используя следующие команды:
#ulimit -a
open files (-n) 90000
Проверьте текущий предел дескриптора открытого файла:
# more /proc/sys/fs/file-max
500000
Совет 1: чтобы узнать, сколько файловых дескрипторов в настоящее время используется
# more /proc/sys/fs/file-nr
Совет 2: добавьте сопряжение, чтобы перезапускать сервер сокетов (приложение Node.js) каждую неделю. Надеюсь, поможет.