Node.js AWS-SDK SQS内存泄漏

时间:2016-06-28 07:13:31

标签: node.js memory-leaks google-cloud-platform amazon-sqs

我在Node.js中写了一个websocket模块。在Debian Jessie下在Google云中的VM上运行它。它通过PM2作为服务运行。 该服务获取请求,发送响应并将一些数据发送到AWS 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在大约4-5分钟内膨胀到〜900mb。然后我杀死并重新生成该过程以保持响应。 如果我对此进行评论,内存泄漏将停止,在相同条件下服务将保持在60-70 MB RAM左右。

我认为SDK很好,我的实现有问题。没有找到关于这个问题的任何特定信息。

有人经历过这个吗?

1 个答案:

答案 0 :(得分:4)

像往常一样,我会在几分钟后找到衣服: 加上这个:

  

要求(' http')。globalAgent.maxSockets =   require(' https')。globalAgent.maxSockets = 100

在第一行,在其余代码之前。这会强制节点重新使用已使用的套接字。

事实证明maxSockets的默认值是无限制的,所以它只是不断打开新套接字而不是重用旧套接字。

根据mhart here

的建议