Home | History | Annotate | Download | only in bonnie
      1 import os, re
      2 from autotest_lib.client.bin import test, os_dep, utils
      3 
      4 
      5 def 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 
     26 class 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