NodeJS输出内存使用信息到日志

2023-05-16

NodeJS输出内存使用信息到日志


如需转载请标明出处:http://blog.csdn.net/itas109

前言

内存信息是应用程序非常重要的信息,尤其是在排查内存相关问题的时候。
本文将介绍NodeJS如何输出内存使用信息到日志。

1. 原理简介

1.1 参数说明

process.memoryUsage()

{
  rss: 24416256,
  heapTotal: 5222400,
  heapUsed: 2987984,
  external: 1584357,
  arrayBuffers: 74935
}
参数英文中文说明
rssresident set size驻留集大小进程在主内存设备(即总分配内存的子集)中占用的空间量,包括所有 C++ 和 JavaScript 对象和代码
heapTotalheap total堆内存总大小v8堆内存总大小
heapUsedheap used堆内存已使用大小v8堆内存总大小
externalexternal额外大小绑定到 V8 管理的 JavaScript 对象的 C++ 对象的内存使用量
arrayBuffersarray buffers数组缓冲大小为 ArrayBuffer 和 SharedArrayBuffer 分配的内存,包括所有 Node.js Buffer

node memory scheme

1.2 实现原理

在nodejs源码中,
rss通过libuv的uv_resident_set_memory函数实现
其他的通过v8的GetHeapStatistics函数实现

static void MemoryUsage(const FunctionCallbackInfo<Value>& args) {
  Environment* env = Environment::GetCurrent(args);

  Isolate* isolate = env->isolate();
  // V8 memory usage
  HeapStatistics v8_heap_stats;
  isolate->GetHeapStatistics(&v8_heap_stats);

  NodeArrayBufferAllocator* array_buffer_allocator =
      env->isolate_data()->node_allocator();

  // Get the double array pointer from the Float64Array argument.
  Local<ArrayBuffer> ab = get_fields_array_buffer(args, 0, 5);
  double* fields = static_cast<double*>(ab->Data());

  size_t rss;
  int err = uv_resident_set_memory(&rss);
  if (err)
    return env->ThrowUVException(err, "uv_resident_set_memory");

  fields[0] = static_cast<double>(rss);
  fields[1] = static_cast<double>(v8_heap_stats.total_heap_size());
  fields[2] = static_cast<double>(v8_heap_stats.used_heap_size());
  fields[3] = static_cast<double>(v8_heap_stats.external_memory());
  fields[4] =
      array_buffer_allocator == nullptr
          ? 0
          : static_cast<double>(array_buffer_allocator->total_mem_usage());
}

2. 代码

dump.js

const process = require('process');
const fs = require('fs');

const FILE_NAME = `memory_${process.pid}.csv`;
const INTERVAL_MS = 1000; // 1s

function FormatBytes(bytes) {
    return (bytes / 1048576).toFixed(2);
}

function showMemory() {
    const memoryObj = process.memoryUsage();
    // time, rss(MB), heapTotal(MB), heapUsed(MB), external(MB), arrayBuffers(MB)
    let result = `${new Date().toLocaleString('chinese', { hour12: false })}, ${FormatBytes(memoryObj.rss)}, ${FormatBytes(memoryObj.heapTotal)}, ${FormatBytes(memoryObj.heapUsed)}, ${FormatBytes(memoryObj.external)}, ${FormatBytes(memoryObj.arrayBuffers)}\n`;
    // console.log(result);
    fs.writeFileSync(FILE_NAME, result, { flag: 'a+' });
}

showMemory();
setInterval(() => { showMemory(); }, INTERVAL_MS);

test.js

require('./dump');

3. 测试

node test.js
  • 结果
    memory_12360.csv
2023-3-10 22:30:26, 23.14, 5.68, 2.69, 0.96, 0.02
2023-3-10 22:30:27, 24.53, 5.68, 2.72, 0.96, 0.02
2023-3-10 22:30:28, 24.55, 5.68, 2.72, 0.96, 0.02
2023-3-10 22:30:29, 24.64, 5.68, 2.73, 0.96, 0.02
2023-3-10 22:30:30, 24.70, 5.68, 2.74, 0.96, 0.02
2023-3-10 22:30:31, 24.71, 5.68, 2.74, 0.96, 0.02
...

License

License under CC BY-NC-ND 4.0: 署名-非商业使用-禁止演绎

如需转载请标明出处:http://blog.csdn.net/itas109


Reference:

  1. https://nodejs.org/api/process.html#process_process_memoryusage
  2. https://www.dynatrace.com/news/blog/understanding-garbage-collection-and-hunting-memory-leaks-in-node-js/
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

NodeJS输出内存使用信息到日志 的相关文章

  • 如何检查 Node.js 中是否定义了变量?

    我正在用node js 编写一个程序 它实际上是js 我有一个变量 var query azure TableQuery 看起来这行代码有时没有执行 我的问题是 我怎样才能做到这样的条件 if this variable is define
  • 如何在node.js解析查询中设置dns服务器?

    我正在尝试设置 Google DNS 服务器8 8 8 8在 Node js 中解析查询 这样做的正确方法是什么 在命令行中通常我们可以执行以下操作 nslookup stackoverflow com 8 8 8 8 Server 8 8
  • Mongoose嵌入式文档更新

    我在嵌入式文档更新方面遇到问题 我定义的架构 var Talk new Schema title type String required true content type String required true date type D
  • Node.js 中的垃圾收集器

    据谷歌称 V8 通过采用 stop the world 分代 准确的垃圾收集器 来使用高效的垃圾收集 部分说法是 V8 在执行垃圾收集周期时会停止程序执行 一个明显的问题是 当暂停程序执行时 如何才能实现高效的 GC 我试图找到有关此主题的
  • ER_TRUNCATED_WRONG_VALUE:日期时间值不正确

    我最近完成了一个研究项目的申请 一切都很好 我剩下的就是将应用程序投入生产 我正在将 MySQL 与 Node js 结合使用 我知道 我们不喜欢这样 但总得有人尝试一下 我有一个套接字 它向 mysql 消息表添加一条聊天消息 其中包含文
  • Node.js 10 的 TypeScript tsconfig 设置?

    有谁知道 Node js v10 x 需要哪些目标 库才能在没有生成器的情况下使用内置的 async await 我看到很多关于节点 8 的信息 但没有看到关于节点 10 的信息 从 Node js 开始10 0 0 100 支持ES201
  • 如何安全地存储和处理 JWT 密钥

    读完这篇文章后 JWT 什么是好的密钥 以及如何将其存储在 Node js Express 应用程序中 https stackoverflow com questions 30089604 jwt whats a good secret k
  • 无法读取未定义的属性“isLoggedIn”

    此代码用于添加产品 然后添加到购物车和订单 并在后端使用 mongodb 创建 pdf 实际上 session isLoggedIn 是在 auth js 中定义的 检查该代码 但仍在 app js 中它给出了此错误 应用程序 JS代码 c
  • Bot Framework openUrl 不适用于信使上的建议操作

    我正在使用 Bot Builder Node js sdk 创建 facebook 机器人 并尝试创建建议操作 该操作将用户导航到网页 我知道 facebook 有限制 它仅重定向到 https 端点 但由于我重定向到的页面是 https
  • JavaScript TypeError:无法读取未定义的属性“startsWith” - 不和谐机器人

    在开始这个问题时 我必须说我对 javascript 知之甚少 我在 Java 中练习过 只是想制作一个 有点 简单的 Discord 机器人 它会随机说出消息 我将各种教程中的 2 段代码组合在一起 目前有 var Discord req
  • setInterval 可以随时间漂移吗?

    我有 2 个 Node js 网络服务器 我在网络服务器内缓存数据 我根据系统时间同步缓存加载 清除 我已经完成了所有主机的时间同步 现在我使用以下代码每 15 分钟清除一次缓存 millisTillNexthour Calculate m
  • Express/node.js 204 HTTP 代码响应问题

    这是我的代码 put function req res User findById req params user id function err user if err return res send err user dateEdite
  • 在node.js中使用pug在表单“post”之后发送空的{}

    我正在尝试使用 fetch 和以下 pug 代码通过 post 将表单数据从登录页面传递到登录页面 form id form login input type text name email value placeholder Tu ema
  • Typescript 和 Mongoose - “this”在实例方法中不可用

    我目前正在将我的 API 从 JS 转换为 TS 然而 我在猫鼬和打字稿方面遇到了一些困难 具体来说 this在我的实例方法中不可用 My code AccountSchema methods comparePassword async f
  • 如何在 PyV8 中加载 Nodejs 模块?

    如何在 PyV8 中加载 Nodejs 模块 我读过所有关于 jsdom 在与 Nodejs 一起运行时有多么出色的内容 如果我在 Python 应用程序中运行 v8 使用 python 获取 Web 资源 然后将生成的 html 字符串提
  • Nodejs - 处理和发送多部分请求,

    我的应用程序在 Nodejs 服务器上运行 Node Js 还充当来自应用程序的请求的中间件 代理 因此 从浏览器开始 所有 REST 调用都会转到 NodeJs 然后转到 Java API 我发现处理多部分表单数据的请求时出现问题 我在
  • Angular2 + Laravel 与实时和 WebSockets

    我构建了一个应用程序 并计划与 Angular 2 和 laravel 进行实时战斗 例如 你按下 攻击 按钮 你的对手就会实时看到他的生命在下降 我的应用程序构建有 前端 角2 Backend PHP Laravel 5 2 现在我正在寻
  • 有人在node/socket.io 中成功实现了动态命名空间吗?

    含义 用户对应用程序进行身份验证 gt 应用程序设置socket io连接的命名空间 http www socketioserver com NAMESPACE 并且节点服务器相应地响应无需针对特定名称空间进行硬编码 到那个特定的命名空间
  • socket.io 作为客户端

    有什么方法可以将socketio作为客户端运行 不是浏览器 而是nodejs脚本 我需要将数据从服务器广播到一些客户端 浏览器 和另一台linux机器 仅运行nodejs来获取变量 没有浏览器 欢迎任何想法 Regards github上有
  • 如何在nodejs缓冲区中存储整数?

    节点jsBuffer http nodejs org docs v0 4 12 api buffers html是相当膨胀 然而 它似乎适合存储字符串 构造函数采用字符串 字节数组或要分配的字节大小 我使用的是 Node js 0 4 12

随机推荐

  • 海睿思分享 | 浅谈数仓指标体系管理

    什么是指标 xff1f 指标 xff0c 是用于衡量事物发展程度的单位或方法 xff0c 也常被称作度量 xff0c 通常情况下也是报表统计的字段 xff0c 例如 xff1a 人口数 营业收入 用户数 利润率 成功率 失败率 覆盖率等 1
  • PyTorch 实战:计算 Wasserstein 距离

    xff08 给 Python开发者 加星标 xff0c 提升Python技能 xff09 编译 xff1a 机器之心 xff0c 作者 xff1a Daniel Daza 最优传输理论及 Wasserstein 距离是很多读者都希望了解的基
  • Java8 Lambda表达式教程

    1 什么是 表达式 表达式本质上是一个匿名方法 让我们来看下面这个例子 xff1a public int add int x int y return x 43 y 转成 表达式后是这个样子 xff1a int x int y gt x 4
  • VNC连接失败:The connection was refused by the host computer

    解决方法 xff1a 1 用Xshell登陆自己的服务器 2 在命令行中输入vncserver 命令行中出现 xff1a Warning optimal6 2 is taken because of tmp X2 lock Remove t
  • ACM会用到的一点数学知识

    1 费马小定理 xff1a a p mod p 61 a p为素数 xff0c 且a不是p的倍数 2 数n的约数个数 xff1a n分解因数为p1 s1 p2 s2 pm sm 则约数个数为 s1 43 1 s2 43 1 sm 43 1
  • SVN的Status总结

    执行SVN up和svn merge等命令出现在首位置的各字母含义如下 xff1a 无修改 A 新增 C 冲突 D 删除 G 合并 I 忽略 M 改变 R 替换 X 未纳入版本控制 xff0c 但被外部定义所用 未纳入版本控制 该项目已遗失
  • linux 下中文编码转换问题

    目标 xff1a 接收网络传过来的字节序 xff0c 转换字符串 全英文的情况下直接保存string即可 xff0c 带中文的情况试了好久故做如下记录 1 首先确认gcc 应该是utf 8的格式来存储字符串的 通过cmake 加入 fexe
  • Go 语言汇编快速入门

    在 Go 的源码中包含大量汇编语句 xff0c 最优秀的示例代码位于 math big runtime 和 crypto 这些库中 xff0c 但是从这里入门的话实在太过于痛苦 xff0c 这些示例都是着力于系统操作和性能的运行代码 对于没
  • 从零开始搭建Raspberry Pi机器视觉编程环境

    从零开始搭建Raspberry Pi机器视觉编程环境 本文主要包括如下内容 xff1a 安装Raspbian系统 连接和设置网络 安装中文支持 用电脑控制树莓派 通过SSH远程登录树莓派命令行界面 安装VNC远程登录树莓派图形桌面 通过串口
  • loss函数之margin改进方法

    最近sphereface人脸方法是目前开源人脸中最有效的方法 xff0c 通过改进我也获得了lfw acc 99 7 的结果 xff0c 下面几篇也是对sphereface改进的论文 xff1a AM Additive Margin Sof
  • mininet学习记录之openflow

    一 FAQ mn 指令的默认controller是ovs controller xff0c 最多只支持16个switch xff0c 如果要支持更多 xff0c 必须换controller OpenFlow reference implem
  • Open vSwitch常用指令

    link設定 OpenvSwitch by roan xff0c 内容相对比较全面 xff0c 但是给出的网页链接废了好多 流表中数字越大 xff0c 优先级越高 各个组件的命令有什么子命令和功能 xff0c 直接 help e g ovs
  • CVS使用手册 zz

    CVS使用手册 CVS是一个C S系统 xff0c 多个开发人员通过一个中心版本控制系统来记录文件版本 xff0c 从而达到保证文件同步的目的 工作模式如下 xff1a CVS服务器 xff08 文件版本库 xff09 xff08 版 本
  • 数据清洗工作小结

    今天帮课题组的老师处理了一部分数据 xff0c 由于长时间不做数据清洗的工作 xff0c 本栗子进行了长达2个小时的百度 这篇文档主要是针对该清洗工作的小结 从xlsx文件中读取指定的几列数据 xff0c 为数据框格式 xls span c
  • zhucheng关于2006上海I题的结论及证明

    题目意思是给出N和素数P xff0c 求杨辉三角第N行中能被P整除的数的个数 结论是将N写成P进制数N0N1N2 Nm xff0c 答案就是 N 43 1 N0 43 1 N1 43 1 Nm 43 1 证明如下 组合数C n m 61 n
  • mybatis-plus引入依赖报错Maven Missing artifact xxx:jar

    mybatis plus在添加依赖时可能会出现某个jar包下载有问题 xff0c 同时第一行出错提示maven中无法下载 xff08 xsi schemaLocation xff09 或jar包下载出错 右键项目 gt maven gt u
  • C++语言程序设计

    C 43 43 语言程序设计 如需转载请标明出处 xff1a http blog csdn net itas109 文章目录 C 43 43 语言程序设计1 语言概述1 1 字符集合1 2 词法记号关键字标识符文字操作符 运算符 分隔符空白
  • 查看C语言库函数源码

    查看C语言库函数源码 如需转载请标明出处 xff1a http blog csdn net itas109 文章目录 查看C语言库函数源码1 visual studio2 glibc3 llvm4 其他 例如查找string h头文件中的s
  • CSerialPort教程(9) - CSerialPort输出详细调试信息及日志

    CSerialPort教程 9 CSerialPort输出详细调试信息及日志 前言 CSerialPort项目是基于C 43 43 的轻量级开源跨平台串口类库 xff0c 用于实现跨平台多操作系统的串口读写 CSerialPort项目的开源
  • NodeJS输出内存使用信息到日志

    NodeJS输出内存使用信息到日志 如需转载请标明出处 xff1a http blog csdn net itas109 前言 内存信息是应用程序非常重要的信息 xff0c 尤其是在排查内存相关问题的时候 本文将介绍NodeJS如何输出内存