Как проверить количество открытых соединений в node.js?
У меня есть машина под управлением node.js (v0.1.32) с tcp-сервером (tcp.createServer) и http-сервером (http.createServer). HTTP-сервер подвергается воздействию длинных запросов на опрос (продолжительностью 50 секунд каждый) от приложения на основе кометы на порту 80. И для этого используются соединения tcp-сокета на порту 8080 от приложения iphone.
Было обнаружено, что сервер некоторое время не мог обрабатывать больше соединений (особенно соединений tcp, в то время как соединения http выглядели нормально!!??) и работал нормально только после перезагрузки.
Для нагрузочного тестирования соединений я создал tcp-сервер и породил 2000 запросов и выяснил, что соединения начинают обрываться после достижения максимального ограничения дескриптора файла на компьютере (по умолчанию 1024). Что на самом деле очень мало.
Итак, начинающий вопрос: как мне масштабировать мое приложение, чтобы обрабатывать большее количество соединений в node.js, и как я могу решить эту проблему.
Есть ли способ узнать, сколько активных соединений существует в данный момент?
Спасибо Шариф
2 ответа
Привет, Джои! Я искал решение для Unix, которое помогло бы мне определить, сколько открытых соединений в данный момент в любой момент на моей машине. Причина была в том, что мой сервер не смог обработать запросы после определенного количества соединений. И решил, что моя машина может обрабатывать только 1024 открытых соединения одновременно, т.е. значение дескриптора файла ulimit, которое по умолчанию равно 1024. Я изменил это значение, установив ulimit -n, который соответствует моим требованиям.
Таким образом, чтобы проверить открытые соединения, я использовал lsof, который дает мне список открытых файлов и вычисляет, сколько соединений открыто через каждый порт, который я использовал.
Вы можете получить количество подключений, используя следующее:
var server = http.createServer(app);
server.getConnections(function(error, count) {
console.log(count);
});
Используя это, вы продолжаете проверять соединение и, когда оно пересекает пороговое значение, закрываете предыдущие соединения. Надеюсь, это поможет.
Я не знаю, есть ли встроенный способ получить количество активных соединений с Node, но это довольно легко подстроить.
Для моего приложения Node в стиле кометы я сохраняю объект, к которому я добавляю соединения, как свойство. Каждые X секунд я перебираю этот объект и смотрю, есть ли какие-либо соединения, которые должны быть закрыты (в вашем случае, что-либо, превышающее ваш 50-секундный лимит).
Когда вы закрываете соединение, просто удалите это свойство из объекта соединения. Затем вы можете увидеть, сколько соединений открыто в любое время с Object.size(connections)