gpt4 book ai didi

Node.js AWS-SDK SQS 内存泄漏

转载 作者:搜寻专家 更新时间:2023-11-01 00:30:20 24 4
gpt4 key购买 nike

我在 Node.js 中编写了一个 websocket 模块。在 Google 云中的虚拟机上的 Debian Jessie 下运行它。它通过 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 没问题,但我的实现有问题。未找到有关此问题的任何特定信息。

有人遇到过吗?

最佳答案

像往常一样,几分钟后我找到了答案:添加这个:

require('http').globalAgent.maxSockets = require('https').globalAgent.maxSockets = 100

在第一行,在其余代码之前。这会强制 Node 重新散列使用过的套接字。

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

根据 mhart 建议 here

关于Node.js AWS-SDK SQS 内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38069426/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com