[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 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 {
|
||||||
|
|
|
@ -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");
|
||||||
|
|
|
@ -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));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue