Committed by
Gerrit Code Review
Enhancing intent-perf logging
Fixing defect in distributed app mgmt Reducing DB manager heartbeat aggressiveness Change-Id: I9ba948a2b2166625c56566502143c0d27f9a2c44
Showing
5 changed files
with
43 additions
and
21 deletions
... | @@ -55,9 +55,12 @@ import java.util.concurrent.Executors; | ... | @@ -55,9 +55,12 @@ import java.util.concurrent.Executors; |
55 | import java.util.concurrent.TimeUnit; | 55 | import java.util.concurrent.TimeUnit; |
56 | 56 | ||
57 | import static com.google.common.base.Preconditions.checkState; | 57 | import static com.google.common.base.Preconditions.checkState; |
58 | +import static java.lang.String.format; | ||
58 | import static org.apache.felix.scr.annotations.ReferenceCardinality.MANDATORY_UNARY; | 59 | import static org.apache.felix.scr.annotations.ReferenceCardinality.MANDATORY_UNARY; |
59 | import static org.onlab.util.Tools.delay; | 60 | import static org.onlab.util.Tools.delay; |
60 | import static org.onlab.util.Tools.groupedThreads; | 61 | import static org.onlab.util.Tools.groupedThreads; |
62 | +import static org.onosproject.net.intent.IntentEvent.Type.INSTALLED; | ||
63 | +import static org.onosproject.net.intent.IntentEvent.Type.WITHDRAWN; | ||
61 | import static org.slf4j.LoggerFactory.getLogger; | 64 | import static org.slf4j.LoggerFactory.getLogger; |
62 | 65 | ||
63 | /** | 66 | /** |
... | @@ -119,23 +122,24 @@ public class IntentPerfInstaller { | ... | @@ -119,23 +122,24 @@ public class IntentPerfInstaller { |
119 | // we will need to discard the first few results for priming and warmup | 122 | // we will need to discard the first few results for priming and warmup |
120 | listener = new Listener(); | 123 | listener = new Listener(); |
121 | intentService.addListener(listener); | 124 | intentService.addListener(listener); |
125 | + | ||
126 | + long delay = System.currentTimeMillis() % REPORT_PERIOD; | ||
122 | reportTimer = new Timer("onos-intent-perf-reporter"); | 127 | reportTimer = new Timer("onos-intent-perf-reporter"); |
123 | reportTimer.scheduleAtFixedRate(new TimerTask() { | 128 | reportTimer.scheduleAtFixedRate(new TimerTask() { |
124 | @Override | 129 | @Override |
125 | public void run() { | 130 | public void run() { |
126 | listener.report(); | 131 | listener.report(); |
127 | } | 132 | } |
128 | - }, REPORT_PERIOD, REPORT_PERIOD); | 133 | + }, delay, REPORT_PERIOD); |
129 | 134 | ||
130 | stopped = false; | 135 | stopped = false; |
131 | worker.submit(() -> { | 136 | worker.submit(() -> { |
132 | - delay(2000); | 137 | + delay(2000); // take a breath to start |
133 | createIntents(NUM_KEYS, 2); //FIXME | 138 | createIntents(NUM_KEYS, 2); //FIXME |
134 | prime(); | 139 | prime(); |
135 | while (!stopped) { | 140 | while (!stopped) { |
136 | cycle(); | 141 | cycle(); |
137 | - // TODO delay if required | 142 | + delay(800); // take a breath |
138 | - delay(600); | ||
139 | } | 143 | } |
140 | }); | 144 | }); |
141 | 145 | ||
... | @@ -186,7 +190,6 @@ public class IntentPerfInstaller { | ... | @@ -186,7 +190,6 @@ public class IntentPerfInstaller { |
186 | } | 190 | } |
187 | 191 | ||
188 | private void createIntents(int numberOfKeys, int pathLength) { | 192 | private void createIntents(int numberOfKeys, int pathLength) { |
189 | - | ||
190 | Iterator<Device> deviceItr = deviceService.getAvailableDevices().iterator(); | 193 | Iterator<Device> deviceItr = deviceService.getAvailableDevices().iterator(); |
191 | 194 | ||
192 | Device ingressDevice = null; | 195 | Device ingressDevice = null; |
... | @@ -238,12 +241,11 @@ public class IntentPerfInstaller { | ... | @@ -238,12 +241,11 @@ public class IntentPerfInstaller { |
238 | 241 | ||
239 | class Listener implements IntentListener { | 242 | class Listener implements IntentListener { |
240 | 243 | ||
241 | - | 244 | + private final Map<IntentEvent.Type, Counter> counters; |
242 | - private Map<IntentEvent.Type, Counter> counters; | 245 | + private final Counter runningTotal = new Counter(); |
243 | 246 | ||
244 | public Listener() { | 247 | public Listener() { |
245 | counters = initCounters(); | 248 | counters = initCounters(); |
246 | - | ||
247 | } | 249 | } |
248 | 250 | ||
249 | private Map<IntentEvent.Type, Counter> initCounters() { | 251 | private Map<IntentEvent.Type, Counter> initCounters() { |
... | @@ -263,18 +265,21 @@ public class IntentPerfInstaller { | ... | @@ -263,18 +265,21 @@ public class IntentPerfInstaller { |
263 | 265 | ||
264 | public void report() { | 266 | public void report() { |
265 | StringBuilder stringBuilder = new StringBuilder(); | 267 | StringBuilder stringBuilder = new StringBuilder(); |
266 | - double total = counters.get(IntentEvent.Type.INSTALLED).throughput() + | 268 | + Counter installed = counters.get(INSTALLED); |
267 | - counters.get(IntentEvent.Type.WITHDRAWN).throughput(); | 269 | + Counter withdrawn = counters.get(WITHDRAWN); |
270 | + double current = installed.throughput() + withdrawn.throughput(); | ||
271 | + runningTotal.add(installed.total() + withdrawn.total()); | ||
268 | for (IntentEvent.Type type : IntentEvent.Type.values()) { | 272 | for (IntentEvent.Type type : IntentEvent.Type.values()) { |
269 | stringBuilder.append(printCounter(type)).append("; "); | 273 | stringBuilder.append(printCounter(type)).append("; "); |
270 | } | 274 | } |
271 | - stringBuilder.append(String.format("TOTAL=%.2f", total)); | 275 | + log.info("Throughput: OVERALL={}; CURRENT={}; {}", |
272 | - log.info("Intent Throughput:\n{}", stringBuilder); | 276 | + format("%.2f", runningTotal.throughput()), |
277 | + format("%.2f", current), stringBuilder); | ||
273 | } | 278 | } |
274 | 279 | ||
275 | private String printCounter(IntentEvent.Type event) { | 280 | private String printCounter(IntentEvent.Type event) { |
276 | Counter counter = counters.get(event); | 281 | Counter counter = counters.get(event); |
277 | - String result = String.format("%s=%.2f", event, counter.throughput()); | 282 | + String result = format("%s=%.2f", event, counter.throughput()); |
278 | counter.reset(); | 283 | counter.reset(); |
279 | return result; | 284 | return result; |
280 | } | 285 | } | ... | ... |
... | @@ -148,7 +148,7 @@ public class ApplicationArchive | ... | @@ -148,7 +148,7 @@ public class ApplicationArchive |
148 | * archive stream or store | 148 | * archive stream or store |
149 | * the application archive | 149 | * the application archive |
150 | */ | 150 | */ |
151 | - public ApplicationDescription saveApplication(InputStream stream) { | 151 | + public synchronized ApplicationDescription saveApplication(InputStream stream) { |
152 | try (InputStream ais = stream) { | 152 | try (InputStream ais = stream) { |
153 | byte[] cache = toByteArray(ais); | 153 | byte[] cache = toByteArray(ais); |
154 | InputStream bis = new ByteArrayInputStream(cache); | 154 | InputStream bis = new ByteArrayInputStream(cache); |
... | @@ -190,7 +190,7 @@ public class ApplicationArchive | ... | @@ -190,7 +190,7 @@ public class ApplicationArchive |
190 | * | 190 | * |
191 | * @param appName application name | 191 | * @param appName application name |
192 | */ | 192 | */ |
193 | - public void purgeApplication(String appName) { | 193 | + public synchronized void purgeApplication(String appName) { |
194 | File appDir = new File(appsDir, appName); | 194 | File appDir = new File(appsDir, appName); |
195 | try { | 195 | try { |
196 | Tools.removeDirectory(appDir); | 196 | Tools.removeDirectory(appDir); |
... | @@ -209,7 +209,7 @@ public class ApplicationArchive | ... | @@ -209,7 +209,7 @@ public class ApplicationArchive |
209 | * @param appName application name | 209 | * @param appName application name |
210 | * @return application archive stream | 210 | * @return application archive stream |
211 | */ | 211 | */ |
212 | - public InputStream getApplicationInputStream(String appName) { | 212 | + public synchronized InputStream getApplicationInputStream(String appName) { |
213 | try { | 213 | try { |
214 | File appFile = appFile(appName, appName + ".zip"); | 214 | File appFile = appFile(appName, appName + ".zip"); |
215 | return new FileInputStream(appFile.exists() ? appFile : appFile(appName, APP_XML)); | 215 | return new FileInputStream(appFile.exists() ? appFile : appFile(appName, APP_XML)); | ... | ... |
... | @@ -104,8 +104,8 @@ public class DatabaseManager implements StorageService { | ... | @@ -104,8 +104,8 @@ public class DatabaseManager implements StorageService { |
104 | .withReceiveBufferSize(32768) | 104 | .withReceiveBufferSize(32768) |
105 | .withSendBufferSize(8192) | 105 | .withSendBufferSize(8192) |
106 | .withThreads(1)) | 106 | .withThreads(1)) |
107 | - .withElectionTimeout(300) | 107 | + .withElectionTimeout(3000) |
108 | - .withHeartbeatInterval(150) | 108 | + .withHeartbeatInterval(1500) |
109 | .withMembers(activeNodeUris) | 109 | .withMembers(activeNodeUris) |
110 | .withLocalMember(localNodeUri); | 110 | .withLocalMember(localNodeUri); |
111 | 111 | ||
... | @@ -114,8 +114,8 @@ public class DatabaseManager implements StorageService { | ... | @@ -114,8 +114,8 @@ public class DatabaseManager implements StorageService { |
114 | partitionMap.forEach((name, nodes) -> { | 114 | partitionMap.forEach((name, nodes) -> { |
115 | Set<String> replicas = nodes.stream().map(this::nodeToUri).collect(Collectors.toSet()); | 115 | Set<String> replicas = nodes.stream().map(this::nodeToUri).collect(Collectors.toSet()); |
116 | DatabaseConfig partitionConfig = new DatabaseConfig() | 116 | DatabaseConfig partitionConfig = new DatabaseConfig() |
117 | - .withElectionTimeout(300) | 117 | + .withElectionTimeout(3000) |
118 | - .withHeartbeatInterval(150) | 118 | + .withHeartbeatInterval(1500) |
119 | .withConsistency(Consistency.STRONG) | 119 | .withConsistency(Consistency.STRONG) |
120 | .withLog(new FileLog() | 120 | .withLog(new FileLog() |
121 | .withDirectory(logDir) | 121 | .withDirectory(logDir) | ... | ... |
... | @@ -4,7 +4,7 @@ | ... | @@ -4,7 +4,7 @@ |
4 | # ----------------------------------------------------------------------------- | 4 | # ----------------------------------------------------------------------------- |
5 | 5 | ||
6 | #export JAVA_HOME=${JAVA_HOME:-/usr/lib/jvm/java-7-openjdk-amd64/} | 6 | #export JAVA_HOME=${JAVA_HOME:-/usr/lib/jvm/java-7-openjdk-amd64/} |
7 | -export JAVA_OPTS="${JAVA_OPTS:--Xms256m -Xmx2048m}" | 7 | +export JAVA_OPTS="${JAVA_OPTS:--Xms256m -Xmx2g}" |
8 | 8 | ||
9 | ONOS_HOME=/opt/onos | 9 | ONOS_HOME=/opt/onos |
10 | 10 | ... | ... |
tools/test/bin/onos-intentperf-scrape
0 → 100755
1 | +#!/bin/bash | ||
2 | +# ----------------------------------------------------------------------------- | ||
3 | +# Scrapes intent performance numbers from the remote ONOS log file. | ||
4 | +# ----------------------------------------------------------------------------- | ||
5 | + | ||
6 | +[ ! -d "$ONOS_ROOT" ] && echo "ONOS_ROOT is not defined" >&2 && exit 1 | ||
7 | +. $ONOS_ROOT/tools/build/envDefaults | ||
8 | + | ||
9 | +nodes=$(env | sort | egrep "OC[0-9]+" | cut -d= -f2) | ||
10 | + | ||
11 | +for node in $nodes; do | ||
12 | + echo "fetching from ${node}..." | ||
13 | + ssh $ONOS_USER@${node} " | ||
14 | + grep 'Throughput: OVERALL=' $ONOS_INSTALL_DIR/log/karaf.log \ | ||
15 | + | sed 's/ | INFO .*\: OVERALL=/|/;s/\; INSTALL_REQ=.*//;s/\; CURRENT=/|/' | cut -c12- | ||
16 | + " > ${node}.perf.log | ||
17 | +done |
-
Please register or login to post a comment