[overhead] - Add network average read/write to output (#3872)

* add average network read/write to the output results.

* guard against div/zero
This commit is contained in:
jason plumb 2021-08-23 21:52:18 -07:00 committed by GitHub
parent fa168268c5
commit e439c153c8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 53 additions and 1 deletions

View File

@ -21,6 +21,8 @@ public class AppPerfResults {
final float maxThreadContextSwitchRate; final float maxThreadContextSwitchRate;
final long startupDurationMs; final long startupDurationMs;
final long peakThreadCount; final long peakThreadCount;
final long averageNetworkRead;
final long averageNetworkWrite;
private AppPerfResults(Builder builder) { private AppPerfResults(Builder builder) {
this.agent = builder.agent; this.agent = builder.agent;
@ -35,6 +37,8 @@ public class AppPerfResults {
this.maxThreadContextSwitchRate = builder.maxThreadContextSwitchRate; this.maxThreadContextSwitchRate = builder.maxThreadContextSwitchRate;
this.startupDurationMs = builder.startupDurationMs; this.startupDurationMs = builder.startupDurationMs;
this.peakThreadCount = builder.peakThreadCount; this.peakThreadCount = builder.peakThreadCount;
this.averageNetworkRead = builder.averageNetworkRead;
this.averageNetworkWrite = builder.averageNetworkWrite;
} }
double getTotalAllocatedMB() { double getTotalAllocatedMB() {
@ -61,6 +65,8 @@ public class AppPerfResults {
private MinMax heapUsed; private MinMax heapUsed;
private float maxThreadContextSwitchRate; private float maxThreadContextSwitchRate;
private long peakThreadCount; private long peakThreadCount;
public long averageNetworkRead;
public long averageNetworkWrite;
AppPerfResults build() { AppPerfResults build() {
return new AppPerfResults(this); return new AppPerfResults(this);
@ -125,6 +131,16 @@ public class AppPerfResults {
this.peakThreadCount = peakThreadCount; this.peakThreadCount = peakThreadCount;
return this; return this;
} }
Builder averageNetworkRead(long averageNetworkRead){
this.averageNetworkRead = averageNetworkRead;
return this;
}
Builder averageNetworkWrite(long averageNetworkWrite){
this.averageNetworkWrite = averageNetworkWrite;
return this;
}
} }
public static class MinMax { public static class MinMax {

View File

@ -39,6 +39,8 @@ class CsvPersister implements ResultsPersister {
sb.append(",").append(result.iterationP95); sb.append(",").append(result.iterationP95);
sb.append(",").append(result.requestAvg); sb.append(",").append(result.requestAvg);
sb.append(",").append(result.requestP95); sb.append(",").append(result.requestP95);
sb.append(",").append(result.averageNetworkRead);
sb.append(",").append(result.averageNetworkWrite);
sb.append(",").append(result.peakThreadCount); sb.append(",").append(result.peakThreadCount);
}); });
sb.append("\n"); sb.append("\n");
@ -79,6 +81,8 @@ class CsvPersister implements ResultsPersister {
sb.append(",").append(agent).append(":iterationP95"); sb.append(",").append(agent).append(":iterationP95");
sb.append(",").append(agent).append(":requestAvg"); sb.append(",").append(agent).append(":requestAvg");
sb.append(",").append(agent).append(":requestP95"); sb.append(",").append(agent).append(":requestP95");
sb.append(",").append(agent).append(":netReadAvg");
sb.append(",").append(agent).append(":netWriteAvg");
sb.append(",").append(agent).append(":peakThreadCount"); sb.append(",").append(agent).append(":peakThreadCount");
}); });
sb.append("\n"); sb.append("\n");

View File

@ -41,6 +41,8 @@ class PrintStreamPersister implements ResultsPersister {
display(sorted, "Req. p95", res -> format(res.requestP95)); display(sorted, "Req. p95", res -> format(res.requestP95));
display(sorted, "Iter. mean", res -> format(res.iterationAvg)); display(sorted, "Iter. mean", res -> format(res.iterationAvg));
display(sorted, "Iter. p95", res -> format(res.iterationP95)); display(sorted, "Iter. p95", res -> format(res.iterationP95));
display(sorted, "Net read avg (bps)", res -> format(res.averageNetworkRead));
display(sorted, "Net write avg (bps)", res -> format(res.averageNetworkWrite));
display(sorted, "Peak threads", res -> String.valueOf(res.peakThreadCount)); display(sorted, "Peak threads", res -> String.valueOf(res.peakThreadCount));
} }

View File

@ -75,7 +75,17 @@ public class ResultsCollector {
.totalAllocated(readTotalAllocated(jfrFile)) .totalAllocated(readTotalAllocated(jfrFile))
.heapUsed(readHeapUsed(jfrFile)) .heapUsed(readHeapUsed(jfrFile))
.maxThreadContextSwitchRate(readMaxThreadContextSwitchRate(jfrFile)) .maxThreadContextSwitchRate(readMaxThreadContextSwitchRate(jfrFile))
.peakThreadCount(readPeakThreadCount(jfrFile)); .peakThreadCount(readPeakThreadCount(jfrFile))
.averageNetworkRead(computeAverageNetworkRead(jfrFile))
.averageNetworkWrite(computeAverageNetworkWrite(jfrFile));
}
private long computeAverageNetworkRead(Path jfrFile) throws IOException {
return JFRUtils.findAverageLong(jfrFile, "jdk.NetworkUtilization", "readRate");
}
private long computeAverageNetworkWrite(Path jfrFile) throws IOException {
return JFRUtils.findAverageLong(jfrFile, "jdk.NetworkUtilization", "writeRate");
} }
private long readPeakThreadCount(Path jfrFile) throws IOException { private long readPeakThreadCount(Path jfrFile) throws IOException {

View File

@ -34,6 +34,12 @@ public class JFRUtils {
}); });
} }
public static long findAverageLong(Path jfrFile, String eventName, String valueKey) throws IOException {
return reduce(jfrFile, eventName, valueKey,
new AverageSupport(),
AverageSupport::add).average();
}
private static <T, V> T reduce(Path jfrFile, String eventName, private static <T, V> T reduce(Path jfrFile, String eventName,
String valueKey, T initial, BiFunction<T,V,T> reducer) throws IOException { String valueKey, T initial, BiFunction<T,V,T> reducer) throws IOException {
RecordingFile recordingFile = new RecordingFile(jfrFile); RecordingFile recordingFile = new RecordingFile(jfrFile);
@ -47,4 +53,18 @@ public class JFRUtils {
} }
return result; return result;
} }
static class AverageSupport {
long count;
long total;
AverageSupport add(long value){
count++;
total += value;
return this;
}
long average(){
if(count == 0) return -1;
return total/count;
}
}
} }