| package net.floodlightcontroller.perfmon; |
| |
| import org.codehaus.jackson.annotate.JsonProperty; |
| |
| import net.floodlightcontroller.core.IOFMessageListener; |
| |
| /** |
| * Holds OF message processing time information for one IFloodlightModule. |
| * @author Subrata |
| */ |
| public class OneComponentTime { |
| private int compId; // hascode of IOFMessageListener |
| private String compName; |
| private int pktCnt; |
| // all times in nanoseconds |
| private long totalProcTimeNs; |
| private long sumSquaredProcTimeNs2; // squared |
| private long maxProcTimeNs; |
| private long minProcTimeNs; |
| private long avgProcTimeNs; |
| private long sigmaProcTimeNs; // std. deviation |
| |
| public OneComponentTime(IOFMessageListener module) { |
| compId = module.hashCode(); |
| compName = module.getClass().getCanonicalName(); |
| resetAllCounters(); |
| } |
| |
| public void resetAllCounters() { |
| maxProcTimeNs = Long.MIN_VALUE; |
| minProcTimeNs = Long.MAX_VALUE; |
| pktCnt = 0; |
| totalProcTimeNs = 0; |
| sumSquaredProcTimeNs2 = 0; |
| avgProcTimeNs = 0; |
| sigmaProcTimeNs = 0; |
| } |
| |
| @JsonProperty("module-name") |
| public String getCompName() { |
| return compName; |
| } |
| |
| @JsonProperty("num-packets") |
| public int getPktCnt() { |
| return pktCnt; |
| } |
| |
| @JsonProperty("total") |
| public long getSumProcTimeNs() { |
| return totalProcTimeNs; |
| } |
| |
| @JsonProperty("max") |
| public long getMaxProcTimeNs() { |
| return maxProcTimeNs; |
| } |
| |
| @JsonProperty("min") |
| public long getMinProcTimeNs() { |
| return minProcTimeNs; |
| } |
| |
| @JsonProperty("average") |
| public long getAvgProcTimeNs() { |
| return avgProcTimeNs; |
| } |
| |
| @JsonProperty("std-dev") |
| public long getSigmaProcTimeNs() { |
| return sigmaProcTimeNs; |
| } |
| |
| @JsonProperty("average-squared") |
| public long getSumSquaredProcTimeNs() { |
| return sumSquaredProcTimeNs2; |
| } |
| |
| // Methods used to update the counters |
| |
| private void increasePktCount() { |
| pktCnt++; |
| } |
| |
| private void updateTotalProcessingTime(long procTimeNs) { |
| totalProcTimeNs += procTimeNs; |
| } |
| |
| private void updateAvgProcessTime() { |
| avgProcTimeNs = totalProcTimeNs / pktCnt; |
| } |
| |
| private void updateSquaredProcessingTime(long procTimeNs) { |
| sumSquaredProcTimeNs2 += (Math.pow(procTimeNs, 2)); |
| } |
| |
| private void calculateMinProcTime(long curTimeNs) { |
| if (curTimeNs < minProcTimeNs) |
| minProcTimeNs = curTimeNs; |
| } |
| |
| private void calculateMaxProcTime(long curTimeNs) { |
| if (curTimeNs > maxProcTimeNs) |
| maxProcTimeNs = curTimeNs; |
| } |
| |
| public void computeSigma() { |
| // Computes std. deviation from the sum of count numbers and from |
| // the sum of the squares of count numbers |
| double temp = totalProcTimeNs; |
| temp = Math.pow(temp, 2) / pktCnt; |
| temp = (sumSquaredProcTimeNs2 - temp) / pktCnt; |
| sigmaProcTimeNs = (long) Math.sqrt(temp); |
| } |
| |
| public void updatePerPacketCounters(long procTimeNs) { |
| increasePktCount(); |
| updateTotalProcessingTime(procTimeNs); |
| calculateMinProcTime(procTimeNs); |
| calculateMaxProcTime(procTimeNs); |
| updateAvgProcessTime(); |
| updateSquaredProcessingTime(procTimeNs); |
| } |
| |
| @Override |
| public int hashCode() { |
| return compId; |
| } |
| } |