Node.js Http.request замедляется под нагрузкой тестирование. Я что-то делаю не так?

Вот мой пример кода:

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

производительность намного лучше и стабильна.

9
задан murvinlai 25 July 2011 в 19:05
поделиться