1fa3827ac4130595ebb93b40a9e5cb0abc6715e0cGwendal Grignouimport os, time, logging 267a72f9db02009cee4a8ae90720190c8f83ddef6mblighfrom autotest_lib.client.bin import test, utils 3443942444d5888634ae6faa314f89425dacc8002mblighfrom autotest_lib.client.bin.net import net_utils 467a72f9db02009cee4a8ae90720190c8f83ddef6mblighfrom autotest_lib.client.common_lib import error 59f8579202a07a123a3f73c1eb2211d8fe9553b11mbligh 6443942444d5888634ae6faa314f89425dacc8002mblighMPSTAT_IX = 0 7443942444d5888634ae6faa314f89425dacc8002mblighNETPERF_IX = 1 856a91f076c57a1cfbbbcf9663af1a6e35d949ba4mbligh 956a91f076c57a1cfbbbcf9663af1a6e35d949ba4mblighclass netperf2(test.test): 108acfcfa572b3fae6c73937fcf9764580e7974101Kelly Lucas version = 4 110afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski 120570b9736b7e80afd4d6a53cce29ebc95e501f82lmr # ftp://ftp.netperf.org/netperf/netperf-2.4.5.tar.bz2 130570b9736b7e80afd4d6a53cce29ebc95e501f82lmr def setup(self, tarball = 'netperf-2.4.5.tar.bz2'): 14443942444d5888634ae6faa314f89425dacc8002mbligh self.job.require_gcc() 158b352856e457518fde6bab947d8fcdb3f53a39admbligh tarball = utils.unmap_url(self.bindir, tarball, self.tmpdir) 1653da18eddf69243ca175d9a4603cba5b55300726mbligh utils.extract_tarball_to_dir(tarball, self.srcdir) 170afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski os.chdir(self.srcdir) 180afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski 19443942444d5888634ae6faa314f89425dacc8002mbligh utils.system('patch -p0 < ../wait_before_data.patch') 20f5ca5acd83f068df858572424b5145042d30e69fKenneth Waters utils.configure() 216f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li utils.make() 220afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski 230afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski 240afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski def initialize(self): 25443942444d5888634ae6faa314f89425dacc8002mbligh self.server_prog = '%s&' % os.path.join(self.srcdir, 'src/netserver') 26443942444d5888634ae6faa314f89425dacc8002mbligh self.client_prog = '%s' % os.path.join(self.srcdir, 'src/netperf') 27443942444d5888634ae6faa314f89425dacc8002mbligh self.valid_tests = ['TCP_STREAM', 'TCP_MAERTS', 'TCP_RR', 'TCP_CRR', 28443942444d5888634ae6faa314f89425dacc8002mbligh 'TCP_SENDFILE', 'UDP_STREAM', 'UDP_RR'] 29a5630a5382d4b04a02728684aebec3dce984e2bfmbligh self.results = [] 30865ee82c4d530f88d8c41ca934920ad6d85bd019mbligh self.actual_times = [] 31443942444d5888634ae6faa314f89425dacc8002mbligh self.netif = '' 32443942444d5888634ae6faa314f89425dacc8002mbligh self.network = net_utils.network() 33443942444d5888634ae6faa314f89425dacc8002mbligh self.network_utils = net_utils.network_utils() 340afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski 350afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski 36443942444d5888634ae6faa314f89425dacc8002mbligh def run_once(self, server_ip, client_ip, role, test = 'TCP_STREAM', 37443942444d5888634ae6faa314f89425dacc8002mbligh test_time = 15, stream_list = [1], test_specific_args = '', 38443942444d5888634ae6faa314f89425dacc8002mbligh cpu_affinity = '', dev = '', bidi = False, wait_time = 5): 39443942444d5888634ae6faa314f89425dacc8002mbligh """ 40443942444d5888634ae6faa314f89425dacc8002mbligh server_ip: IP address of host running netserver 41443942444d5888634ae6faa314f89425dacc8002mbligh client_ip: IP address of host running netperf client(s) 42443942444d5888634ae6faa314f89425dacc8002mbligh role: 'client' or 'server' 43443942444d5888634ae6faa314f89425dacc8002mbligh test: one of TCP_STREAM, TCP_MEARTS, TCP_RR, TCP_CRR, TCP_SENDFILE, 44443942444d5888634ae6faa314f89425dacc8002mbligh UDP_STREAM or UDP_RR 45443942444d5888634ae6faa314f89425dacc8002mbligh test_time: time to run the test for in seconds 46443942444d5888634ae6faa314f89425dacc8002mbligh stream_list: list of number of netperf streams to launch 47443942444d5888634ae6faa314f89425dacc8002mbligh test_specific_args: Optional test specific args. For example to set 48443942444d5888634ae6faa314f89425dacc8002mbligh the request,response size for RR tests to 200,100, set it 49443942444d5888634ae6faa314f89425dacc8002mbligh to: '-- -r 200,100'. Or, to set the send buffer size of STREAM 50443942444d5888634ae6faa314f89425dacc8002mbligh tests to 200, set it to: '-- -m 200' 51443942444d5888634ae6faa314f89425dacc8002mbligh cpu_affinity: netperf/netserver processes will get taskset to the 52443942444d5888634ae6faa314f89425dacc8002mbligh cpu_affinity. cpu_affinity is specified as a bitmask in hex 53443942444d5888634ae6faa314f89425dacc8002mbligh without the leading 0x. For example, to run on CPUs 0 & 5, 54443942444d5888634ae6faa314f89425dacc8002mbligh cpu_affinity needs to be '21' 55443942444d5888634ae6faa314f89425dacc8002mbligh dev: device on which to run traffic on. For example, to run on 56443942444d5888634ae6faa314f89425dacc8002mbligh inteface eth1, set it to 'eth1'. 57443942444d5888634ae6faa314f89425dacc8002mbligh bidi: bi-directional traffic. This is supported for TCP_STREAM 58443942444d5888634ae6faa314f89425dacc8002mbligh test only. The RR & CRR tests are bi-directional by nature. 59443942444d5888634ae6faa314f89425dacc8002mbligh wait_time: Time to wait after establishing data/control connections 60443942444d5888634ae6faa314f89425dacc8002mbligh but before sending data traffic. 61443942444d5888634ae6faa314f89425dacc8002mbligh """ 62a5630a5382d4b04a02728684aebec3dce984e2bfmbligh if test not in self.valid_tests: 63a5630a5382d4b04a02728684aebec3dce984e2bfmbligh raise error.TestError('invalid test specified') 64a5630a5382d4b04a02728684aebec3dce984e2bfmbligh self.role = role 6552fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh self.test = test 66865ee82c4d530f88d8c41ca934920ad6d85bd019mbligh self.test_time = test_time 67443942444d5888634ae6faa314f89425dacc8002mbligh self.wait_time = wait_time 6852fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh self.stream_list = stream_list 69443942444d5888634ae6faa314f89425dacc8002mbligh self.bidi = bidi 70a5630a5382d4b04a02728684aebec3dce984e2bfmbligh 710afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski server_tag = server_ip + '#netperf-server' 720afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski client_tag = client_ip + '#netperf-client' 730afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski all = [server_tag, client_tag] 74a5630a5382d4b04a02728684aebec3dce984e2bfmbligh 75443942444d5888634ae6faa314f89425dacc8002mbligh # If a specific device has been requested, configure it. 76443942444d5888634ae6faa314f89425dacc8002mbligh if dev: 77443942444d5888634ae6faa314f89425dacc8002mbligh timeout = 60 78443942444d5888634ae6faa314f89425dacc8002mbligh if role == 'server': 79443942444d5888634ae6faa314f89425dacc8002mbligh self.configure_interface(dev, server_ip) 80443942444d5888634ae6faa314f89425dacc8002mbligh self.ping(client_ip, timeout) 81443942444d5888634ae6faa314f89425dacc8002mbligh else: 82443942444d5888634ae6faa314f89425dacc8002mbligh self.configure_interface(dev, client_ip) 83443942444d5888634ae6faa314f89425dacc8002mbligh self.ping(server_ip, timeout) 84443942444d5888634ae6faa314f89425dacc8002mbligh 85a5630a5382d4b04a02728684aebec3dce984e2bfmbligh for num_streams in stream_list: 86a5630a5382d4b04a02728684aebec3dce984e2bfmbligh if role == 'server': 87443942444d5888634ae6faa314f89425dacc8002mbligh self.server_start(cpu_affinity) 88a5630a5382d4b04a02728684aebec3dce984e2bfmbligh try: 8915b8a26d5ba95adacb523305f940ca010c191ef1mbligh # Wait up to ten minutes for the client to reach this 9052fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh # point. 9115b8a26d5ba95adacb523305f940ca010c191ef1mbligh self.job.barrier(server_tag, 'start_%d' % num_streams, 92443942444d5888634ae6faa314f89425dacc8002mbligh 600).rendezvous(*all) 9315b8a26d5ba95adacb523305f940ca010c191ef1mbligh # Wait up to test_time + 5 minutes for the test to 9452fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh # complete 9515b8a26d5ba95adacb523305f940ca010c191ef1mbligh self.job.barrier(server_tag, 'stop_%d' % num_streams, 96443942444d5888634ae6faa314f89425dacc8002mbligh test_time+300).rendezvous(*all) 97a5630a5382d4b04a02728684aebec3dce984e2bfmbligh finally: 98a5630a5382d4b04a02728684aebec3dce984e2bfmbligh self.server_stop() 99a5630a5382d4b04a02728684aebec3dce984e2bfmbligh 100a5630a5382d4b04a02728684aebec3dce984e2bfmbligh elif role == 'client': 10115b8a26d5ba95adacb523305f940ca010c191ef1mbligh # Wait up to ten minutes for the server to start 10215b8a26d5ba95adacb523305f940ca010c191ef1mbligh self.job.barrier(client_tag, 'start_%d' % num_streams, 103443942444d5888634ae6faa314f89425dacc8002mbligh 600).rendezvous(*all) 104443942444d5888634ae6faa314f89425dacc8002mbligh self.client(server_ip, test, test_time, num_streams, 105443942444d5888634ae6faa314f89425dacc8002mbligh test_specific_args, cpu_affinity) 10615b8a26d5ba95adacb523305f940ca010c191ef1mbligh # Wait up to 5 minutes for the server to also reach this point 10715b8a26d5ba95adacb523305f940ca010c191ef1mbligh self.job.barrier(client_tag, 'stop_%d' % num_streams, 108443942444d5888634ae6faa314f89425dacc8002mbligh 300).rendezvous(*all) 109a5630a5382d4b04a02728684aebec3dce984e2bfmbligh else: 110a5630a5382d4b04a02728684aebec3dce984e2bfmbligh raise error.TestError('invalid role specified') 1110afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski 112443942444d5888634ae6faa314f89425dacc8002mbligh self.restore_interface() 113443942444d5888634ae6faa314f89425dacc8002mbligh 114443942444d5888634ae6faa314f89425dacc8002mbligh 115443942444d5888634ae6faa314f89425dacc8002mbligh def configure_interface(self, dev, ip_addr): 116443942444d5888634ae6faa314f89425dacc8002mbligh self.netif = net_utils.netif(dev) 117443942444d5888634ae6faa314f89425dacc8002mbligh self.netif.up() 118443942444d5888634ae6faa314f89425dacc8002mbligh if self.netif.get_ipaddr() != ip_addr: 119443942444d5888634ae6faa314f89425dacc8002mbligh self.netif.set_ipaddr(ip_addr) 120443942444d5888634ae6faa314f89425dacc8002mbligh 1210afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski 122443942444d5888634ae6faa314f89425dacc8002mbligh def restore_interface(self): 123443942444d5888634ae6faa314f89425dacc8002mbligh if self.netif: 124443942444d5888634ae6faa314f89425dacc8002mbligh self.netif.restore() 125443942444d5888634ae6faa314f89425dacc8002mbligh 126443942444d5888634ae6faa314f89425dacc8002mbligh 127443942444d5888634ae6faa314f89425dacc8002mbligh def server_start(self, cpu_affinity): 12878be24a78e28a0352197593345d097a71f9e1e14mbligh utils.system('killall netserver', ignore_status=True) 129443942444d5888634ae6faa314f89425dacc8002mbligh cmd = self.server_prog 130443942444d5888634ae6faa314f89425dacc8002mbligh if cpu_affinity: 131443942444d5888634ae6faa314f89425dacc8002mbligh cmd = 'taskset %s %s' % (cpu_affinity, cmd) 132443942444d5888634ae6faa314f89425dacc8002mbligh 133443942444d5888634ae6faa314f89425dacc8002mbligh self.results.append(utils.system_output(cmd, retain_output=True)) 1340afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski 1350afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski 1360afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski def server_stop(self): 137a5630a5382d4b04a02728684aebec3dce984e2bfmbligh utils.system('killall netserver', ignore_status=True) 1380afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski 1390afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski 140443942444d5888634ae6faa314f89425dacc8002mbligh def client(self, server_ip, test, test_time, num_streams, 141443942444d5888634ae6faa314f89425dacc8002mbligh test_specific_args, cpu_affinity): 142443942444d5888634ae6faa314f89425dacc8002mbligh args = '-H %s -t %s -l %d' % (server_ip, test, test_time) 1438acfcfa572b3fae6c73937fcf9764580e7974101Kelly Lucas 144443942444d5888634ae6faa314f89425dacc8002mbligh if self.wait_time: 145443942444d5888634ae6faa314f89425dacc8002mbligh args += ' -s %d ' % self.wait_time 146443942444d5888634ae6faa314f89425dacc8002mbligh 147443942444d5888634ae6faa314f89425dacc8002mbligh # Append the test specific arguments. 148443942444d5888634ae6faa314f89425dacc8002mbligh if test_specific_args: 149443942444d5888634ae6faa314f89425dacc8002mbligh args += ' ' + test_specific_args 150443942444d5888634ae6faa314f89425dacc8002mbligh 151443942444d5888634ae6faa314f89425dacc8002mbligh cmd = '%s %s' % (self.client_prog, args) 152443942444d5888634ae6faa314f89425dacc8002mbligh 153443942444d5888634ae6faa314f89425dacc8002mbligh if cpu_affinity: 154443942444d5888634ae6faa314f89425dacc8002mbligh cmd = 'taskset %s %s' % (cpu_affinity, cmd) 155a5630a5382d4b04a02728684aebec3dce984e2bfmbligh 156a5630a5382d4b04a02728684aebec3dce984e2bfmbligh try: 157443942444d5888634ae6faa314f89425dacc8002mbligh cmds = [] 158443942444d5888634ae6faa314f89425dacc8002mbligh 159443942444d5888634ae6faa314f89425dacc8002mbligh # Get 5 mpstat samples. Since tests with large number of streams 160443942444d5888634ae6faa314f89425dacc8002mbligh # take a long time to start up all the streams, we'll toss out the 161443942444d5888634ae6faa314f89425dacc8002mbligh # first and last sample when recording results 162443942444d5888634ae6faa314f89425dacc8002mbligh interval = max(1, test_time / 5) 163fa3827ac4130595ebb93b40a9e5cb0abc6715e0cGwendal Grignou cmds.append('sleep %d && %s -P ALL %s 5' % 164fa3827ac4130595ebb93b40a9e5cb0abc6715e0cGwendal Grignou (self.wait_time, 'mpstat', interval)) 165443942444d5888634ae6faa314f89425dacc8002mbligh 166443942444d5888634ae6faa314f89425dacc8002mbligh # Add the netperf commands 167443942444d5888634ae6faa314f89425dacc8002mbligh for i in xrange(num_streams): 168443942444d5888634ae6faa314f89425dacc8002mbligh cmds.append(cmd) 169443942444d5888634ae6faa314f89425dacc8002mbligh if self.bidi and test == 'TCP_STREAM': 170443942444d5888634ae6faa314f89425dacc8002mbligh cmds.append(cmd.replace('TCP_STREAM', 'TCP_MAERTS')) 171443942444d5888634ae6faa314f89425dacc8002mbligh 172865ee82c4d530f88d8c41ca934920ad6d85bd019mbligh t0 = time.time() 173443942444d5888634ae6faa314f89425dacc8002mbligh # Launch all commands in parallel 174443942444d5888634ae6faa314f89425dacc8002mbligh out = utils.run_parallel(cmds, timeout=test_time + 500, 175443942444d5888634ae6faa314f89425dacc8002mbligh ignore_status=True) 176865ee82c4d530f88d8c41ca934920ad6d85bd019mbligh t1 = time.time() 177865ee82c4d530f88d8c41ca934920ad6d85bd019mbligh 178443942444d5888634ae6faa314f89425dacc8002mbligh self.results.append(out) 179443942444d5888634ae6faa314f89425dacc8002mbligh self.actual_times.append(t1 - t0 - self.wait_time) 180443942444d5888634ae6faa314f89425dacc8002mbligh # Log test output 181443942444d5888634ae6faa314f89425dacc8002mbligh logging.info(out) 182865ee82c4d530f88d8c41ca934920ad6d85bd019mbligh 183a5630a5382d4b04a02728684aebec3dce984e2bfmbligh except error.CmdError, e: 184a5630a5382d4b04a02728684aebec3dce984e2bfmbligh """ Catch errors due to timeout, but raise others 185a5630a5382d4b04a02728684aebec3dce984e2bfmbligh The actual error string is: 186a5630a5382d4b04a02728684aebec3dce984e2bfmbligh "Command did not complete within %d seconds" 187a5630a5382d4b04a02728684aebec3dce984e2bfmbligh called in function join_bg_job in the file common_lib/utils.py 188a5630a5382d4b04a02728684aebec3dce984e2bfmbligh 189a5630a5382d4b04a02728684aebec3dce984e2bfmbligh Looking for 'within' is probably not the best way to do this but 190a5630a5382d4b04a02728684aebec3dce984e2bfmbligh works for now""" 191a5630a5382d4b04a02728684aebec3dce984e2bfmbligh 19252fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh if ('within' in e.additional_text 19352fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh or 'non-zero' in e.additional_text): 1944c607f2bce87c8dbfc4e0136b9b909be0f62f952lmr logging.debug(e.additional_text) 195443942444d5888634ae6faa314f89425dacc8002mbligh self.results.append(None) 196865ee82c4d530f88d8c41ca934920ad6d85bd019mbligh self.actual_times.append(1) 197a5630a5382d4b04a02728684aebec3dce984e2bfmbligh else: 198a5630a5382d4b04a02728684aebec3dce984e2bfmbligh raise 199a5630a5382d4b04a02728684aebec3dce984e2bfmbligh 200a5630a5382d4b04a02728684aebec3dce984e2bfmbligh 201a5630a5382d4b04a02728684aebec3dce984e2bfmbligh def postprocess(self): 20252fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh if self.role == 'client': 203443942444d5888634ae6faa314f89425dacc8002mbligh # if profilers are enabled, the test gets runs twice 204443942444d5888634ae6faa314f89425dacc8002mbligh if (len(self.stream_list) != len(self.results) and 205443942444d5888634ae6faa314f89425dacc8002mbligh 2*len(self.stream_list) != len(self.results)): 20652fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh raise error.TestError('Mismatched number of results') 20752fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh 20852fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh function = None 20952fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh keys = None 21052fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh 21152fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh # Each of the functions return tuples in which the keys define 21252fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh # what that item in the tuple represents 213443942444d5888634ae6faa314f89425dacc8002mbligh if self.test in ['TCP_STREAM', 'TCP_MAERTS', 'TCP_SENDFILE']: 21452fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh function = self.process_tcp_stream 21552fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh keys = ('Throughput',) 21652fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh elif self.test == 'UDP_STREAM': 21752fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh function = self.process_udp_stream 21852fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh keys = ('Throughput', 'Errors') 21952fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh elif self.test in ['TCP_RR', 'TCP_CRR', 'UDP_RR']: 22052fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh function = self.process_request_response 22152fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh keys = ('Transfer_Rate',) 22252fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh else: 22352fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh raise error.TestError('Unhandled test') 22452fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh 22552fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh for i, streams in enumerate(self.stream_list): 22652fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh attr = {'stream_count':streams} 22752fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh keyval = {} 22852fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh temp_vals = [] 22952fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh 23052fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh # Short circuit to handle errors due to client timeouts 231443942444d5888634ae6faa314f89425dacc8002mbligh if not self.results[i]: 23252fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh self.write_iteration_keyval(attr, keyval) 23352fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh continue 23452fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh 235443942444d5888634ae6faa314f89425dacc8002mbligh # Collect output of netperf sessions 236443942444d5888634ae6faa314f89425dacc8002mbligh failed_streams_count = 0 237443942444d5888634ae6faa314f89425dacc8002mbligh for result in self.results[i][NETPERF_IX:]: 238443942444d5888634ae6faa314f89425dacc8002mbligh if result.exit_status: 239443942444d5888634ae6faa314f89425dacc8002mbligh failed_streams_count += 1 240443942444d5888634ae6faa314f89425dacc8002mbligh else: 241443942444d5888634ae6faa314f89425dacc8002mbligh temp_vals.append(function(result.stdout)) 242443942444d5888634ae6faa314f89425dacc8002mbligh 243443942444d5888634ae6faa314f89425dacc8002mbligh keyval['Failed_streams_count'] = failed_streams_count 244443942444d5888634ae6faa314f89425dacc8002mbligh 245443942444d5888634ae6faa314f89425dacc8002mbligh # Process mpstat output 246443942444d5888634ae6faa314f89425dacc8002mbligh mpstat_out = self.results[i][MPSTAT_IX].stdout 247443942444d5888634ae6faa314f89425dacc8002mbligh cpu_stats = self.network_utils.process_mpstat(mpstat_out, 5) 248443942444d5888634ae6faa314f89425dacc8002mbligh keyval['CPU_C'] = 100 - cpu_stats['idle'] 249443942444d5888634ae6faa314f89425dacc8002mbligh keyval['CPU_C_SYS'] = cpu_stats['sys'] 250443942444d5888634ae6faa314f89425dacc8002mbligh keyval['CPU_C_HI'] = cpu_stats['irq'] 251443942444d5888634ae6faa314f89425dacc8002mbligh keyval['CPU_C_SI'] = cpu_stats['soft'] 252443942444d5888634ae6faa314f89425dacc8002mbligh keyval['INTRS_C'] = cpu_stats['intr/s'] 253443942444d5888634ae6faa314f89425dacc8002mbligh 254443942444d5888634ae6faa314f89425dacc8002mbligh actual_time = self.actual_times[i] 255443942444d5888634ae6faa314f89425dacc8002mbligh keyval['actual_time'] = actual_time 256443942444d5888634ae6faa314f89425dacc8002mbligh logging.info('actual_time: %f', actual_time) 25752fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh 2586d858fa16693074e41b51b8068aa0d5a670c6e56mbligh # Compute the sum of elements returned from function which 25952fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh # represent the string contained in keys 26052fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh for j, key in enumerate(keys): 26152fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh vals = [x[j] for x in temp_vals] 262865ee82c4d530f88d8c41ca934920ad6d85bd019mbligh # scale result by the actual time taken 263443942444d5888634ae6faa314f89425dacc8002mbligh keyval[key] = sum(vals) 264865ee82c4d530f88d8c41ca934920ad6d85bd019mbligh 265865ee82c4d530f88d8c41ca934920ad6d85bd019mbligh # record 'Efficiency' as perf/CPU 266443942444d5888634ae6faa314f89425dacc8002mbligh if keyval['CPU_C'] != 0: 267443942444d5888634ae6faa314f89425dacc8002mbligh keyval['Efficieny_C'] = keyval[keys[0]]/keyval['CPU_C'] 268443942444d5888634ae6faa314f89425dacc8002mbligh else: 269443942444d5888634ae6faa314f89425dacc8002mbligh keyval['Efficieny_C'] = keyval[keys[0]] 27052fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh 27152fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh self.write_iteration_keyval(attr, keyval) 27252fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh 27352fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh 27452fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh def process_tcp_stream(self, output): 275443942444d5888634ae6faa314f89425dacc8002mbligh """Parses the following (works for both TCP_STREAM, TCP_MAERTS and 276443942444d5888634ae6faa314f89425dacc8002mbligh TCP_SENDFILE) and returns a singleton containing throughput. 27752fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh 278443942444d5888634ae6faa314f89425dacc8002mbligh TCP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to foo.bar.com \ 279443942444d5888634ae6faa314f89425dacc8002mbligh (10.10.10.3) port 0 AF_INET 28052fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh Recv Send Send 28152fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh Socket Socket Message Elapsed 28252fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh Size Size Size Time Throughput 28352fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh bytes bytes bytes secs. 10^6bits/sec 28452fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh 28552fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh 87380 16384 16384 2.00 941.28 28652fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh """ 28752fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh 28852fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh return float(output.splitlines()[6].split()[4]), 28952fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh 29052fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh 29152fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh def process_udp_stream(self, output): 29252fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh """Parses the following and returns a touple containing throughput 29352fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh and the number of errors. 29452fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh 295443942444d5888634ae6faa314f89425dacc8002mbligh UDP UNIDIRECTIONAL SEND TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET \ 296443942444d5888634ae6faa314f89425dacc8002mbligh to foo.bar.com (10.10.10.3) port 0 AF_INET 29752fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh Socket Message Elapsed Messages 29852fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh Size Size Time Okay Errors Throughput 29952fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh bytes bytes secs # # 10^6bits/sec 30052fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh 30152fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh 129024 65507 2.00 3673 0 961.87 30252fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh 131072 2.00 3673 961.87 30352fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh """ 30452fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh 30552fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh line_tokens = output.splitlines()[5].split() 30652fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh return float(line_tokens[5]), int(line_tokens[4]) 30752fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh 30852fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh 30952fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh def process_request_response(self, output): 31052fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh """Parses the following which works for both rr (TCP and UDP) and crr 31152fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh tests and returns a singleton containing transfer rate. 31252fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh 313443942444d5888634ae6faa314f89425dacc8002mbligh TCP REQUEST/RESPONSE TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET \ 314443942444d5888634ae6faa314f89425dacc8002mbligh to foo.bar.com (10.10.10.3) port 0 AF_INET 31552fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh Local /Remote 31652fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh Socket Size Request Resp. Elapsed Trans. 31752fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh Send Recv Size Size Time Rate 31852fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh bytes Bytes bytes bytes secs. per sec 31952fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh 32052fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh 16384 87380 1 1 2.00 14118.53 32152fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh 16384 87380 32252fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh """ 32352fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh 32452fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh return float(output.splitlines()[6].split()[5]), 325443942444d5888634ae6faa314f89425dacc8002mbligh 326443942444d5888634ae6faa314f89425dacc8002mbligh 327443942444d5888634ae6faa314f89425dacc8002mbligh def ping(self, ip, timeout): 328443942444d5888634ae6faa314f89425dacc8002mbligh curr_time = time.time() 329443942444d5888634ae6faa314f89425dacc8002mbligh end_time = curr_time + timeout 330443942444d5888634ae6faa314f89425dacc8002mbligh while curr_time < end_time: 331443942444d5888634ae6faa314f89425dacc8002mbligh if not os.system('ping -c 1 ' + ip): 332443942444d5888634ae6faa314f89425dacc8002mbligh # Ping succeeded 333443942444d5888634ae6faa314f89425dacc8002mbligh return 334443942444d5888634ae6faa314f89425dacc8002mbligh # Ping failed. Lets sleep a bit and try again. 335443942444d5888634ae6faa314f89425dacc8002mbligh time.sleep(5) 336443942444d5888634ae6faa314f89425dacc8002mbligh curr_time = time.time() 337443942444d5888634ae6faa314f89425dacc8002mbligh 338443942444d5888634ae6faa314f89425dacc8002mbligh return 339