#!/bin/env python ## ## Copyright (c) 2010-2017 Intel Corporation ## ## Licensed under the Apache License, Version 2.0 (the "License"); ## you may not use this file except in compliance with the License. ## You may obtain a copy of the License at ## ## http://www.apache.org/licenses/LICENSE-2.0 ## ## Unless required by applicable law or agreed to in writing, software ## distributed under the License is distributed on an "AS IS" BASIS, ## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ## See the License for the specific language governing permissions and ## limitations under the License. ## from prox import * from remotesystem import * from time import * from decimal import * from timeseriespoint import * class TestParameters: def __init__(self, max_setup_rate, total_connections, ss): self.max_setup_rate = max_setup_rate; self.total_connections = total_connections; self.ss = ss; def toString(self): ret = "" ret += "\tMaximum setup rate = %d\n" % self.max_setup_rate ret += "\tTotal number of connections = %d\n" % self.total_connections ret += "\tSpeed scaling = %s\n" % str(self.ss) return ret; def getPerSystem(self, count): msr = self.max_setup_rate / count cnn = self.total_connections / count return TestParameters(msr, cnn, self.ss); def getConnections(self): return self.total_connections; class ProxDpiTester(Prox): TENGIGABITBYTESPERSECOND = 1250000000 def __init__(self, ts, testParam, ID): super(ProxDpiTester, self).__init__(ts) self._sc = None self._lastTot = None self._prevTot = None; self._prevBytesClient = None self._lastBytesClient = None self._prevBytesTxMeassurement = None self._lastBytesTxMeassurement = None self._setDefaultArguments(); self._setMsr(testParam.max_setup_rate) self._setConnections(testParam.total_connections); self._setSpeedScaling(testParam.ss); self._setID(ID); def _setDefaultArguments(self): self.addArgument("-e") self.addArgument("-t") self.addArgument("-k") self.addArgument("-d") self.addArgument("-r 0.01"); def _setMsr(self, msr): self.addArgument("-q max_setup_rate=" + str(msr)) def _setConnections(self, connections): self.addArgument("-q connections=" + str(connections)) def _setID(self, ID): self.addArgument("-q test_system_id=" + str(ID)) def _setSpeedScaling(self, ss): self.addArgument("-q ss=" + str(ss)) def _querySetup2(self): self._query_client_ports(); self._query_server_ports(); self._query_cores(); def _query_client_ports(self): self._client_ports = [] for i in range(0, len(self._ports), 2): self._client_ports.append(self._ports[i]); def _query_server_ports(self): self._server_ports = [] for i in range(1, len(self._ports), 2): self._server_ports.append(self._ports[i]); def _query_cores(self): self._query_ld(); self._query_servers(); self._query_clients(); def _query_ld(self): self._ld = self._get_core_list("$all_ld"); def _query_servers(self): self._servers = self._get_core_list("$all_servers") def _query_clients(self): self._clients = self._get_core_list("$all_clients") def _get_core_list(self, var): ret = [] result = self._send("echo " + var)._recv(); for e in result.split(","): ret += [e]; return ret; def start_all_ld(self): self._send("start $all_ld"); def start_all_workers(self): self._send("start $all_workers"); def stop_all_ld(self): self._send("stop $all_ld"); def stop_all_workers(self): self._send("stop $all_workers"); def update_stats(self): if (self._sc is None): self._sc = StatsCmd(self) self._sc.add(self._buildTotalConnectionsCmd()) self._sc.add(self._buildReTXCmd()) self._sc.add(self._buildIerrorsCmd()) self._sc.add(self._buildBytesPerPortCmd(self._client_ports, "rx")); self._sc.sendRecv() self._updateTotalConnections(self._sc.getResult(0)) self._updateReTX(self._sc.getResult(1)) self._updateIerrors(self._sc.getResult(2)) self._update_rates_client_ports(self._sc.getResult(3)); def _buildTotalConnectionsCmd(self): cmd = "l4gen(%s).tsc" % str(self._clients[0]) for core in self._clients: if (len(cmd) > 0): cmd += "," cmd += "l4gen(%s).created,l4gen(%s).finished" % (str(core), str(core)) return cmd; def _updateTotalConnections(self, rep): instant = Decimal(int(rep[0]) - self._beg)/self._hz rep = rep[1:] tot = 0; for i in range(0,len(rep), 2): tot += int(rep[i]) - int(rep[i + 1]); prev = self._lastTot; last = TimeSeriesPoint(tot, instant); if (prev == None): prev = last; self._prevTot = prev self._lastTot = last; def _buildReTXCmd(self): cmd = "" for core in self._clients + self._servers: if (len(cmd) > 0): cmd += "," cmd += "l4gen(%s).retx" % str(core) return cmd; def _updateReTX(self, rep): retx = 0; for i in rep: retx += int(i); self._retx = retx; def _updateIerrors(self, rep): self._ierrors = self._parseIerrorsReply(rep) def get_total_connections(self): return self._lastTot.getValue() def getCurrentSetupRate(self): return int(self._lastTot.getRateOfChange(self._prevTot)); def get_total_retx(self): return self._retx def get_rates_client_ports(self): return self._calcLinkUtilization(self._prevBytesClient, self._lastBytesClient); def getIerrorsCached(self): return self._ierrors; def _update_rates_client_ports(self, rep): prevBytes = self._lastBytesClient lastBytes = self._parseTimeSeries(rep); if (prevBytes == None): prevBytes = lastBytes; self._prevBytesClient = prevBytes; self._lastBytesClient = lastBytes; def _getBytesPerPort(self, ports, rxOrTx): sc = StatsCmd(self); sc.add(self._buildBytesPerPortCmd(ports, rxOrTx)) sc.sendRecv(); rep = sc.getResult(0); return self._parseTimeSeries(rep); def _buildBytesPerPortCmd(self, ports, rxOrTx): cmd = "" for port in ports: if (len(cmd) > 0): cmd += "," cmd += "port(%s).%s.bytes,port(%s).tsc" % (str(port), rxOrTx, str(port)); return cmd def tx_rate_meassurement(self): prev = self._lastBytesTxMeassurement last = self._getBytesPerPort(self._server_ports, "tx"); if (prev == None): prev = last; self._prevBytesTxMeassurement = prev self._lastBytesTxMeassurement = last return self._calcLinkUtilization(prev, last); def _parseTimeSeries(self, rep): ret = [] for i in range(0, len(rep), 2): val = int(rep[0]) instant = Decimal(int(rep[1]) - self._beg)/self._hz ret.append(TimeSeriesPoint(val, instant)); return ret; def _calcLinkUtilization(self, prev, last): ret = [] for i in range(0, len(prev)): bytesPerSecond = last[i].getRateOfChange(prev[i]); linkFraction = Decimal(bytesPerSecond)/self.TENGIGABITBYTESPERSECOND ret.append(round(linkFraction,2)); return ret;