diff --git a/CHANGELOG.md b/CHANGELOG.md index 61bf9334..31e1de8a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -26,6 +26,7 @@ project adheres to [Semantic Versioning](http://semver.org/). - perf: Improve performance of registry defaultLabels during metric processing - perf: New, more space-efficient storage engine, 20-45% faster stats recording - perf: Further improvement to key generation cost +- perf: Use faster `process.memoryUsage.rss()` API for resident memory collection (30-40% more ops/sec) - fix: Browser compatibility for Gauge.startTimer() - ci: Run benchmarks for pull requests - ci: switch out deprecated benchmark-regression library for replacement diff --git a/lib/metrics/helpers/safeRss.js b/lib/metrics/helpers/safeRss.js new file mode 100644 index 00000000..6b1ac2c5 --- /dev/null +++ b/lib/metrics/helpers/safeRss.js @@ -0,0 +1,12 @@ +'use strict'; + +// process.memoryUsage.rss() can throw on some platforms, see #67 +function safeRss() { + try { + return process.memoryUsage.rss(); + } catch { + return; + } +} + +module.exports = safeRss; diff --git a/lib/metrics/osMemoryHeap.js b/lib/metrics/osMemoryHeap.js index 5990fd3f..24ace2a9 100644 --- a/lib/metrics/osMemoryHeap.js +++ b/lib/metrics/osMemoryHeap.js @@ -2,7 +2,7 @@ const Gauge = require('../gauge'); const linuxVariant = require('./osMemoryHeapLinux'); -const safeMemoryUsage = require('./helpers/safeMemoryUsage'); +const safeRss = require('./helpers/safeRss'); const PROCESS_RESIDENT_MEMORY = 'process_resident_memory_bytes'; @@ -17,11 +17,11 @@ function notLinuxVariant(registry, config = {}) { registers: registry ? [registry] : undefined, labelNames, collect() { - const memUsage = safeMemoryUsage(); - - // I don't think the other things returned from `process.memoryUsage()` is relevant to a standard export - if (memUsage) { - this.set(labels, memUsage.rss); + // process.memoryUsage.rss() is faster than process.memoryUsage() as it + // only reads RSS from the OS without collecting all heap statistics + const rss = safeRss(); + if (rss !== undefined) { + this.set(labels, rss); } }, });