普通文本  |  82行  |  2.69 KB

import os, re
from autotest_lib.client.bin import test, os_dep, utils


def convert_size(values):
    values = values.split(':')
    size = values[0]
    if len(values) > 1:
        chunk = values[1]
    else:
        chunk = 0
    if size.endswith('G') or size.endswith('g'):
        size = int(size[:-1]) * 2**30
    else:
        if size.endswith('M') or size.endswith('m'):
            size = int(size[:-1])
        size = int(size) * 2**20
    if chunk:
        if chunk.endswith('K') or chunk.endswith('k'):
            chunk = int(chunk[:-1]) * 2**10
        else:
            chunk = int(chunk)
    return [size, chunk]


class bonnie(test.test):
    version = 1

    def initialize(self):
        self.job.require_gcc()
        self.results = []

    # http://www.coker.com.au/bonnie++/bonnie++-1.03a.tgz
    def setup(self, tarball = 'bonnie++-1.03a.tgz'):
        tarball = utils.unmap_url(self.bindir, tarball, self.tmpdir)
        utils.extract_tarball_to_dir(tarball, self.srcdir)
        os.chdir(self.srcdir)

        os_dep.command('g++')
        utils.system('patch -p1 < ../bonnie++-1.03a-gcc43.patch')
        utils.configure()
        utils.make()


    def run_once(self, dir=None, extra_args='', user='root'):
        if not dir:
            dir = self.tmpdir

        # if the user specified a -n we will use that
        if '-n' not in extra_args:
            extra_args += ' -n 2048'
        args = '-d ' + dir + ' -u ' + user + ' ' + extra_args
        cmd = self.srcdir + '/bonnie++ ' + args

        self.results.append(utils.system_output(cmd, retain_output=True))


    def postprocess(self):
        strip_plus = lambda s: re.sub(r"^\++$", "0", s)

        keys = ('size', 'chnk', 'seqout_perchr_ksec',
                'seqout_perchr_pctcp', 'seqout_perblk_ksec',
                'seqout_perblk_pctcp', 'seqout_rewrite_ksec',
                'seqout_rewrite_pctcp', 'seqin_perchr_ksec',
                'seqin_perchr_pctcp', 'seqin_perblk_ksec',
                'seqin_perblk_pctcp', 'rand_ksec', 'rand_pctcp', 'files',
                'seqcreate_create_ksec', 'seqcreate_create_pctcp',
                'seqcreate_read_ksec', 'seqcreate_read_pctcp',
                'seqcreate_delete_ksec', 'seqcreate_delete_pctcp',
                'randreate_create_ksec', 'randcreate_create_pctcp',
                'randcreate_read_ksec', 'randcreate_read_pctcp',
                'randcreate_delete_ksec', 'randcreate_delete_pctcp')

        for line in self.results:
            if line.count(',') != 26:
                continue
            fields = line.split(',')
            fields = [strip_plus(f) for f in fields]
            fields = convert_size(fields[1]) + fields[2:]

            self.write_perf_keyval(dict(zip(keys,fields)))