1import os, re 2from autotest_lib.client.bin import test, os_dep, utils 3 4 5def convert_size(values): 6 values = values.split(':') 7 size = values[0] 8 if len(values) > 1: 9 chunk = values[1] 10 else: 11 chunk = 0 12 if size.endswith('G') or size.endswith('g'): 13 size = int(size[:-1]) * 2**30 14 else: 15 if size.endswith('M') or size.endswith('m'): 16 size = int(size[:-1]) 17 size = int(size) * 2**20 18 if chunk: 19 if chunk.endswith('K') or chunk.endswith('k'): 20 chunk = int(chunk[:-1]) * 2**10 21 else: 22 chunk = int(chunk) 23 return [size, chunk] 24 25 26class bonnie(test.test): 27 version = 1 28 29 def initialize(self): 30 self.job.require_gcc() 31 self.results = [] 32 33 # http://www.coker.com.au/bonnie++/bonnie++-1.03a.tgz 34 def setup(self, tarball = 'bonnie++-1.03a.tgz'): 35 tarball = utils.unmap_url(self.bindir, tarball, self.tmpdir) 36 utils.extract_tarball_to_dir(tarball, self.srcdir) 37 os.chdir(self.srcdir) 38 39 os_dep.command('g++') 40 utils.system('patch -p1 < ../bonnie++-1.03a-gcc43.patch') 41 utils.configure() 42 utils.make() 43 44 45 def run_once(self, dir=None, extra_args='', user='root'): 46 if not dir: 47 dir = self.tmpdir 48 49 # if the user specified a -n we will use that 50 if '-n' not in extra_args: 51 extra_args += ' -n 2048' 52 args = '-d ' + dir + ' -u ' + user + ' ' + extra_args 53 cmd = self.srcdir + '/bonnie++ ' + args 54 55 self.results.append(utils.system_output(cmd, retain_output=True)) 56 57 58 def postprocess(self): 59 strip_plus = lambda s: re.sub(r"^\++$", "0", s) 60 61 keys = ('size', 'chnk', 'seqout_perchr_ksec', 62 'seqout_perchr_pctcp', 'seqout_perblk_ksec', 63 'seqout_perblk_pctcp', 'seqout_rewrite_ksec', 64 'seqout_rewrite_pctcp', 'seqin_perchr_ksec', 65 'seqin_perchr_pctcp', 'seqin_perblk_ksec', 66 'seqin_perblk_pctcp', 'rand_ksec', 'rand_pctcp', 'files', 67 'seqcreate_create_ksec', 'seqcreate_create_pctcp', 68 'seqcreate_read_ksec', 'seqcreate_read_pctcp', 69 'seqcreate_delete_ksec', 'seqcreate_delete_pctcp', 70 'randreate_create_ksec', 'randcreate_create_pctcp', 71 'randcreate_read_ksec', 'randcreate_read_pctcp', 72 'randcreate_delete_ksec', 'randcreate_delete_pctcp') 73 74 for line in self.results: 75 if line.count(',') != 26: 76 continue 77 fields = line.split(',') 78 fields = [strip_plus(f) for f in fields] 79 fields = convert_size(fields[1]) + fields[2:] 80 81 self.write_perf_keyval(dict(zip(keys,fields))) 82