如何监控 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::New
、Heap::AllocateRawFixedArray
、FixedArray::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-memwatchnode-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 的内存使用情况?的主要内容,如果未能解决你的问题,请参考以下文章
如何获取运行 Node JS 应用程序的 k8s Pod 的当前和准确的内存使用情况
如何使用 Node.js Stream API 减少服务器端内存消耗?