Вот мой пример кода:
var http = require('http');
var options1 = {
host: 'www.google.com',
port: 80,
path: '/',
method: 'GET'
};
http.createServer(function (req, res) {
var start = new Date();
var myCounter = req.query['myCounter'] || 0;
var isSent = false;
http.request(options1, function(response) {
response.setEncoding('utf8');
response.on('data', function (chunk) {
var end = new Date();
console.log(myCounter + ' BODY: ' + chunk + " time: " + (end-start) + " Request start time: " + start.getTime());
if (! isSent) {
isSent = true;
res.writeHead(200, {'Content-Type': 'application/xml'});
res.end(chunk);
}
});
}).end();
}).listen(3013);
console.log('Server running at port 3013');
Я обнаружил, что если я подключусь к другому серверу (Google или любому другому), ответ будет все медленнее и медленнее до нескольких секунд. . Этого не произойдет, если я подключусь к другому серверу node.js в той же сети.
Я использую JMeter для тестирования. 50 одновременных операций в секунду с 1000 циклом.
Я понятия не имею, в чем проблема .. .
=========================
Дальнейшее расследование:
Я запускаю тот же сценарий в Rackspace, а также в EC2. для тестирования. И скрипт будет использовать http.request для подключения к: Google, Facebook, а также моему другому скрипту, который просто выводит данные (например, hello world), которые размещены в другом экземпляре EC2.
Инструмент тестирования, который я просто jMeter на моем рабочем столе.
Тест перед node.js: jMeter -> Результат Google: быстро и последовательно. jMeter -> Facebook результат: быстро и стабильно. jMeter -> My Simple Output Script Результат: быстро и согласованно.
Затем я делаю 50 параллельных потоков в секунду со 100 циклами, тестируя свои Rackspace nodejs, а затем EC2 node.js, у которого такая же проблема производительности
jMeter -> node.js -> Google Результат: от 50 мс до 2000 мс при 200 запросах.
jMeter -> node.js -> Facebook Результат: от 200 мс до 3000 мс после 200 запросов.
jMeter -> node.js -> My Simple Output Script Результат: от 100 мс до 1000 мс после 200 запросов.
Первые 10-20 запросов выполняются быстро, затем начинают замедляться.
Затем, когда я перехожу на 10 параллельных потоков, все начинает меняться .. Ответ очень последовательный, без замедления.
Что-то, связанное с # параллельных потоков, которые Node.js (http.request) может обрабатывать .
------------ Подробнее --------------
Сегодня я сделал еще один тест, и вот он: Я использовал http.Agent и увеличил максимальное количество сокетов. Однако интересно то, что на одном тестовом сервере (EC2) он значительно улучшается и больше не замедляется. Однако другой сервер (место в стойке) только немного улучшается. Он по-прежнему показывает замедление. Я даже установил "Connection: close" в заголовке запроса, это улучшает только 100 мс.
если http.request использует пул соединений, как его увеличить?
на обоих серверах, если я использую «ulimit -a», номер открытого файла будет 1024.
------ ------- ** БОЛЬШЕ И БОЛЬШЕ ** -------------------
Кажется, даже я установил maxSockets на чем выше число, он работает только с некоторым пределом. Кажется, существует внутреннее или зависящее от ОС ограничение сокета. Однако поднять его?
------------- ** ПОСЛЕ РАСШИРЕННОГО ТЕСТИРОВАНИЯ ** ---------------
Прочитав много сообщений, я обнаружил :
цитируется из: https://github.com/joyent/node/issues/877
1) Если я установил заголовки с connection = 'keep-alive', производительность будет хорошей и может перейти до maxSocket = 1024 (это моя настройка Linux).
var options1 = {
host: 'www.google.com',
port: 80,
path: '/',
method: 'GET',
**headers: {
'Connection':'keep-alive'
}**
};
Если бы я установил «Соединение»: «закрыть», время отклика было бы в 100 раз медленнее.
Здесь произошли забавные вещи:
1) в EC2, когда я впервые тестирую Connection: keep-alive, это займет около 20-30 мс. Затем, если я перейду на Connection: Close ИЛИ установлю Agent: false, время отклика снизится до 300 мс. WIHTOUT перезапускает сервер, если я снова перейду на Connection: keep-alive, время отклика замедлится еще больше до 4000 мс. Либо я должен перезапустить сервер, либо подождать некоторое время, чтобы вернуть мой отклик со скоростью освещения 20-30 мс.
2) Если я запустил его с агентом: false, сначала время отклика снизится до 300 мс. Но затем он снова станет быстрее и снова станет «нормальным».
Я предполагаю, что пул соединений все еще действует, даже если вы установили agent: false. Однако, если вы сохраните соединение: keep-alive, то это точно будет быстро. только не переключайте его.
Обновление от 25 июля 2011 г.
Я попробовал последнюю версию node.js V0.4.9 с исправлением http.js и https.js с сайта https://github.com / mikeal / node / tree / http2
производительность намного лучше и стабильна.