some fixes for performance measurments and added plot
diff --git a/perf-scripts/flow-manager-perf.py b/perf-scripts/flow-manager-perf.py
index 4ee6beb..9eb022e 100644
--- a/perf-scripts/flow-manager-perf.py
+++ b/perf-scripts/flow-manager-perf.py
@@ -28,7 +28,7 @@
print "ONOS Log File:", ONOS_LOG
PORT = 's1-eth2'
-N = 5
+N = 1
# ----------------- Running the test and output -------------------------
@@ -39,10 +39,11 @@
self.onosTime = onosTime
self.overhead = overhead
# sorted by start time
- self.details = sorted(details, key=lambda x: float(x[2]) )
+ self.tags = sorted(details, key=lambda x: float(x[2]))
+ self.details = sorted(details, key=lambda x: float(x[2]), reverse=True)
def __repr__(self):
- return '%f %f %f %d %s' % (self.tsharkTime, self.onosTime, self.overhead, self.flowmods, self.details)
+ return '%f %f %f %d %s' % (self.tsharkTime, self.onosTime, self.overhead, self.flowmods, self.tags)
def clearResults():
@@ -85,6 +86,7 @@
timeout = 3 #sec
elapsed = (end - start) * 1000
+ sleep(2)
# read the performance results from ONOS
reportResults() # REST call
@@ -97,7 +99,7 @@
result = Result(elapsed, count, totalTime, overhead, tags)
# Output results
print result
-
+ plot(result)
# Bring port back up
call( 'ifconfig %s up' % PORT, shell=True )
@@ -126,6 +128,88 @@
totalTime = datetime.now() - start
print '\nExperiments complete in %s (h:m:s.s)' % totalTime
+def plot(result):
+ import matplotlib.pyplot as plt
+ import pylab
+ import numpy as np
+ from matplotlib.ticker import MaxNLocator
+
+ tags = [ x[0] for x in result.details ]
+ numTags = len(tags)
+ scores = [ float(x[1]) for x in result.details ]
+ offset = [ float(x[2]) for x in result.details ]
+ rankings = [ float(x[3]) - float(x[2]) for x in result.details ]
+ counts = [ x[4] for x in result.details ]
+
+ fig, ax1 = plt.subplots(figsize=(15, 9))
+ plt.subplots_adjust(left=0.3, right=0.8)
+ pos = np.arange(numTags)+0.5 # Center bars on the Y-axis ticks
+ rects = ax1.barh(pos, rankings, left=offset, align='center', height=0.5, color='m')
+
+ ax1.axis([0, result.onosTime, 0, numTags])
+ pylab.yticks(pos, tags)
+ ax1.set_title('TITLE HERE')
+ #plt.text(result.onosTime/2, -0.5,
+ # 'Iteration: ' + str(1), horizontalalignment='center', size='small')
+
+ # Set the right-hand Y-axis ticks and labels and set X-axis tick marks at the
+ # deciles
+ ax2 = ax1.twinx()
+ print MaxNLocator(7)
+ ax2.xaxis.set_major_locator(MaxNLocator(7)) # max number of xaxis ticks
+ #ax2.plot([100, 100], [0, 5], 'white', alpha=0.1)
+ ax2.xaxis.grid(True, linestyle='--', which='major', color='grey', alpha=0.25)
+ #Plot a solid vertical gridline to highlight the median position
+ #plt.plot([50, 50], [0, 5], 'grey', alpha=0.25)
+
+ # Build up the score labels for the right Y-axis by first appending a carriage
+ # return to each string and then tacking on the appropriate meta information
+ # (i.e., 'laps' vs 'seconds'). We want the labels centered on the ticks, so if
+ # there is no meta info (like for pushups) then don't add the carriage return to
+ # the string
+
+ '''
+ scoreLabels = [withnew(i, scr) for i, scr in enumerate(scores)]
+ scoreLabels = [i+j for i, j in zip(scoreLabels, testMeta)]
+ '''
+ scoreLabels = ['%.3f ms\n%s'%(i,j) for i,j in zip(scores,counts)]
+ # set the tick locations
+ ax2.set_yticks(pos)
+ # set the tick labels
+ ax2.set_yticklabels(scoreLabels)
+ # make sure that the limits are set equally on both yaxis so the ticks line up
+ ax2.set_ylim(ax1.get_ylim())
+
+ ax1.set_xlabel('Time (ms)')
+ ax2.set_ylabel('Average iteration / Count')
+
+ # Lastly, write in the ranking inside each bar to aid in interpretation
+ for rect in rects:
+ # Rectangle widths are already integer-valued but are floating
+ # type, so it helps to remove the trailing decimal point and 0 by
+ # converting width to int type
+ width = int(rect.get_width())
+ offset = int(rect.get_x())
+ percent = width / result.onosTime
+ onePercent = 0.01 * result.onosTime
+
+ rankStr = str(width) + 'ms'
+ if (percent < 0.09): # The bars aren't wide enough to print the ranking inside
+ xloc = offset + width + onePercent # Shift the text to the right side of the right edge
+ clr = 'black' # Black against white background
+ align = 'left'
+ else:
+ xloc = offset + 0.98*width # Shift the text to the left side of the right edge
+ clr = 'white' # White on magenta
+ align = 'right'
+
+ # Center the text vertically in the bar
+ yloc = rect.get_y()+rect.get_height()/2.0
+ ax1.text(xloc, yloc, rankStr, horizontalalignment=align,
+ verticalalignment='center', color=clr)
+
+ plt.show()
+ plt.savefig('test.png')
if __name__ == '__main__':
n = N
runPerf(n)
diff --git a/src/main/java/net/onrc/onos/ofcontroller/floodlightlistener/NetworkGraphPublisher.java b/src/main/java/net/onrc/onos/ofcontroller/floodlightlistener/NetworkGraphPublisher.java
index 6638ac0..37ed4aa 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/floodlightlistener/NetworkGraphPublisher.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/floodlightlistener/NetworkGraphPublisher.java
@@ -360,8 +360,8 @@
List<Link> reverseLinks = linkStore.getReverseLinks(switchId, port.getPortNumber());
links.addAll(reverseLinks);
+ PerformanceMonitor.stop("SwitchPortRemoved.DbAccess");
if (swStore.deletePort(HexString.toHexString(switchId), port.getPortNumber())) {
- PerformanceMonitor.stop("SwitchPortRemoved.DbAccess");
PerformanceMonitor.start("SwitchPortRemoved.NotificationSend");
// TODO publish DELETE_PORT event here
TopologyElement topologyElement =
diff --git a/src/main/java/net/onrc/onos/ofcontroller/flowmanager/ParallelFlowDatabaseOperation.java b/src/main/java/net/onrc/onos/ofcontroller/flowmanager/ParallelFlowDatabaseOperation.java
index 50834d2..55aeb97 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/flowmanager/ParallelFlowDatabaseOperation.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/flowmanager/ParallelFlowDatabaseOperation.java
@@ -268,7 +268,7 @@
PerformanceMonitor.Measurement m;
m = PerformanceMonitor.start(tag1);
boolean success = FlowDatabaseOperation.addFlow(dbHandler, flowPath);
- PerformanceMonitor.stop(tag1);
+// PerformanceMonitor.stop(tag1);
m.stop();
m = PerformanceMonitor.start(tag2);
if(success) {
diff --git a/src/main/java/net/onrc/onos/ofcontroller/flowmanager/PerformanceMonitor.java b/src/main/java/net/onrc/onos/ofcontroller/flowmanager/PerformanceMonitor.java
index 7c38a3c..fa75460 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/flowmanager/PerformanceMonitor.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/flowmanager/PerformanceMonitor.java
@@ -54,13 +54,11 @@
public static void stop(String tag) {
long time = System.nanoTime();
List<Measurement> list = map.get(tag);
- if(list == null) {
+ if(list == null || list.size() == 0) {
log.error("Tag {} does not exist", tag);
}
- else if(list.size() == 1) {
- list.get(0).stop(time);
- }
- else {
+ list.get(0).stop(time);
+ if(list.size() > 1) {
log.error("Tag {} has multiple measurements", tag);
}
overhead += System.nanoTime() - time;
@@ -92,6 +90,9 @@
int total = 0, count = 0;
long start = Long.MAX_VALUE, stop = -1;
for(Measurement m : list) {
+ if(m.stop < 0) {
+ continue; // measurement has not been stopped
+ }
// Collect overall start and end times
if(m.start < start) {
start = m.start;
@@ -101,8 +102,7 @@
if(stop > experimentEnd) {
experimentEnd = stop;
}
- }
-
+ }
// Collect statistics for average
total += m.elapsed();
count++;
@@ -155,7 +155,9 @@
* Start the measurement
*/
public void start() {
- start = System.nanoTime();
+ if(start <= 0) {
+ start = System.nanoTime();
+ }
}
/**
@@ -171,7 +173,9 @@
* @param time to stop
*/
public void stop(long time){
- stop = time;
+ if(stop <= 0) {
+ stop = time;
+ }
}
/**
@@ -217,15 +221,24 @@
report();
clear();
}
-// for(int i = 0; i < 100; i++){
-// tag = "a";
-// start(tag); stop(tag);
-// tag = "b";
-// start(tag); stop(tag);
-// tag = "c";
-// start(tag); stop(tag);
-// report();
-// clear();
-// }
+ for(int i = 0; i < 100; i++){
+ tag = "a";
+ start(tag); stop(tag);
+ start(tag); stop(tag);
+
+ start(tag); stop(tag);
+ start(tag); stop(tag);
+ start(tag); stop(tag);
+ start(tag); stop(tag);
+ start(tag); stop(tag);
+ start(tag); stop(tag);
+
+ tag = "b";
+ start(tag); stop(tag);
+ tag = "c";
+ start(tag); stop(tag);
+ report();
+ clear();
+ }
}
}