我在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很好,我的实现有问题。没有找到关于这个问题的任何特定信息。
有人经历过这个吗?
答案 0 :(得分:4)
像往常一样,我会在几分钟后找到衣服: 加上这个:
要求(' http')。globalAgent.maxSockets = require(' https')。globalAgent.maxSockets = 100
在第一行,在其余代码之前。这会强制节点重新使用已使用的套接字。
事实证明maxSockets的默认值是无限制的,所以它只是不断打开新套接字而不是重用旧套接字。
根据mhart
here