GeezerVison is showing github.com — report: add more memory info · nodejs/node@a186a4d
File treeExpand file treeCollapse file tree Open diff view settings Expand file treeCollapse file tree Open diff view settings Collapse file Copy file name to clipboardExpand all lines: doc/api/report.md +7-3Lines changed: 7 additions & 3 deletions - Display the source diff
- Display the rich diff
| Original file line number | Diff line number | Diff line change |
|---|
@@ -23,7 +23,7 @@ is provided below for reference. | 23 | 23 | ```json | 24 | 24 | { | 25 | 25 | "header": { | 26 | | - "reportVersion": 1, | | 26 | + "reportVersion": 3, | 27 | 27 | "event": "exception", | 28 | 28 | "trigger": "Exception", | 29 | 29 | "filename": "report.20181221.005011.8974.0.001.json", | @@ -198,13 +198,17 @@ is provided below for reference. | 198 | 198 | } | 199 | 199 | }, | 200 | 200 | "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", | 202 | 207 | "userCpuSeconds": 0.040072, | 203 | 208 | "kernelCpuSeconds": 0.016029, | 204 | 209 | "cpuConsumptionPercent": 5.6101, | 205 | 210 | "userCpuConsumptionPercent": 4.0072, | 206 | 211 | "kernelCpuConsumptionPercent": 1.6029, | 207 | | - "maxRss": 45768704, | 208 | 212 | "pageFaults": { | 209 | 213 | "IORequired": 0, | 210 | 214 | "IONotRequired": 4610 | |
Collapse file Copy file name to clipboardExpand all lines: src/node_report.cc +23-3Lines changed: 23 additions & 3 deletions | Original file line number | Diff line number | Diff line change |
|---|
| 23 | 23 | #include <cwctype> | 24 | 24 | #include <fstream> | 25 | 25 |
| 26 | | -constexpr int NODE_REPORT_VERSION = 2; | | 26 | +constexpr int NODE_REPORT_VERSION = 3; | 27 | 27 | constexpr int NANOS_PER_SEC = 1000 * 1000 * 1000; | 28 | 28 | constexpr double SEC_PER_MICROS = 1e-6; | 29 | 29 | constexpr int MAX_FRAME_COUNT = 10; | @@ -628,10 +628,30 @@ static void PrintResourceUsage(JSONWriter* writer) { | 628 | 628 | uv_rusage_t rusage; | 629 | 629 | writer->json_objectstart("resourceUsage"); | 630 | 630 |
| | 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 | + | 631 | 637 | size_t rss; | 632 | 638 | int err = uv_resident_set_memory(&rss); | 633 | 639 | 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)); | 635 | 655 | } | 636 | 656 |
| 637 | 657 | if (uv_getrusage(&rusage) == 0) { | @@ -648,7 +668,7 @@ static void PrintResourceUsage(JSONWriter* writer) { | 648 | 668 | writer->json_keyvalue("cpuConsumptionPercent", cpu_percentage); | 649 | 669 | writer->json_keyvalue("userCpuConsumptionPercent", user_cpu_percentage); | 650 | 670 | 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)); | 652 | 672 | writer->json_objectstart("pageFaults"); | 653 | 673 | writer->json_keyvalue("IORequired", rusage.ru_majflt); | 654 | 674 | writer->json_keyvalue("IONotRequired", rusage.ru_minflt); | |
Collapse file Copy file name to clipboardExpand all lines: test/common/report.js +16-6Lines changed: 16 additions & 6 deletions | Original file line number | Diff line number | Diff line change |
|---|
@@ -105,7 +105,7 @@ function _validateContent(report, fields = []) { | 105 | 105 | 'glibcVersionRuntime', 'glibcVersionCompiler', 'cwd', | 106 | 106 | 'reportVersion', 'networkInterfaces', 'threadId']; | 107 | 107 | checkForUnknownFields(header, headerFields); | 108 | | - assert.strictEqual(header.reportVersion, 2); // Increment as needed. | | 108 | + assert.strictEqual(header.reportVersion, 3); // Increment as needed. | 109 | 109 | assert.strictEqual(typeof header.event, 'string'); | 110 | 110 | assert.strictEqual(typeof header.trigger, 'string'); | 111 | 111 | assert(typeof header.filename === 'string' || header.filename === null); | @@ -232,19 +232,29 @@ function _validateContent(report, fields = []) { | 232 | 232 | } | 233 | 233 |
| 234 | 234 | // 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; | 236 | 238 | const resourceUsageFields = ['userCpuSeconds', 'kernelCpuSeconds', | 237 | 239 | 'cpuConsumptionPercent', 'userCpuConsumptionPercent', | 238 | | - 'kernelCpuConsumptionPercent', 'rss', 'maxRss', | 239 | | - 'pageFaults', 'fsActivity']; | | 240 | + 'kernelCpuConsumptionPercent', | | 241 | + 'maxRss', 'rss', 'free_memory', 'total_memory', | | 242 | + 'available_memory', 'pageFaults', 'fsActivity']; | 240 | 243 | checkForUnknownFields(usage, resourceUsageFields); | 241 | 244 | assert.strictEqual(typeof usage.userCpuSeconds, 'number'); | 242 | 245 | assert.strictEqual(typeof usage.kernelCpuSeconds, 'number'); | 243 | 246 | assert.strictEqual(typeof usage.cpuConsumptionPercent, 'number'); | 244 | 247 | assert.strictEqual(typeof usage.userCpuConsumptionPercent, 'number'); | 245 | 248 | 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 | + } | 248 | 258 | assert(typeof usage.pageFaults === 'object' && usage.pageFaults !== null); | 249 | 259 | checkForUnknownFields(usage.pageFaults, ['IORequired', 'IONotRequired']); | 250 | 260 | assert(Number.isSafeInteger(usage.pageFaults.IORequired)); | |
|