Node.js + Socket.io + Redis 应用程序通过 PM2,内存占用较大

2023-12-10

我对 node.js 和 socket.io 都很陌生,但我正在尝试构建一个简单的服务,用于侦听 Redis 通知(由 PHP 应用程序提供),并将它们广播给当前登录、连接到套接字的所有用户.io 房间,例如'站点名称:用户:用户 ID'。

我可以正常工作,但 Node 应用程序的内存占用很快变得越来越大,很快就从 100mb 增加到 200+mb,大约有 100 个用户在线并积极浏览,我想知道我是否在这里设置有问题。

PM2 正在处理节点应用程序,并且 nginx 设置为反向代理。

服务器端:

var app = require('express')();
var server = require('http').Server(app);
var io = require('socket.io')(server);
var redis = require('redis');
var redisClient = redis.createClient();
var allClients = [];

server.listen(8890);

io.sockets.on('connection', function (socket) {
    allClients.push(socket);

    socket.on('subscribe', function(data) {
        console.log('Joining room', data.room);
        socket.join(data.room);
        redisClient.subscribe(data.room);
    })

    socket.on('disconnect', function() {
        console.log('Disconnect');
        var i = allClients.indexOf(socket);
        delete allClients[i];
    });

});

// Watch for connection errors and log
redisClient.on('error', function (err) {
    console.log('Error event - ' + redisClient.host + ':' + redisClient.port + ' - ' + err);
});

redisClient.on('message', function(room, message) {
    console.log('New message: ' + message + '. In room: ' + room);
    io.sockets.in(room).emit('message', message);
});

客户端:

// connect to socket
socket = io.connect('http://localhost:8890');

// subscribe to user's room once connected
socket.on('connect', function(data){
    socket.emit('subscribe', { room: site_name + ':user:' + user_id });
});

// show messages from user's "room" via redis notifications
socket.on('message', function (response) {
    var json = new Hash(JSON.decode(response, true) || {});
    roar.alert(json.title, json.message, { link: json.link });
});

看起来这应该是一个非常精简的应用程序,不是吗?一个简单的 Node.js 应用程序的正常内存占用是多少?

服务器以 41mb 启动,但即使没有任何人连接到它,内存也会缓慢增加,大约每分钟 1mb。一旦我开始连接用户,它就会迅速膨胀到 200+mb,直到我将其杀死。

我不清楚当用户连接和断开连接时如何最好地处理 redisClient 和套接字连接,我认为这可能是问题所在。但看到它在闲置时爬行是令人不安的。

  • PM2 v0.15.7
  • 节点 v0.12.7
  • 套接字.io v1.3.7
  • 快递 v4.13.3
  • nginx v1.6.2

非常感谢任何帮助。


我有一个类似的设置,尽管它尚未发布并且尚未进行压力测试......但这里有一个想法给您:

使用redis模块进行socketio(是否比redisClient更好)。它使用不同的客户端进行发布和订阅。子客户端使用 detector_buffers。

var redisModule = require('socket.io-redis');
var redisAdapter= redisModule({
      host: redisClient.options.host
    , port: redisClient.options.port
    , pubClient: redisClient
    //, subClient: ... separate client that uses detect_buffers
});
io.adapter(redisAdapter);

然后订阅/断开连接看起来像这样:

socket.on('subscribe', function(room) {
    socket.join(room);
});
socket.on('disconnect', function() {
    console.log('user disconnected');
});

我还多次读到,在某一点上,socketio 并不是最好的,而是使用 sockjs。不知道情况是否仍然如此。

而且……自从我意识到已经过去两个多月了。您是否找到了可以减少内存占用的方法?

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Node.js + Socket.io + Redis 应用程序通过 PM2,内存占用较大 的相关文章

  • 为什么有时 npm install 在 mac 上不起作用?

    我在运行命令时创建了nodejs项目npm 安装它因一些错误而失败 同一个项目正在进行中ubuntu系统但是当我克隆这个代码时mac系统并尝试运行 npm install 它失败并出现一些错误 我认为 scrypt 模块有问题 但我不知道确
  • Browserify 的自定义依赖项名称不起作用

    我正在尝试让 browserify 的自定义依赖项名称与内存流一起使用 我使用内存流的原因是因为此代码注定要在 AWS Lambda 内部运行 该 AWS Lambda 将接收多个 文件 作为输入 并且 Lambda 无法通过文件系统使用该
  • 在 Node.js 中查找默认网关 IP 的最佳方法是什么?

    如今在 Node js 中查找默认网关 IP 地址的最佳方法是什么 os networkInterfaces 不提供此信息 想到的唯一想法是解析stdout子流程的route n Kernel IP routing table Destin
  • 如何达到AWS Lambda并发执行限制?

    UPDATE 下面的原始测试代码基本上是正确的 但在 NodeJS 中 各种 AWS 服务的设置应该根据以下内容略有不同 SDK link https docs aws amazon com sdk for javascript v2 de
  • linux-x64 二进制文件无法在 linuxmusl-x64 平台上使用错误

    我正在安装Sharp用于使用 package json 的 Nodejs 项目的 docker 映像上的映像压缩包 当我创建容器时 我收到有关 Sharp 包的以下错误 app node modules sharp lib libvips
  • 如何在node.js中同步读取文件或Stream?

    请不要讲授关于我应该如何异步完成所有事情的讲座 有时我想以简单明显的方式做事 这样我就可以继续其他工作 由于某种原因 以下代码不起作用 它与我在 a 上找到的代码匹配最近的问题 https stackoverflow com questio
  • IE 中未定义“代理”

    我通过 React Node 构建了一个 Excel 插件Umi https umijs org 我们已经实施了我们的身份验证系统 身份验证在 Chrome 和 Safari 中有效 我刚刚意识到它在 IE11 中不能很好地工作 F12表明
  • pine、node.js (express) 和 Access-Control-Allow-Origin

    我正在本地电脑上开发一个应用程序 前端应该使用 spinjs 构建 后端 api 使用 node js 构建 Spine 运行在端口 9294 上 node js 运行在端口 3000 上 在 Spine 中 我在模型中添加了以下内容 ur
  • 动态数据 Express.JS 的缓存控制

    如何建立一个缓存控制政策在快递 js关于 JSON 响应 我的 JSON 响应根本没有改变 所以我想积极缓存它 我找到了如何对静态文件进行缓存 但找不到如何对动态数据进行缓存 不优雅的方法是简单地添加一个调用res set 在任何 JSON
  • 无法使用 Tedious 和 Node JS 连接到本地 SQL Server 数据库

    我正在尝试连接到本地计算机上的 SQL Server 我正在尝试使用乏味和乏味 ntlm 两者的配置如下 var tds require tedious ntlm var tds require tedious var config use
  • Valgrind 输出中的错误摘要?

    我看过一些关于 valgrind 的帖子 但没有一篇帖子帮助我理解 valgrind 输出的解释 我用 valgrind 运行了两个程序 都有内存泄漏 测试 1 的示例输出 20422 LEAK SUMMARY 20422 definite
  • 如何将 Flutter 应用连接到 tcp 套接字服务器?

    我很难将 Flutter 应用程序连接到服务器上的网络 tcp 套接字 我知道我必须使用某种中间选项 以便在 tcp 套接字到 flutter 以及 Flutter 到 tcp 套接字之间转换数据 任何想法 信息如何实现这一目标 问题是如何
  • 何时使用node.js、sinatra、rails? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 这 3 种语言 框架的最佳用途是什么 混合所有 或 2 个 有用吗 如果您正在构建一个完整的 Web 应用程序 您可能应该使用 Rails 因为
  • 自动执行异步函数

    下面的代码可以完美运行 const Course mongoose model Course courseSchema async function foo const nodeCourse new Course name Node JS
  • Heroku 应用程序上的 Nodejs Express EACCES 0.0.0.0:80

    我正在尝试在他们的网站上新创建的 Heroku 应用程序上运行 Node 应用程序 我按照他们的步骤操作 但在显示应用程序状态时仍然遇到错误 我跟着Node js 入门 https devcenter heroku com articles
  • 如果 free() 知道我的数组的长度,为什么我不能在自己的代码中请求它?

    我知道将动态分配的数组的长度传递给操作它们的函数是一个常见的约定 void initializeAndFree int anArray size t length int main size t arrayLength 0 scanf d
  • 我应该在 Promise.all 中使用 wait 吗?

    我正在构建快速中间件 以对数据库进行两次异步调用 以检查用户名或电子邮件是否已在使用中 这些函数返回的承诺没有捕获 因为我想将数据库逻辑与 req res next 逻辑分开 并且我有集中的错误处理 需要next作为一个论点 在我对本地环境
  • Angularjs 范围之外的服务功能

    我在 angularJS 中创建了一个服务 它使用 btford socket io 模块与服务器交互 由于在服务中我已经实现了一些目前在 Angular 内部使用的 API 但为了以后扩展应用程序 我还需要在 Angular 范围之外提供
  • 如何通过aws-sdk(javascript或node)获取s3存储桶大小

    我尝试使用 javascript nodejs aws sdk 查找 获取 s3 存储桶信息 但没有找到这样的 api 如何通过 aws sdk javascript 或 node api 获取 s3 存储桶大小 信息 每天一次向 Clou
  • 运行“gulp”命令时出现“错误 [ERR_REQUIRE_ESM]”

    我是新来的Gulp并尝试自动化一些任务 这是我的环境设置 npm version 8 1 0 node version 17 0 1 gulp CLI version 2 3 0 and gulp version 4 0 2 这是我的gul

随机推荐