From 56ddd69372e35fe16810606b3ae06bcc06139008 Mon Sep 17 00:00:00 2001 From: theanarkh Date: Mon, 31 Oct 2022 20:14:35 +0800 Subject: [PATCH] report: add more memory info --- doc/api/report.md | 8 ++++++-- src/node_report.cc | 20 +++++++++++++++++++- test/common/report.js | 16 +++++++++++++--- 3 files changed, 38 insertions(+), 6 deletions(-) diff --git a/doc/api/report.md b/doc/api/report.md index 507434f6c63868..648d15fa774362 100644 --- a/doc/api/report.md +++ b/doc/api/report.md @@ -23,7 +23,7 @@ is provided below for reference. ```json { "header": { - "reportVersion": 1, + "reportVersion": 3, "event": "exception", "trigger": "Exception", "filename": "report.20181221.005011.8974.0.001.json", @@ -198,7 +198,11 @@ is provided below for reference. } }, "resourceUsage": { - "rss": 45768704, + "rss": 36028416, + "free_memory": 54050816, + "total_memory": 17179869184, + "available_memory": 54050816, + "constrained_memory": 360284160, "userCpuSeconds": 0.040072, "kernelCpuSeconds": 0.016029, "cpuConsumptionPercent": 5.6101, diff --git a/src/node_report.cc b/src/node_report.cc index a867a4c38caa72..89a2780add168a 100644 --- a/src/node_report.cc +++ b/src/node_report.cc @@ -23,7 +23,7 @@ #include #include -constexpr int NODE_REPORT_VERSION = 2; +constexpr int NODE_REPORT_VERSION = 3; constexpr int NANOS_PER_SEC = 1000 * 1000 * 1000; constexpr double SEC_PER_MICROS = 1e-6; constexpr int MAX_FRAME_COUNT = 10; @@ -628,12 +628,30 @@ static void PrintResourceUsage(JSONWriter* writer) { uv_rusage_t rusage; writer->json_objectstart("resourceUsage"); + uint64_t free_memory = uv_get_free_memory(); + uint64_t total_memory = uv_get_total_memory(); + + writer->json_keyvalue("free_memory", free_memory); + writer->json_keyvalue("total_memory", total_memory); + size_t rss; int err = uv_resident_set_memory(&rss); if (!err) { writer->json_keyvalue("rss", rss); } + uint64_t constrained_memory = uv_get_constrained_memory(); + if (constrained_memory) { + writer->json_keyvalue("constrained_memory", constrained_memory); + } + + // See GuessMemoryAvailableToTheProcess + if (!err && constrained_memory && constrained_memory >= rss) { + writer->json_keyvalue("available_memory", constrained_memory - rss); + } else { + writer->json_keyvalue("available_memory", free_memory); + } + if (uv_getrusage(&rusage) == 0) { double user_cpu = rusage.ru_utime.tv_sec + SEC_PER_MICROS * rusage.ru_utime.tv_usec; diff --git a/test/common/report.js b/test/common/report.js index fd8642fb4f084e..5a9b539c3dafb4 100644 --- a/test/common/report.js +++ b/test/common/report.js @@ -105,7 +105,7 @@ function _validateContent(report, fields = []) { 'glibcVersionRuntime', 'glibcVersionCompiler', 'cwd', 'reportVersion', 'networkInterfaces', 'threadId']; checkForUnknownFields(header, headerFields); - assert.strictEqual(header.reportVersion, 2); // Increment as needed. + assert.strictEqual(header.reportVersion, 3); // Increment as needed. assert.strictEqual(typeof header.event, 'string'); assert.strictEqual(typeof header.trigger, 'string'); assert(typeof header.filename === 'string' || header.filename === null); @@ -233,10 +233,14 @@ function _validateContent(report, fields = []) { // Verify the format of the resourceUsage section. const usage = report.resourceUsage; + // This field may not exsit + const constrainedMemory = usage.constrained_memory; + delete usage.constrained_memory; const resourceUsageFields = ['userCpuSeconds', 'kernelCpuSeconds', 'cpuConsumptionPercent', 'userCpuConsumptionPercent', - 'kernelCpuConsumptionPercent', 'rss', 'maxRss', - 'pageFaults', 'fsActivity']; + 'kernelCpuConsumptionPercent', + 'maxRss', 'rss', 'free_memory', 'total_memory', + 'available_memory', 'pageFaults', 'fsActivity']; checkForUnknownFields(usage, resourceUsageFields); assert.strictEqual(typeof usage.userCpuSeconds, 'number'); assert.strictEqual(typeof usage.kernelCpuSeconds, 'number'); @@ -245,6 +249,12 @@ function _validateContent(report, fields = []) { assert.strictEqual(typeof usage.kernelCpuConsumptionPercent, 'number'); assert(Number.isSafeInteger(usage.rss)); assert(Number.isSafeInteger(usage.maxRss)); + assert(Number.isSafeInteger(usage.free_memory)); + assert(Number.isSafeInteger(usage.total_memory)); + assert(Number.isSafeInteger(usage.available_memory)); + if (constrainedMemory) { + assert(Number.isSafeInteger(constrainedMemory)); + } assert(typeof usage.pageFaults === 'object' && usage.pageFaults !== null); checkForUnknownFields(usage.pageFaults, ['IORequired', 'IONotRequired']); assert(Number.isSafeInteger(usage.pageFaults.IORequired));