1import os, re 2from autotest_lib.client.bin import test, utils 3from autotest_lib.client.common_lib import error 4 5 6class unixbench(test.test): 7 version = 2 8 9 def initialize(self): 10 self.job.require_gcc() 11 self.err = None 12 13 14 # http://www.tux.org/pub/tux/niemi/unixbench/unixbench-4.1.0.tgz 15 def setup(self, tarball = 'unixbench-4.1.0.tar.bz2'): 16 tarball = utils.unmap_url(self.bindir, tarball, self.tmpdir) 17 utils.extract_tarball_to_dir(tarball, self.srcdir) 18 os.chdir(self.srcdir) 19 20 utils.system('patch -p1 < ../unixbench.patch') 21 utils.system('patch -p1 < ../Makefile.patch') 22 utils.make() 23 utils.system('rm pgms/select') 24 25 26 def run_once(self, args='', stepsecs=0): 27 vars = ('TMPDIR=\"%s\" RESULTDIR=\"%s\" FLAVOR=Linux' % 28 (self.tmpdir, self.resultsdir)) 29 if stepsecs: 30 # change time per subtest from unixbench's defaults of 31 # 10 secs for small tests, 30 secs for bigger tests 32 vars += ' systime=%i looper=%i seconds=%i'\ 33 ' dhrytime=%i arithtime=%i' \ 34 % ((stepsecs,)*5) 35 36 os.chdir(self.srcdir) 37 try: 38 utils.system(vars + ' ./Run ' + args) 39 finally: 40 times_path = os.path.join(self.resultsdir, 'times') 41 # The 'times' file can be needlessly huge as it contains warnings 42 # and error messages printed out by small benchmarks that are 43 # run in a loop. It can easily compress 100x in such cases. 44 if os.path.exists(times_path): 45 utils.system("gzip -9 '%s'" % (times_path,), ignore_status=True) 46 47 report_path = os.path.join(self.resultsdir, 'report') 48 self.report_data = open(report_path).readlines()[9:] 49 50 51 def cleanup(self): 52 # check err string and possible throw 53 if self.err is not None: 54 raise error.TestError(self.err) 55 56 57 def check_for_error(self, words): 58 l = len(words) 59 if l >= 3 and words[-3:l] == ['no', 'measured', 'results']: 60 # found a problem so record it in err string 61 key = '_'.join(words[:-3]) 62 if self.err is None: 63 self.err = key 64 else: 65 self.err = self.err + " " + key 66 return True 67 else: 68 return False 69 70 71 def postprocess_iteration(self): 72 keyval = {} 73 for line in self.report_data: 74 if not line.strip(): 75 break 76 77 words = line.split() 78 # look for problems first 79 if self.check_for_error(words): 80 continue 81 82 # we should make sure that there are at least 83 # 6 guys before we start accessing the array 84 if len(words) >= 6: 85 key = '_'.join(words[:-6]) 86 key = re.sub('\W', '', key) 87 value = words[-6] 88 keyval[key] = value 89 for line in self.report_data: 90 if 'FINAL SCORE' in line: 91 keyval['score'] = line.split()[-1] 92 break 93 self.write_perf_keyval(keyval) 94 95 96""" Here is a sample report file: 97 98 BYTE UNIX Benchmarks (Version 4.1.0) 99 System -- Linux adrianbg 2.6.18.5 #1 SMP Thu J Start Benchmark Run: Tue Sep 1 100 9 interactive users. 101 21:03:50 up 5 days, 7:38, 9 users, load average: 0.71, 0.40, 0.25 102 lrwxrwxrwx 1 root root 4 Aug 15 09:53 /bin/sh -> bash 103 /bin/sh: symbolic link to `bash' 104 /dev/sda6 192149596 91964372 90424536 51% /home 105Dhrystone 2 using register variables 7918001.7 lps (10.0 secs, 10 samples) 106System Call Overhead 1427272.7 lps (10.0 secs, 10 samples) 107Process Creation 11508.6 lps (30.0 secs, 3 samples) 108Execl Throughput 4159.7 lps (29.7 secs, 3 samples) 109File Read 1024 bufsize 2000 maxblocks 1708109.0 KBps (30.0 secs, 3 samples) 110File Write 1024 bufsize 2000 maxblocks 788024.0 KBps (30.0 secs, 3 samples) 111File Copy 1024 bufsize 2000 maxblocks 452986.0 KBps (30.0 secs, 3 samples) 112File Read 256 bufsize 500 maxblocks 508752.0 KBps (30.0 secs, 3 samples) 113File Write 256 bufsize 500 maxblocks 214772.0 KBps (30.0 secs, 3 samples) 114File Copy 256 bufsize 500 maxblocks 143989.0 KBps (30.0 secs, 3 samples) 115File Read 4096 bufsize 8000 maxblocks 2626923.0 KBps (30.0 secs, 3 samples) 116File Write 4096 bufsize 8000 maxblocks 1175070.0 KBps (30.0 secs, 3 samples) 117File Copy 4096 bufsize 8000 maxblocks 793041.0 KBps (30.0 secs, 3 samples) 118Shell Scripts (1 concurrent) 4417.4 lpm (60.0 secs, 3 samples) 119Shell Scripts (8 concurrent) 1109.0 lpm (60.0 secs, 3 samples) 120Shell Scripts (16 concurrent) 578.3 lpm (60.0 secs, 3 samples) 121Arithmetic Test (type = short) 1843690.0 lps (10.0 secs, 3 samples) 122Arithmetic Test (type = int) 1873615.8 lps (10.0 secs, 3 samples) 123Arithmetic Test (type = long) 1888345.9 lps (10.0 secs, 3 samples) 124Arithmetic Test (type = float) 616260.3 lps (10.0 secs, 3 samples) 125Arithmetic Test (type = double) 615942.1 lps (10.0 secs, 3 samples) 126Arithoh 18864899.5 lps (10.0 secs, 3 samples) 127Dc: sqrt(2) to 99 decimal places 161726.0 lpm (30.0 secs, 3 samples) 128Recursion Test--Tower of Hanoi 89229.3 lps (20.0 secs, 3 samples) 129 130 131 INDEX VALUES 132TEST BASELINE RESULT INDEX 133 134Dhrystone 2 using register variables 116700.0 7918001.7 678.5 135Double-Precision Whetstone 55.0 1948.2 354.2 136Execl Throughput 43.0 4159.7 967.4 137File Copy 1024 bufsize 2000 maxblocks 3960.0 452986.0 1143.9 138File Copy 256 bufsize 500 maxblocks 1655.0 143989.0 870.0 139File Copy 4096 bufsize 8000 maxblocks 5800.0 793041.0 1367.3 140Pipe Throughput 12440.0 1048491.9 842.8 141Pipe-based Context Switching 4000.0 300778.3 751.9 142Process Creation 126.0 11508.6 913.4 143Shell Scripts (8 concurrent) 6.0 1109.0 1848.3 144System Call Overhead 15000.0 1427272.7 951.5 145 ========= 146 FINAL SCORE 902.1 147""" 148