如何监控 Node.js 的内存使用情况?

Posted

技术标签:

【中文标题】如何监控 Node.js 的内存使用情况?【英文标题】:How to monitor the memory usage of Node.js? 【发布时间】:2013-11-29 21:06:47 【问题描述】:

【问题讨论】:

更多细节可能会有所帮助 【参考方案1】:

内置的process 模块有一个memoryUsage 方法,可以洞察当前Node.js 进程的内存使用情况。以下是 64 位系统上 Node v0.12.2 中的示例:

$ node --expose-gc
> process.memoryUsage();  // Initial usage
 rss: 19853312, heapTotal: 9751808, heapUsed: 4535648 
> gc();                   // Force a GC for the baseline.
undefined
> process.memoryUsage();  // Baseline memory usage.
 rss: 22269952, heapTotal: 11803648, heapUsed: 4530208 
> var a = new Array(1e7); // Allocate memory for 10m items in an array
undefined
> process.memoryUsage();  // Memory after allocating so many items
 rss: 102535168, heapTotal: 91823104, heapUsed: 85246576 
> a = null;               // Allow the array to be garbage-collected
null
> gc();                   // Force GC (requires node --expose-gc)
undefined
> process.memoryUsage();  // Memory usage after GC
 rss: 23293952, heapTotal: 11803648, heapUsed: 4528072 
> process.memoryUsage();  // Memory usage after idling
 rss: 23293952, heapTotal: 11803648, heapUsed: 4753376 

在这个简单的示例中,您可以看到分配一个包含 10M 元素的数组消耗了大约 80MB(查看heapUsed)。 如果查看 V8 的源代码(Array::NewHeap::AllocateRawFixedArrayFixedArray::SizeFor),您会发现数组使用的内存是一个固定值加上长度乘以指针大小。后者在 64 位系统上是 8 个字节,这证实了观察到的 8 x 10 = 80MB 的内存差异是有意义的。

【讨论】:

@MestreSan 哪个版本的 Node 不需要 --expose-gc 来实现 gc 功能? @MestreSan 我从来没有说过你需要--expose-gc 来换取process.memoryUsage()。答案中使用了gc()(需要--expose-gc)来确定性地触发垃圾收集,以便更容易查看process.memoryUsage 报告的内容。 这是以正确方式衡量 JS-Stuff 的绝佳答案。谢谢你的回答。 你让领主们和这个一起工作。我刚刚意识到调用 process 所暴露的所有方法,这将帮助我创建一个更高效的应用程序。谢谢。 我相信这应该是公认的答案。【参考方案2】:

node-memwatch:检测并发现 Node.JS 代码中的内存泄漏。 查看本教程Tracking Down Memory Leaks in Node.js

【讨论】:

node-memwatch 似乎不再活跃(最后更新于 2013 年 3 月)。有其他选择吗? @GoloRoden npm install memwatch-next 工作正常。这是回购:github.com/marcominetti/node-memwatch 用于查找内存泄漏的更新资源apmblog.dynatrace.com/2015/11/04/… memwatch 不再维护,并且无法在最新版本的节点上运行,所以不要打扰。 Understanding Garbage Collection and hunting Memory Leaks in Node.js【参考方案3】:

另外,如果你想知道全局内存而不是节点进程':

var os = require('os');

os.freemem();
os.totalmem();

See documentation

【讨论】:

但是,freemem() 与服务器上的可用内存不同。有什么方法可以找到可用内存而不是空闲内存?【参考方案4】:

原来的memwatch 基本上已经死了。改用 memwatch-next,它似乎在现代版本的 Node 上运行良好。

【讨论】:

国王死了;国王万岁:npmjs.com/package/node-memwatch node-memwatch 至少适用于节点版本 10。谢谢,@FrankMeulenaar :+1: 这两个库(memwatch-next 和 node-memwatch)已被弃用或无法正常工作。【参考方案5】:

你可以使用node.js memoryUsage

const formatMemoryUsage = (data) => `$Math.round(data / 1024 / 1024 * 100) / 100 MB`

const memoryData = process.memoryUsage()

const memoryUsage = 
                rss: `$formatMemoryUsage(memoryData.rss) -> Resident Set Size - total memory allocated for the process execution`,
                heapTotal: `$formatMemoryUsage(memoryData.heapTotal) -> total size of the allocated heap`,
                heapUsed: `$formatMemoryUsage(memoryData.heapUsed) -> actual memory used during the execution`,
                external: `$formatMemoryUsage(memoryData.external) -> V8 external memory`,


console.log(memoryUsage)
/*

    "rss": "177.54 MB -> Resident Set Size - total memory allocated for the process execution",
    "heapTotal": "102.3 MB -> total size of the allocated heap",
    "heapUsed": "94.3 MB -> actual memory used during the execution",
    "external": "3.03 MB -> V8 external memory"

*/

【讨论】:

【参考方案6】:

如果您使用的是 express.js 框架,那么您可以使用express-status-monitor。它非常易于集成,并以图形格式提供 CPU 使用率、内存使用率、响应时间等。

【讨论】:

【参考方案7】:

在 Linux/Unix 上(注意:Mac OS 是 Unix)使用 top 并按 M (Shift+M) 按内存使用情况对进程进行排序。

在 Windows 上使用任务管理器。

【讨论】:

@majidarif 转到Applications > Utilities,您将找到一个Activity Monitor 应用程序。那个相当于任务管理器。 OS X 也有top 命令。 在 Linux 上使用 htop 而不是 top。好多了。【参考方案8】:

node memwatch 和 memwatch next 这些在 nodejs 14.17.0 版本上不支持。 仅支持新的 node-memwatch-new 模块。 请告诉我如何在 nodejs 14.17 版本上安装 node-memwatch install。

【讨论】:

如果您有新问题,请点击 按钮提出问题。如果有助于提供上下文,请包含指向此问题的链接。 - From Review @SarathKumar 我想你在问“node-memwatch-new”,所以你只想去这里,按照说明操作:npmjs.com/package/node-memwatch-new 好的,谢谢@spechter

以上是关于如何监控 Node.js 的内存使用情况?的主要内容,如果未能解决你的问题,请参考以下文章

第1651期如何分析 Node.js 中的内存泄漏

如何获取运行 Node JS 应用程序的 k8s Pod 的当前和准确的内存使用情况

淘宝技术专家:教你如何定位线上Node.js 内存泄漏!

如何使用 Node.js Stream API 减少服务器端内存消耗?

检测代码中的 node.js/javascript 内存泄漏

Node.js中的内存泄漏分析