[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:
parent
fa168268c5
commit
e439c153c8
|
@ -21,6 +21,8 @@ public class AppPerfResults {
|
|||
final float maxThreadContextSwitchRate;
|
||||
final long startupDurationMs;
|
||||
final long peakThreadCount;
|
||||
final long averageNetworkRead;
|
||||
final long averageNetworkWrite;
|
||||
|
||||
private AppPerfResults(Builder builder) {
|
||||
this.agent = builder.agent;
|
||||
|
@ -35,6 +37,8 @@ public class AppPerfResults {
|
|||
this.maxThreadContextSwitchRate = builder.maxThreadContextSwitchRate;
|
||||
this.startupDurationMs = builder.startupDurationMs;
|
||||
this.peakThreadCount = builder.peakThreadCount;
|
||||
this.averageNetworkRead = builder.averageNetworkRead;
|
||||
this.averageNetworkWrite = builder.averageNetworkWrite;
|
||||
}
|
||||
|
||||
double getTotalAllocatedMB() {
|
||||
|
@ -61,6 +65,8 @@ public class AppPerfResults {
|
|||
private MinMax heapUsed;
|
||||
private float maxThreadContextSwitchRate;
|
||||
private long peakThreadCount;
|
||||
public long averageNetworkRead;
|
||||
public long averageNetworkWrite;
|
||||
|
||||
AppPerfResults build() {
|
||||
return new AppPerfResults(this);
|
||||
|
@ -125,6 +131,16 @@ public class AppPerfResults {
|
|||
this.peakThreadCount = peakThreadCount;
|
||||
return this;
|
||||
}
|
||||
|
||||
Builder averageNetworkRead(long averageNetworkRead){
|
||||
this.averageNetworkRead = averageNetworkRead;
|
||||
return this;
|
||||
}
|
||||
|
||||
Builder averageNetworkWrite(long averageNetworkWrite){
|
||||
this.averageNetworkWrite = averageNetworkWrite;
|
||||
return this;
|
||||
}
|
||||
}
|
||||
|
||||
public static class MinMax {
|
||||
|
|
|
@ -39,6 +39,8 @@ class CsvPersister implements ResultsPersister {
|
|||
sb.append(",").append(result.iterationP95);
|
||||
sb.append(",").append(result.requestAvg);
|
||||
sb.append(",").append(result.requestP95);
|
||||
sb.append(",").append(result.averageNetworkRead);
|
||||
sb.append(",").append(result.averageNetworkWrite);
|
||||
sb.append(",").append(result.peakThreadCount);
|
||||
});
|
||||
sb.append("\n");
|
||||
|
@ -79,6 +81,8 @@ class CsvPersister implements ResultsPersister {
|
|||
sb.append(",").append(agent).append(":iterationP95");
|
||||
sb.append(",").append(agent).append(":requestAvg");
|
||||
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("\n");
|
||||
|
|
|
@ -41,6 +41,8 @@ class PrintStreamPersister implements ResultsPersister {
|
|||
display(sorted, "Req. p95", res -> format(res.requestP95));
|
||||
display(sorted, "Iter. mean", res -> format(res.iterationAvg));
|
||||
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));
|
||||
}
|
||||
|
||||
|
|
|
@ -75,7 +75,17 @@ public class ResultsCollector {
|
|||
.totalAllocated(readTotalAllocated(jfrFile))
|
||||
.heapUsed(readHeapUsed(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 {
|
||||
|
|
|
@ -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,
|
||||
String valueKey, T initial, BiFunction<T,V,T> reducer) throws IOException {
|
||||
RecordingFile recordingFile = new RecordingFile(jfrFile);
|
||||
|
@ -47,4 +53,18 @@ public class JFRUtils {
|
|||
}
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue