Я пытаюсь измерить пропускную способность простой программы Node.js с бэкэндом CouchDB, используя cradle в качестве драйвера БД. Когда я помещаю нагрузку на программу, я получаю следующую ошибку в течение 30 секунд:
EADDRINUSE, адрес уже используется
Вот моя программа:
var http = require ('http'),
url = require('url'),
cradle = require('cradle'),
c = new(cradle.Connection)('127.0.0.1',5984,{cache: false, raw: false}),
db = c.database('testdb'),
port=8081;
http.createServer(function(req,res) {
var id = url.parse(req.url).pathname.substring(1);
db.get(id,function(err, doc) {
res.writeHead(200,{'Content-Type': 'application/json'});
res.write(JSON.stringify(doc));
res.end();
});
}).listen(port);
console.log("Server listening on port "+port);
Я использую скрипт JMeter с 50 одновременными пользователями. Среднее время ответа составляет 120 мс, средний размер возвращаемого документа 3 КБ.
Как видите, я установил кеширование Cradle на false. Чтобы исследовать, я посмотрел на количество ожидающих сокетов: оно увеличивается примерно до 4000, и в этот момент происходит сбой (netstat | grep WAIT | wc -l)
Чтобы проверить другие параметры, я установил кеширование на true. В этом случае программа не аварийно завершает работу, но число ожидающих сокетов увеличивается с течением времени почти до 10000.
Я также написал ту же программу (без асинхронной части), что и сервлет Java, и она работает нормально, а число ожидающих сокетов не превышает 20.
У меня вопрос: почему я получаю сообщение об ошибке «EADDRINUSE, Адрес уже используется»? Почему так много ожидающих сокетов?
P.S .: Это фрагмент из вывода netstat | grep WAIT:
tcp4 0 0 localhost.5984 localhost.58926 TIME_WAIT
tcp4 0 0 localhost.5984 localhost.58925 TIME_WAIT
tcp4 0 0 localhost.58924 localhost.5984 TIME_WAIT
tcp4 0 0 localhost.58922 localhost.5984 TIME_WAIT
tcp4 0 0 localhost.5984 localhost.58923 TIME_WAIT