1 import os, re 2 from autotest_lib.client.bin import test, utils 3 from autotest_lib.client.common_lib import error 4 5 6 class 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 105 Dhrystone 2 using register variables 7918001.7 lps (10.0 secs, 10 samples) 106 System Call Overhead 1427272.7 lps (10.0 secs, 10 samples) 107 Process Creation 11508.6 lps (30.0 secs, 3 samples) 108 Execl Throughput 4159.7 lps (29.7 secs, 3 samples) 109 File Read 1024 bufsize 2000 maxblocks 1708109.0 KBps (30.0 secs, 3 samples) 110 File Write 1024 bufsize 2000 maxblocks 788024.0 KBps (30.0 secs, 3 samples) 111 File Copy 1024 bufsize 2000 maxblocks 452986.0 KBps (30.0 secs, 3 samples) 112 File Read 256 bufsize 500 maxblocks 508752.0 KBps (30.0 secs, 3 samples) 113 File Write 256 bufsize 500 maxblocks 214772.0 KBps (30.0 secs, 3 samples) 114 File Copy 256 bufsize 500 maxblocks 143989.0 KBps (30.0 secs, 3 samples) 115 File Read 4096 bufsize 8000 maxblocks 2626923.0 KBps (30.0 secs, 3 samples) 116 File Write 4096 bufsize 8000 maxblocks 1175070.0 KBps (30.0 secs, 3 samples) 117 File Copy 4096 bufsize 8000 maxblocks 793041.0 KBps (30.0 secs, 3 samples) 118 Shell Scripts (1 concurrent) 4417.4 lpm (60.0 secs, 3 samples) 119 Shell Scripts (8 concurrent) 1109.0 lpm (60.0 secs, 3 samples) 120 Shell Scripts (16 concurrent) 578.3 lpm (60.0 secs, 3 samples) 121 Arithmetic Test (type = short) 1843690.0 lps (10.0 secs, 3 samples) 122 Arithmetic Test (type = int) 1873615.8 lps (10.0 secs, 3 samples) 123 Arithmetic Test (type = long) 1888345.9 lps (10.0 secs, 3 samples) 124 Arithmetic Test (type = float) 616260.3 lps (10.0 secs, 3 samples) 125 Arithmetic Test (type = double) 615942.1 lps (10.0 secs, 3 samples) 126 Arithoh 18864899.5 lps (10.0 secs, 3 samples) 127 Dc: sqrt(2) to 99 decimal places 161726.0 lpm (30.0 secs, 3 samples) 128 Recursion Test--Tower of Hanoi 89229.3 lps (20.0 secs, 3 samples) 129 130 131 INDEX VALUES 132 TEST BASELINE RESULT INDEX 133 134 Dhrystone 2 using register variables 116700.0 7918001.7 678.5 135 Double-Precision Whetstone 55.0 1948.2 354.2 136 Execl Throughput 43.0 4159.7 967.4 137 File Copy 1024 bufsize 2000 maxblocks 3960.0 452986.0 1143.9 138 File Copy 256 bufsize 500 maxblocks 1655.0 143989.0 870.0 139 File Copy 4096 bufsize 8000 maxblocks 5800.0 793041.0 1367.3 140 Pipe Throughput 12440.0 1048491.9 842.8 141 Pipe-based Context Switching 4000.0 300778.3 751.9 142 Process Creation 126.0 11508.6 913.4 143 Shell Scripts (8 concurrent) 6.0 1109.0 1848.3 144 System Call Overhead 15000.0 1427272.7 951.5 145 ========= 146 FINAL SCORE 902.1 147 """ 148