On Fri, Jul 29, 2011 at 3:07 AM, Onkar N Mahajan
<[email protected]> wrote:
> Sorry, there was some problem with my email client. Please
> ignore all my previous FFSB patches and use this one.
>
> This patch adds to the Autotest framework capability
> to run the Flexible File System Benchmark.

That is a lot better, thanks. Will review shortly!

> From db21a1144073fa5f56b7dd501c4e7438f45bdf60 Mon Sep 17 00:00:00 2001
> From: Onkar N Mahajan <[email protected]>
> Date: Tue, 26 Jul 2011 20:02:24 +0530
> Subject: [PATCH] Flexible File System Benchmark (FFSB) support in Autotest
>  Signed-off-by: Onkar N Mahajan <[email protected]>
>
> ---
>  client/tests/ffsb/README                       |   43 ++++++
>  client/tests/ffsb/control                      |   18 +++
>  client/tests/ffsb/ffsb.py                      |  177 
> ++++++++++++++++++++++++
>  client/tests/ffsb/profile.cfg.sample           |   25 ++++
>  client/tests/kvm/autotest_control/ffsb.control |   18 +++
>  client/tests/kvm/tests_base.cfg.sample         |    2 +
>  6 files changed, 283 insertions(+), 0 deletions(-)
>  create mode 100644 client/tests/ffsb/README
>  create mode 100644 client/tests/ffsb/control
>  create mode 100644 client/tests/ffsb/ffsb.py
>  create mode 100644 client/tests/ffsb/profile.cfg.sample
>  create mode 100644 client/tests/kvm/autotest_control/ffsb.control
>
> diff --git a/client/tests/ffsb/README b/client/tests/ffsb/README
> new file mode 100644
> index 0000000..d15c311
> --- /dev/null
> +++ b/client/tests/ffsb/README
> @@ -0,0 +1,43 @@
> +INTRODUCTION:
> +=============
> +This patch integrates the Flexible Filesystem Benchmark (FFSB) with
> +the autotest. This integration enables the high-performace I/O load testing 
> in the
> +KVM Virtual machine environment.
> +FFSB is a filesystem performance measurement tool.  It is a multi-threaded
> +application (using pthreads), written entirely in C with cross-platform
> +portability in mind.  It differs from other filesystem benchmarks in that
> +the user may supply a profile to create custom workloads, while most other
> +filesystem benchmarks use a fixed set of randomly generated workloads.
> +
> +More information about the FFSB can be got from reading the README in the
> +FFSB source directory which can be accessed from this link:
> +[http://sourceforge.net/projects/ffsb/]
> +
> +With this integration ,it is now possible to test variety of filesystems on
> +the KVM guest for :
> +
> +(1) directed I/O with sequential/random read/write.
> +(2) buffered I/O with sequential/random read/write.
> +(3) use varying block alignment boundries to measure filesystem behaviour.
> +(4) use multithreaded workloads to stress the filesystem.
> +(5) Exert weighted combination of I/O workloads to analyze the I/O performace
> +    for a specific scenario.
> +(6) Age filesystem according to a specified workload upto a specified limit.
> +
> +    Since the only interface used for the integration is a FFSB 
> configuration file;
> +Autotest will be able to run variety of I/O tests on guest as FFSB improves,
> +with no or minimal code change in Autotest itself.
> +
> +USE:
> +====
> +    To use the FFSB for Filesystem testing, two configuration files
> +need to be modified -
> +(1) Usual - tests.cfg file to activate the ffsb tests through KVM.
> +(2) profile.cfg - where the workloads are specified.
> +
> +TODO:
> +====
> +* Add validations for max. number of threads according to number of
> +  vcpus exported by QEMU-KVM
> +* Test Autotest/ffsb
> +* Test FFSB itself.
> diff --git a/client/tests/ffsb/control b/client/tests/ffsb/control
> new file mode 100644
> index 0000000..0164898
> --- /dev/null
> +++ b/client/tests/ffsb/control
> @@ -0,0 +1,18 @@
> +AUTHOR = "Onkar N Mahajan <[email protected]>"
> +NAME = "Flexible Filesystem Benchmark (FFSB)"
> +TEST_CATEGORY = "Filesystem Benchmark"
> +TEST_CLASS = "General"
> +TEST_TYPE = "client"
> +TIME = 'MEDIUM'
> +DOC = """\
> +
> +The Flexible Filesystem Benchmark (FFSB) is a cross-platform
> +filesystem performance measurement tool. It uses customizable
> +profiles to measure of different workloads, and it supports
> +multiple groups of threads across multiple filesystems.
> +
> +For more info, see http://sourceforge.net/projects/ffsb/
> +
> +"""
> +
> +job.run_test('ffsb')
> diff --git a/client/tests/ffsb/ffsb.py b/client/tests/ffsb/ffsb.py
> new file mode 100644
> index 0000000..c2f7aae
> --- /dev/null
> +++ b/client/tests/ffsb/ffsb.py
> @@ -0,0 +1,177 @@
> +import os, stat, string, logging, re, random, shutil
> +from autotest_lib.client.bin import test, os_dep, utils
> +from autotest_lib.client.common_lib import error
> +
> +class ffsb(test.test):
> +
> +    version=1
> +    params = {}
> +    tempdirs = []
> +    bytes = { 'K' : 1024 , 'k' : 1024 ,
> +              'M' : 1048576 , 'm' : 1048576 ,
> +              'G' : 1073741824 , 'g':1073741824,
> +              'T' : 1099511627776 , 't':1099511627776
> +            }
> +
> +
> +    def initialize(self):
> +        self.job.require_gcc()
> +        self.results = []
> +        self.nfail=0
> +
> +    def find_mnt_pt(self,path):
> +        pth = os.path.abspath(path)
> +        while not os.path.ismount(pth):
> +            pth = os.path.dirname(pth)
> +        return pth
> +
> +    def set_ffsb_params(self,usrfl) :
> +        """
> +        This function checks for the user supplied FFSB profile file
> +        and validates it against the availble resources on the
> +        guest - currently only disk space validation is supported
> +        but adjusting the number of threads according to the vcpus
> +        exported by the qemu-kvm also needs to be added.
> +
> +        @author Onkar N Mahajan ([email protected])
> +        """
> +        d = {}
> +        fr = open(usrfl,'r')
> +        for line in fr.read().split('\n'):
> +            p = re.compile(r'\s*\t*\[{1}filesystem(\d+)\]{1}')
> +            m = p.match(line)
> +            if m:
> +                fsno=int(line[m.start(1):m.end(1)])
> +                d[fsno] = []
> +            p = re.compile(r'(\s*\t*location)\=(.*)')
> +            m = p.match(line)
> +            if m:
> +                path = line[m.start(2):m.end(2)]
> +                mntpt=self.find_mnt_pt(path)
> +                f=os.statvfs(mntpt)
> +                avl_dsk_spc=f.f_bfree*f.f_bsize
> +                avl_dsk_spc*=0.95
> +                d[fsno].append(mntpt)
> +                d[fsno].append(int(avl_dsk_spc))
> +            p = re.compile(r'(\s*\t*num_files)\=(\d+)')
> +
> +            m = p.match(line)
> +            if m:
> +                usrnumfl = int(line[m.start(2):m.end(2)])
> +                d[fsno].append(usrnumfl)
> +            p = re.compile(r'(\s*\t*max_filesize)\=(\d+[kKMmGgTt]?)')
> +            m = p.match(line)
> +            if m:
> +                usrmaxflsz=line[m.start(2):m.end(2)]
> +                usrmaxflsz = int(usrmaxflsz[0:-1]) * 
> self.bytes[usrmaxflsz[-1]]
> +                d[fsno].append(usrmaxflsz)
> +        for k in d.keys():
> +            while d[k][2]*d[k][3] >= d[k][1]:
> +                d[k][2]-=1
> +            if d[k][2] == 0:
> +                d[k][2]=1
> +                d[k][3]=d[k][1]
> +            """
> +            If the ffsb mount point is on the same file system
> +            then use the available disk space after the previous
> +            tests
> +            """
> +            for k1 in d.keys():
> +                if d[k1][0] == d[k][0]:
> +                    d[k1][1] -= (d[k][2]*d[k][3])
> +        fr.close()
> +        return d
> +
> +    def dup_ffsb_profilefl(self) :
> +        """
> +        This generates a profile file which is a validated file
> +        that is actually used by the FFSB on the guest
> +        """
> +        self.usrfl = '%s/%s' % (os.path.split(self.srcdir)[0],'profile.cfg')
> +        self.sysfl = '%s/%s' % (self.srcdir,'profile.cfg')
> +
> +        """
> +        Validate the path from the FFSB configuration file, the
> +        disk space available for the test ,warn the user and
> +        change the file sizes and/or number of files to be used for
> +        generating the workload according to the available disk space
> +        on the guest.
> +        """
> +        params=self.set_ffsb_params(self.usrfl)
> +
> +        fsno=0
> +        fr = open(self.usrfl,'r')
> +        fw = open(self.sysfl,'w')
> +        for line in fr.read().split('\n'):
> +            p = re.compile(r'\s*\t*\[{1}filesystem(\d+)\]{1}')
> +            m = p.match(line)
> +            if m:
> +                fsno=int(line[m.start(1):m.end(1)])
> +            p = re.compile(r'(\s*\t*location)\=(.*)')
> +            m = p.match(line)
> +            if m:
> +                while True:
> +                    dirnm = ''.join(random.choice(string.letters) for i in 
> xrange(9))
> +                    if line[m.end(2)-1] == '/':
> +                        newline='%s%s' % (line[0:m.end(2)],dirnm)
> +                        ffsbdir='%s%s' % (line[m.start(2):m.end(2)],dirnm)
> +                    else:
> +                        newline='%s/%s' % (line[0:m.end(2)],dirnm)
> +                        ffsbdir='%s/%s' % (line[m.start(2):m.end(2)],dirnm)
> +                    self.tempdirs.append(ffsbdir)
> +                    if os.path.exists(ffsbdir):
> +                        continue
> +                    else:
> +                        os.makedirs(ffsbdir)
> +                        break
> +                fw.write(newline+'\n')
> +                continue
> +            p = re.compile(r'(\s*\t*num_files)\=(.*)')
> +            m = p.match(line)
> +            if m:
> +                newline = '%s=%s' % (line[0:m.end(1)],str(params[fsno][2]))
> +                fw.write(newline+'\n')
> +                continue
> +            p = re.compile(r'(\s*\t*max_filesize)\=(\d+[kKMmGgTt]?)')
> +            m = p.match(line)
> +            if m:
> +                newline = '%s%s' % (line[0:m.start(2)],str(params[fsno][3]))
> +                fw.write(newline+'\n')
> +                continue
> +            fw.write(line+'\n')
> +        fr.close()
> +        fw.close()
> +
> +
> +    def setup(self, tarball = 'ffsb-6.0-rc2.tar.bz2'):
> +        tarball = utils.unmap_url(self.bindir, tarball, self.tmpdir)
> +        utils.extract_tarball_to_dir(tarball, self.srcdir)
> +        os.chdir(self.srcdir)
> +        os_dep.command('gcc')
> +        utils.configure()
> +        utils.make()
> +
> +
> +    def run_once(self, dir=None, extra_args='', user='root'):
> +        self.dup_ffsb_profilefl()
> +        # Run FFSB using abspath
> +        cmd = '%s/ffsb %s/profile.cfg' % (self.srcdir,self.srcdir)
> +        logging.info("Executing : %s",(cmd))
> +        try:
> +           self.results = utils.system_output(cmd, retain_output=True)
> +        except error.CmdError, e:
> +           self.nfail += 1
> +           logging.error('Failed to execute FFSB : %s', e)
> +
> +        logging.info(self.results)
> +
> +
> +    def postprocess(self):
> +        if self.nfail != 0:
> +            raise error.TestError('FFSB test failed.')
> +        else:
> +            logging.info('FFSB test passed')
> +            logging.info('Cleaning up test data...')
> +            for l in self.tempdirs:
> +                shutil.rmtree(l)
> +
> diff --git a/client/tests/ffsb/profile.cfg.sample 
> b/client/tests/ffsb/profile.cfg.sample
> new file mode 100644
> index 0000000..e68fead
> --- /dev/null
> +++ b/client/tests/ffsb/profile.cfg.sample
> @@ -0,0 +1,25 @@
> +# Large file random writes.
> +# 1024 files, 100MB per file.
> +
> +time=300  # 5 min
> +alignio=1
> +
> +[filesystem0]
> +#   For KVM Autotest , this will by-default
> +#   be / , unless and until the user is absolutely
> +#   sure what is is upto.
> +    location=/
> +    num_files=2
> +    min_filesize=1G
> +    max_filesize=2G
> +[end0]
> +
> +[threadgroup0]
> +    num_threads=4
> +
> +    read_random=1
> +    read_weight=1
> +
> +    read_size=5242880  # 5 MB
> +    read_blocksize=4096
> +[end0]
> diff --git a/client/tests/kvm/autotest_control/ffsb.control 
> b/client/tests/kvm/autotest_control/ffsb.control
> new file mode 100644
> index 0000000..0164898
> --- /dev/null
> +++ b/client/tests/kvm/autotest_control/ffsb.control
> @@ -0,0 +1,18 @@
> +AUTHOR = "Onkar N Mahajan <[email protected]>"
> +NAME = "Flexible Filesystem Benchmark (FFSB)"
> +TEST_CATEGORY = "Filesystem Benchmark"
> +TEST_CLASS = "General"
> +TEST_TYPE = "client"
> +TIME = 'MEDIUM'
> +DOC = """\
> +
> +The Flexible Filesystem Benchmark (FFSB) is a cross-platform
> +filesystem performance measurement tool. It uses customizable
> +profiles to measure of different workloads, and it supports
> +multiple groups of threads across multiple filesystems.
> +
> +For more info, see http://sourceforge.net/projects/ffsb/
> +
> +"""
> +
> +job.run_test('ffsb')
> diff --git a/client/tests/kvm/tests_base.cfg.sample 
> b/client/tests/kvm/tests_base.cfg.sample
> index b7342bd..346bfbf 100644
> --- a/client/tests/kvm/tests_base.cfg.sample
> +++ b/client/tests/kvm/tests_base.cfg.sample
> @@ -302,6 +302,8 @@ variants:
>                 test_control_file = bonnie.control
>             - ebizzy:
>                 test_control_file = ebizzy.control
> +            - ffsb:
> +                test_control_file = ffsb.control
>             - stress:
>                 test_control_file = stress.control
>             - disktest:
> --
> 1.7.3.1
>
>
> _______________________________________________
> Autotest mailing list
> [email protected]
> http://test.kernel.org/cgi-bin/mailman/listinfo/autotest
>
>



-- 
Lucas
_______________________________________________
Autotest mailing list
[email protected]
http://test.kernel.org/cgi-bin/mailman/listinfo/autotest

Reply via email to