Skip to content

Commit 0abb724

Browse files
cjihrigBridgeAR
authored andcommitted
report: support RUSAGE_SELF stats on Windows
This commit adds support for the resourceUsage report section on Windows by using uv_getrusage() instead of getrusage(). PR-URL: #26406 Reviewed-By: Richard Lau <riclau@uk.ibm.com> Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Anna Henningsen <anna@addaleax.net>
1 parent 2a3cca7 commit 0abb724

2 files changed

Lines changed: 30 additions & 38 deletions

File tree

‎src/node_report.cc‎

Lines changed: 10 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -81,9 +81,7 @@ static void PrintJavaScriptStack(JSONWriter* writer,
8181
Local<String> stackstr,
8282
constchar* trigger);
8383
staticvoidPrintNativeStack(JSONWriter* writer);
84-
#ifndef _WIN32
8584
staticvoidPrintResourceUsage(JSONWriter* writer);
86-
#endif
8785
staticvoidPrintGCStatistics(JSONWriter* writer, Isolate* isolate);
8886
staticvoidPrintSystemInformation(JSONWriter* writer);
8987
staticvoidPrintLoadedLibraries(JSONWriter* writer);
@@ -289,9 +287,7 @@ static void WriteNodeReport(Isolate* isolate,
289287
PrintGCStatistics(&writer, isolate);
290288

291289
// Report OS and current thread resource usage
292-
#ifndef _WIN32
293290
PrintResourceUsage(&writer);
294-
#endif
295291

296292
writer.json_arraystart("libuv");
297293
if (env != nullptr) {
@@ -466,39 +462,38 @@ static void PrintGCStatistics(JSONWriter* writer, Isolate* isolate) {
466462
writer->json_objectend();
467463
}
468464

469-
#ifndef _WIN32
470-
// Report resource usage (Linux/OSX only).
471465
staticvoidPrintResourceUsage(JSONWriter* writer) {
472466
// Get process uptime in seconds
473467
uint64_t uptime =
474468
(uv_hrtime() - node::per_process::node_start_time) / (NANOS_PER_SEC);
475469
if (uptime == 0) uptime = 1; // avoid division by zero.
476470

477471
// Process and current thread usage statistics
478-
structrusage stats;
472+
uv_rusage_t rusage;
479473
writer->json_objectstart("resourceUsage");
480-
if (getrusage(RUSAGE_SELF, &stats) == 0) {
474+
if (uv_getrusage(&rusage) == 0) {
481475
double user_cpu =
482-
stats.ru_utime.tv_sec + SEC_PER_MICROS * stats.ru_utime.tv_usec;
476+
rusage.ru_utime.tv_sec + SEC_PER_MICROS * rusage.ru_utime.tv_usec;
483477
double kernel_cpu =
484-
stats.ru_stime.tv_sec + SEC_PER_MICROS * stats.ru_stime.tv_usec;
478+
rusage.ru_stime.tv_sec + SEC_PER_MICROS * rusage.ru_stime.tv_usec;
485479
writer->json_keyvalue("userCpuSeconds", user_cpu);
486480
writer->json_keyvalue("kernelCpuSeconds", kernel_cpu);
487481
double cpu_abs = user_cpu + kernel_cpu;
488482
double cpu_percentage = (cpu_abs / uptime) * 100.0;
489483
writer->json_keyvalue("cpuConsumptionPercent", cpu_percentage);
490-
writer->json_keyvalue("maxRss", stats.ru_maxrss * 1024);
484+
writer->json_keyvalue("maxRss", rusage.ru_maxrss * 1024);
491485
writer->json_objectstart("pageFaults");
492-
writer->json_keyvalue("IORequired", stats.ru_majflt);
493-
writer->json_keyvalue("IONotRequired", stats.ru_minflt);
486+
writer->json_keyvalue("IORequired", rusage.ru_majflt);
487+
writer->json_keyvalue("IONotRequired", rusage.ru_minflt);
494488
writer->json_objectend();
495489
writer->json_objectstart("fsActivity");
496-
writer->json_keyvalue("reads", stats.ru_inblock);
497-
writer->json_keyvalue("writes", stats.ru_oublock);
490+
writer->json_keyvalue("reads", rusage.ru_inblock);
491+
writer->json_keyvalue("writes", rusage.ru_oublock);
498492
writer->json_objectend();
499493
}
500494
writer->json_objectend();
501495
#ifdef RUSAGE_THREAD
496+
structrusage stats;
502497
if (getrusage(RUSAGE_THREAD, &stats) == 0) {
503498
writer->json_objectstart("uvthreadResourceUsage");
504499
double user_cpu =
@@ -518,7 +513,6 @@ static void PrintResourceUsage(JSONWriter* writer) {
518513
}
519514
#endif
520515
}
521-
#endif
522516

523517
// Report operating system information.
524518
staticvoidPrintSystemInformation(JSONWriter* writer) {

‎test/common/report.js‎

Lines changed: 20 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -43,9 +43,9 @@ function _validateContent(data) {
4343
// Verify that all sections are present as own properties of the report.
4444
constsections=['header','javascriptStack','nativeStack',
4545
'javascriptHeap','libuv','environmentVariables',
46-
'sharedObjects'];
46+
'sharedObjects','resourceUsage'];
4747
if(!isWindows)
48-
sections.push('resourceUsage','userLimits');
48+
sections.push('userLimits');
4949

5050
if(report.uvthreadResourceUsage)
5151
sections.push('uvthreadResourceUsage');
@@ -133,26 +133,24 @@ function _validateContent(data) {
133133
});
134134
});
135135

136-
// Verify the format of the resourceUsage section on non-Windows platforms.
137-
if(!isWindows){
138-
constusage=report.resourceUsage;
139-
constresourceUsageFields=['userCpuSeconds','kernelCpuSeconds',
140-
'cpuConsumptionPercent','maxRss',
141-
'pageFaults','fsActivity'];
142-
checkForUnknownFields(usage,resourceUsageFields);
143-
assert.strictEqual(typeofusage.userCpuSeconds,'number');
144-
assert.strictEqual(typeofusage.kernelCpuSeconds,'number');
145-
assert.strictEqual(typeofusage.cpuConsumptionPercent,'number');
146-
assert(Number.isSafeInteger(usage.maxRss));
147-
assert(typeofusage.pageFaults==='object'&&usage.pageFaults!==null);
148-
checkForUnknownFields(usage.pageFaults,['IORequired','IONotRequired']);
149-
assert(Number.isSafeInteger(usage.pageFaults.IORequired));
150-
assert(Number.isSafeInteger(usage.pageFaults.IONotRequired));
151-
assert(typeofusage.fsActivity==='object'&&usage.fsActivity!==null);
152-
checkForUnknownFields(usage.fsActivity,['reads','writes']);
153-
assert(Number.isSafeInteger(usage.fsActivity.reads));
154-
assert(Number.isSafeInteger(usage.fsActivity.writes));
155-
}
136+
// Verify the format of the resourceUsage section.
137+
constusage=report.resourceUsage;
138+
constresourceUsageFields=['userCpuSeconds','kernelCpuSeconds',
139+
'cpuConsumptionPercent','maxRss',
140+
'pageFaults','fsActivity'];
141+
checkForUnknownFields(usage,resourceUsageFields);
142+
assert.strictEqual(typeofusage.userCpuSeconds,'number');
143+
assert.strictEqual(typeofusage.kernelCpuSeconds,'number');
144+
assert.strictEqual(typeofusage.cpuConsumptionPercent,'number');
145+
assert(Number.isSafeInteger(usage.maxRss));
146+
assert(typeofusage.pageFaults==='object'&&usage.pageFaults!==null);
147+
checkForUnknownFields(usage.pageFaults,['IORequired','IONotRequired']);
148+
assert(Number.isSafeInteger(usage.pageFaults.IORequired));
149+
assert(Number.isSafeInteger(usage.pageFaults.IONotRequired));
150+
assert(typeofusage.fsActivity==='object'&&usage.fsActivity!==null);
151+
checkForUnknownFields(usage.fsActivity,['reads','writes']);
152+
assert(Number.isSafeInteger(usage.fsActivity.reads));
153+
assert(Number.isSafeInteger(usage.fsActivity.writes));
156154

157155
// Verify the format of the uvthreadResourceUsage section, if present.
158156
if(report.uvthreadResourceUsage){

0 commit comments

Comments
 (0)