Skip to content

Commit a186a4d

Browse files
theanarkhdanielleadams
authored andcommitted
report: add more memory info
PR-URL: #45254 Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Gireesh Punathil <gpunathi@in.ibm.com> Reviewed-By: Chengzhong Wu <legendecas@gmail.com>
1 parent 57897f8 commit a186a4d

File tree

3 files changed

+46
-12
lines changed

3 files changed

+46
-12
lines changed

doc/api/report.md

+7-3
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ is provided below for reference.
2323
```json
2424
{
2525
"header": {
26-
"reportVersion": 1,
26+
"reportVersion": 3,
2727
"event": "exception",
2828
"trigger": "Exception",
2929
"filename": "report.20181221.005011.8974.0.001.json",
@@ -198,13 +198,17 @@ is provided below for reference.
198198
}
199199
},
200200
"resourceUsage": {
201-
"rss": 45768704,
201+
"rss": "35766272",
202+
"free_memory": "1598337024",
203+
"total_memory": "17179869184",
204+
"available_memory": "1598337024",
205+
"maxRss": "36624662528",
206+
"constrained_memory": "36624662528",
202207
"userCpuSeconds": 0.040072,
203208
"kernelCpuSeconds": 0.016029,
204209
"cpuConsumptionPercent": 5.6101,
205210
"userCpuConsumptionPercent": 4.0072,
206211
"kernelCpuConsumptionPercent": 1.6029,
207-
"maxRss": 45768704,
208212
"pageFaults": {
209213
"IORequired": 0,
210214
"IONotRequired": 4610

src/node_report.cc

+23-3
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
#include <cwctype>
2424
#include <fstream>
2525

26-
constexpr int NODE_REPORT_VERSION = 2;
26+
constexpr int NODE_REPORT_VERSION = 3;
2727
constexpr int NANOS_PER_SEC = 1000 * 1000 * 1000;
2828
constexpr double SEC_PER_MICROS = 1e-6;
2929
constexpr int MAX_FRAME_COUNT = 10;
@@ -628,10 +628,30 @@ static void PrintResourceUsage(JSONWriter* writer) {
628628
uv_rusage_t rusage;
629629
writer->json_objectstart("resourceUsage");
630630

631+
uint64_t free_memory = uv_get_free_memory();
632+
uint64_t total_memory = uv_get_total_memory();
633+
634+
writer->json_keyvalue("free_memory", std::to_string(free_memory));
635+
writer->json_keyvalue("total_memory", std::to_string(total_memory));
636+
631637
size_t rss;
632638
int err = uv_resident_set_memory(&rss);
633639
if (!err) {
634-
writer->json_keyvalue("rss", rss);
640+
writer->json_keyvalue("rss", std::to_string(rss));
641+
}
642+
643+
uint64_t constrained_memory = uv_get_constrained_memory();
644+
if (constrained_memory) {
645+
writer->json_keyvalue("constrained_memory",
646+
std::to_string(constrained_memory));
647+
}
648+
649+
// See GuessMemoryAvailableToTheProcess
650+
if (!err && constrained_memory && constrained_memory >= rss) {
651+
uint64_t available_memory = constrained_memory - rss;
652+
writer->json_keyvalue("available_memory", std::to_string(available_memory));
653+
} else {
654+
writer->json_keyvalue("available_memory", std::to_string(free_memory));
635655
}
636656

637657
if (uv_getrusage(&rusage) == 0) {
@@ -648,7 +668,7 @@ static void PrintResourceUsage(JSONWriter* writer) {
648668
writer->json_keyvalue("cpuConsumptionPercent", cpu_percentage);
649669
writer->json_keyvalue("userCpuConsumptionPercent", user_cpu_percentage);
650670
writer->json_keyvalue("kernelCpuConsumptionPercent", kernel_cpu_percentage);
651-
writer->json_keyvalue("maxRss", rusage.ru_maxrss * 1024);
671+
writer->json_keyvalue("maxRss", std::to_string(rusage.ru_maxrss * 1024));
652672
writer->json_objectstart("pageFaults");
653673
writer->json_keyvalue("IORequired", rusage.ru_majflt);
654674
writer->json_keyvalue("IONotRequired", rusage.ru_minflt);

test/common/report.js

+16-6
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ function _validateContent(report, fields = []) {
105105
'glibcVersionRuntime', 'glibcVersionCompiler', 'cwd',
106106
'reportVersion', 'networkInterfaces', 'threadId'];
107107
checkForUnknownFields(header, headerFields);
108-
assert.strictEqual(header.reportVersion, 2); // Increment as needed.
108+
assert.strictEqual(header.reportVersion, 3); // Increment as needed.
109109
assert.strictEqual(typeof header.event, 'string');
110110
assert.strictEqual(typeof header.trigger, 'string');
111111
assert(typeof header.filename === 'string' || header.filename === null);
@@ -232,19 +232,29 @@ function _validateContent(report, fields = []) {
232232
}
233233

234234
// Verify the format of the resourceUsage section.
235-
const usage = report.resourceUsage;
235+
const usage = { ...report.resourceUsage };
236+
// Delete it, otherwise checkForUnknownFields will throw error
237+
delete usage.constrained_memory;
236238
const resourceUsageFields = ['userCpuSeconds', 'kernelCpuSeconds',
237239
'cpuConsumptionPercent', 'userCpuConsumptionPercent',
238-
'kernelCpuConsumptionPercent', 'rss', 'maxRss',
239-
'pageFaults', 'fsActivity'];
240+
'kernelCpuConsumptionPercent',
241+
'maxRss', 'rss', 'free_memory', 'total_memory',
242+
'available_memory', 'pageFaults', 'fsActivity'];
240243
checkForUnknownFields(usage, resourceUsageFields);
241244
assert.strictEqual(typeof usage.userCpuSeconds, 'number');
242245
assert.strictEqual(typeof usage.kernelCpuSeconds, 'number');
243246
assert.strictEqual(typeof usage.cpuConsumptionPercent, 'number');
244247
assert.strictEqual(typeof usage.userCpuConsumptionPercent, 'number');
245248
assert.strictEqual(typeof usage.kernelCpuConsumptionPercent, 'number');
246-
assert(Number.isSafeInteger(usage.rss));
247-
assert(Number.isSafeInteger(usage.maxRss));
249+
assert(typeof usage.rss, 'string');
250+
assert(typeof usage.maxRss, 'string');
251+
assert(typeof usage.free_memory, 'string');
252+
assert(typeof usage.total_memory, 'string');
253+
assert(typeof usage.available_memory, 'string');
254+
// This field may not exsit
255+
if (report.resourceUsage.constrained_memory) {
256+
assert(typeof report.resourceUsage.constrained_memory, 'string');
257+
}
248258
assert(typeof usage.pageFaults === 'object' && usage.pageFaults !== null);
249259
checkForUnknownFields(usage.pageFaults, ['IORequired', 'IONotRequired']);
250260
assert(Number.isSafeInteger(usage.pageFaults.IORequired));

0 commit comments

Comments
 (0)