2016-06-28 3 views
1

Я написал веб-модуль в Node.js. Запуск его в Debian Jessie на виртуальной машине в облаке Google. Он работает как услуга через PM2. Служба получает запрос, отправляет ответ, а также отправляет некоторые данные в службу AWS SQS (службу запросов).Уязвимость памяти Node.js AWS-SDK SQS

У меня есть пользовательский класс для отправки сообщений в очереди, и она имеет место утечка памяти в нем:

var AWS = require("aws-sdk"); 
var logger = require("./Logger"); 

AWS.config.loadFromPath("/home/admin/.aws/cred.json"); 

function QueueService() { 
    this.sqs = new AWS.SQS(); 
    this.queue = "https://sqs.eu-central-1.amazonaws.com/4864251684/MyQueue"; 
} 

QueueService.prototype.sendItemToStatistics = function (message, reqJson, wsConnection, queue) { 
    try { 
     logger.log("silly", "QueueUrl", queue) 

     this.sqs.sendMessage({ 
      MessageBody: message, 
      QueueUrl: queue, 
      DelaySeconds: 0 
     }, 
     function (err, data) { 
      if (err) logger.log("error", "Error, while sending report to statistics:", err.stack) 
      else logger.log("debug", "Submitted to SQS") 
     }); 

    } catch (e) { 
     logger.log("error", "Failed to send a statistics report, stacktrace:", e.stack) 
    } 
} 

module.exports = new QueueService(); 

Это проблематичная часть - отправка элементов в очереди:

this.sqs.sendMessage({ 
       MessageBody: message, 
       QueueUrl: queue, 
       DelaySeconds: 0 
      }, 
      function (err, data) { 
       if (err) logger.log("error", "Error, while sending report to statistics:", err.stack) 
       else logger.log("debug", "Submitted to SQS") 
      }); 

С ~ 100 RPS служебная RAM раздувается до ~ 900 мб примерно через 4-5 минут. Затем я убиваю и воспитываю процесс, чтобы он реагировал. Если я прокомментирую это, утечка памяти прекратится, то при тех же условиях обслуживание останется на уровне 60-70 мб оперативной памяти.

Я предполагаю, что SDK в порядке и что-то не так с моей реализацией. Не нашел никакой конкретной информации по этой проблеме.

Кто-нибудь испытал это?

ответ

4

Как обычно, я нахожу answear минут позже: Добавить это:

требуют ('HTTP') globalAgent.maxSockets = требуется ('HTTPS') globalAgent.maxSockets = 100

..

В первой строке, перед остальной частью кода. Это заставляет узел перефразировать используемые сокеты.

Оказывается, значение по умолчанию для maxSockets не ограничено, поэтому он просто открывает новые сокеты вместо повторного использования старых.

Как предложено mharthere