ACK: [PATCH][autotest] UBUNTU SAUCE: ubuntu_performance_fio: add device and file system support

Sean Feole sean.feole at canonical.com
Wed Apr 8 15:33:39 UTC 2020


FYI, this has already been pushed,
And i'm +1

On 4/8/20 11:12 AM, Colin King wrote:
> From: Colin Ian King <colin.king at canonical.com>
>
> Add support to specify target device and file system to allow finer
> control for performance testing. This is backwardly compatible with
> the previous mode of operation.
>
> One can now specify the device with TEST_DRIVE_DEV and the file
> system with TEST_FILESYSTEM variables.  File systems currently
> supported are: xfs, jfs, btrfs, zfs and ext4.  One needs to run the
> test using sudo -E to pass the settings through sudo to the autotest
> environment, for example:
>
> TEST_DRIVE_DEV=/dev/nvme0n1 TEST_FILESYSTEM=zfs sudo -E \
>    autotest/client/autotest-local autotest/client/tests/ubuntu_performance_fio/control
>
> If TEST_DRIVE_DEV and TEST_FILESYSTEM are not defined then the fio test will
> run in the older legacy mode which is still required for some existing projects.
>
> This test is specifically designed to be automatically run by jenkins, the
> output is machine parsed and data scraped and populated into an influxdb
> for trend plotting.  Hence the tagged names are rather long and unwieldy
> as they contain test context.
>
> Signed-off-by: Colin Ian King <colin.king at canonical.com>
> ---
>   ubuntu_performance_fio/control                | 85 +++++++++++-------
>   .../ubuntu_performance_fio.py                 | 90 ++++++++++++++++++-
>   2 files changed, 140 insertions(+), 35 deletions(-)
>
> diff --git a/ubuntu_performance_fio/control b/ubuntu_performance_fio/control
> index 11fbda19..5c1205dc 100644
> --- a/ubuntu_performance_fio/control
> +++ b/ubuntu_performance_fio/control
> @@ -13,47 +13,70 @@ DOC = ""
>   name = 'ubuntu_performance_fio'
>   
>   tests = [
> -	'rd-100,wr-0,rand,blk-8k,jobs-4,iodepth-32',
> -	'rd-100,wr-0,rand,blk-8k,jobs-8,iodepth-32',
> -	'rd-100,wr-0,rand,blk-8k,jobs-16,iodepth-32',
> +    'rd-100,wr-0,rand,blk-8k,jobs-4,iodepth-32',
> +    'rd-100,wr-0,rand,blk-8k,jobs-8,iodepth-32',
> +    'rd-100,wr-0,rand,blk-8k,jobs-16,iodepth-32',
>   
> -	'rd-100,wr-0,rand,blk-128k,jobs-4,iodepth-8',
> -	'rd-100,wr-0,rand,blk-128k,jobs-8,iodepth-8',
> -	'rd-100,wr-0,rand,blk-128k,jobs-16,iodepth-8',
> +    'rd-100,wr-0,rand,blk-128k,jobs-4,iodepth-8',
> +    'rd-100,wr-0,rand,blk-128k,jobs-8,iodepth-8',
> +    'rd-100,wr-0,rand,blk-128k,jobs-16,iodepth-8',
>   
> -	'rd-100,wr-0,seq,blk-128k,jobs-4,iodepth-8',
> -	'rd-100,wr-0,seq,blk-128k,jobs-8,iodepth-8',
> -	'rd-100,wr-0,seq,blk-128k,jobs-16,iodepth-8',
> +    'rd-100,wr-0,seq,blk-128k,jobs-4,iodepth-8',
> +    'rd-100,wr-0,seq,blk-128k,jobs-8,iodepth-8',
> +    'rd-100,wr-0,seq,blk-128k,jobs-16,iodepth-8',
>   
> -	'rd-0,wr-100,rand,blk-8k,jobs-4,iodepth-32',
> -	'rd-0,wr-100,rand,blk-8k,jobs-8,iodepth-32',
> -	'rd-0,wr-100,rand,blk-8k,jobs-16,iodepth-32',
> +    'rd-0,wr-100,rand,blk-8k,jobs-4,iodepth-32',
> +    'rd-0,wr-100,rand,blk-8k,jobs-8,iodepth-32',
> +    'rd-0,wr-100,rand,blk-8k,jobs-16,iodepth-32',
>   
> -	'rd-0,wr-100,seq,blk-128k,jobs-16,iodepth-8',
> -	'rd-0,wr-100,seq,blk-128k,jobs-4,iodepth-8',
> -	'rd-0,wr-100,seq,blk-128k,jobs-8,iodepth-8',
> +    'rd-0,wr-100,seq,blk-128k,jobs-16,iodepth-8',
> +    'rd-0,wr-100,seq,blk-128k,jobs-4,iodepth-8',
> +    'rd-0,wr-100,seq,blk-128k,jobs-8,iodepth-8',
>   
> -	'rd-75,wr-25,rand,blk-8k,jobs-16,iodepth-32',
> -	'rd-75,wr-25,rand,blk-8k,jobs-4,iodepth-32',
> -	'rd-75,wr-25,rand,blk-8k,jobs-8,iodepth-32',
> +    'rd-75,wr-25,rand,blk-8k,jobs-16,iodepth-32',
> +    'rd-75,wr-25,rand,blk-8k,jobs-4,iodepth-32',
> +    'rd-75,wr-25,rand,blk-8k,jobs-8,iodepth-32',
>   ]
>   
>   results = job.run_test_detail('ubuntu_performance_fio', test_name='setup', tag='setup', media='')
>   
> -media_types = [ 'ramdisk', 'dataset' ]
> -#
> -# Spec states that config1 should not run ramdisk tests
> -#
> -if 'TEST_CONFIG' in os.environ:
> -	if  os.environ['TEST_CONFIG'] == 'config1':
> -		media_types = [ 'dataset' ]
> -
> -#
> -#  Media is 'ramdisk' (/dev/shm) or 'dataset' (normally a raid device)
> -#
> -for media_type in media_types:
> +if 'TEST_DRIVE_DEV' in os.environ and 'TEST_FILESYSTEM' in os.environ:
> +    #
> +    #  Normal ubuntu kernel team regression fio tests (for graphana profile data)
> +    #
>       for test in tests:
> -	results += job.run_test_detail('ubuntu_performance_fio', test_name=test, tag='ubuntu-performance-fio-' + media_type + '-' + test, media=media_type, timeout=120*60)
> +        device = os.environ['TEST_DRIVE_DEV']
> +        devname = device.replace('/dev/', '')
> +        devname = devname.replace('/', '-')
> +        hostname = os.uname()[1]
> +        model = utils.system_output('lsblk ' + device + ' -io MODEL -n').splitlines()
> +        if len(model) > 0:
> +            model = model[0].rstrip()
> +        else:
> +            model = 'unknown'
> +        model = model.replace(' ', '').replace('-', '')
> +        model = model.lower()
> +        media = hostname + '-' + devname + '-' + model + '-' + os.environ['TEST_FILESYSTEM']
> +        meida = media
> +        tag = 'ubuntu-performance-fio-' + media + '-' + test.replace(',','-')
> +        results += job.run_test_detail('ubuntu_performance_fio', test_name=test, tag=tag, media=media, timeout=120*60)
> +else:
> +    #
> +    #  Legacy fio tests for large host testing
> +    #
> +    media_types = [ 'ramdisk', 'dataset' ]
> +    #
> +    # Spec states that config1 should not run ramdisk tests
> +    #
> +    if 'TEST_CONFIG' in os.environ:
> +        if  os.environ['TEST_CONFIG'] == 'config1':
> +            media_types = [ 'dataset' ]
> +    #
> +    #  Media is 'ramdisk' (/dev/shm) or 'dataset' (normally a raid device)
> +    #
> +    for media_type in media_types:
> +        for test in tests:
> +            results += job.run_test_detail('ubuntu_performance_fio', test_name=test, tag='ubuntu-performance-fio-' + media_type + '-' + test, media=media_type, timeout=120*60)
>   
>   print results
>   
> diff --git a/ubuntu_performance_fio/ubuntu_performance_fio.py b/ubuntu_performance_fio/ubuntu_performance_fio.py
> index 31cc406b..8209e324 100644
> --- a/ubuntu_performance_fio/ubuntu_performance_fio.py
> +++ b/ubuntu_performance_fio/ubuntu_performance_fio.py
> @@ -8,6 +8,11 @@ import subprocess
>   import resource
>   import shutil
>   from autotest.client import test, utils
> +from autotest.client.shared import error
> +
> +TEST_FILESYSTEM = os.getenv('TEST_FILESYSTEM')
> +TEST_DRIVE_DEV  = os.getenv('TEST_DRIVE_DEV')
> +TEST_MNT = '/mnt/autotest-fio'
>   
>   #
>   #  Number of test iterations to get min/max/average stats
> @@ -96,7 +101,11 @@ class ubuntu_performance_fio(test.test):
>               'build-essential',
>               'libaio-dev',
>               'linux-tools-generic',
> -            'linux-tools-' + release
> +            'linux-tools-' + release,
> +            'xfsprogs',
> +            'btrfs-progs',
> +            'jfsutils',
> +            'zfsutils-linux'
>           ]
>           gcc = 'gcc' if arch in ['ppc64le', 'aarch64', 's390x'] else 'gcc-multilib'
>           pkgs.append(gcc)
> @@ -104,6 +113,72 @@ class ubuntu_performance_fio(test.test):
>           cmd = 'apt-get install --yes --force-yes ' + ' '.join(pkgs)
>           self.results = utils.system_output(cmd, retain_output=True)
>   
> +    def setup_drive(self):
> +        if TEST_FILESYSTEM == None or TEST_DRIVE_DEV == None:
> +            print("No test drive information provided, running on %s" % os.getcwd())
> +            return True
> +        for line in open('/proc/mounts').readlines():
> +            words = line.split()
> +            if len(words) > 2 and TEST_DRIVE_DEV in words[0]:
> +                raise error.TestError("Device %s seems to be mounted on %s, aborting" % (TEST_DRIVE_DEV, words[1]))
> +                return False
> +
> +        print("Testing on device %s with file system %s\n" % (TEST_DRIVE_DEV, TEST_FILESYSTEM))
> +
> +        if os.path.exists(TEST_MNT):
> +            os.rmdir(TEST_MNT)
> +
> +        os.mkdir(TEST_MNT)
> +        self.results = utils.system_output('dd if=/dev/zero of=%s bs=1M count=64' % TEST_DRIVE_DEV)
> +        if TEST_FILESYSTEM == 'ext4':
> +            cmd = 'mkfs.ext4 -F ' + TEST_DRIVE_DEV
> +            self.results += utils.system_output(cmd)
> +            self.results += utils.system_output('mount ' + TEST_DRIVE_DEV + ' ' + TEST_MNT)
> +        elif TEST_FILESYSTEM == 'xfs':
> +            cmd = 'mkfs.xfs -f ' + TEST_DRIVE_DEV
> +            self.results += utils.system_output(cmd)
> +            self.results += utils.system_output('mount ' + TEST_DRIVE_DEV + ' ' + TEST_MNT)
> +        elif TEST_FILESYSTEM == 'btrfs':
> +            cmd = 'mkfs.btrfs -f ' + TEST_DRIVE_DEV
> +            self.results += utils.system_output(cmd)
> +            self.results += utils.system_output('mount ' + TEST_DRIVE_DEV + ' ' + TEST_MNT)
> +        elif TEST_FILESYSTEM == 'jfs':
> +            cmd = 'mkfs.jfs ' + TEST_DRIVE_DEV
> +            self.results += utils.system_output(cmd)
> +            self.results += utils.system_output('mount ' + TEST_DRIVE_DEV + ' ' + TEST_MNT)
> +        elif TEST_FILESYSTEM == 'zfs':
> +            cmd = 'zpool create -f fiopool ' + TEST_DRIVE_DEV
> +            self.results += utils.system_output(cmd)
> +            cmd = 'zfs create fiopool/test'
> +            self.results += utils.system_output(cmd)
> +            cmd = 'zfs set mountpoint=' + TEST_MNT + ' fiopool/test'
> +            self.results += utils.system_output(cmd)
> +        else:
> +            raise error.TestError("Unknown file system TEST_FILESYSTEM=%s, aborting" % TEST_FILESYSTEM)
> +
> +        return True
> +
> +    def cleanup_drive(self):
> +        if TEST_FILESYSTEM == None or TEST_DRIVE_DEV == None:
> +            return
> +        self.results = utils.system_output('umount ' + TEST_MNT)
> +        if os.path.exists(TEST_MNT):
> +            os.rmdir(TEST_MNT)
> +        if TEST_FILESYSTEM == 'zfs':
> +            self.results += utils.system_output('zpool destroy fiopool')
> +        for i in xrange(60):
> +            mounted = False
> +            for line in open('/proc/mounts').readlines():
> +                words = line.split()
> +                if len(words) > 2 and TEST_MNT in words[1]:
> +                    mounted = True
> +                    break
> +            if not mounted:
> +                return
> +            time.sleep(1.0)
> +
> +        raise error.TestError("Failed to unmount %s filesystem from %s, aborting" % (TEST_FILESYSTEM, TEST_MNT))
> +
>       def initialize(self):
>           pass
>   
> @@ -188,6 +263,8 @@ class ubuntu_performance_fio(test.test):
>               "(sec)" : 1000000.0,
>           }
>   
> +        self.setup_drive()
> +
>           #
>           #  Edit various fio configs to use dynamic settings
>           #  relevant to this test location and test size
> @@ -205,13 +282,18 @@ class ubuntu_performance_fio(test.test):
>           file_size = "%dM" % (file_size_mb)
>   
>           for line in fin:
> -            line = line.replace("DIRECTORY", test_dir)
> +            if TEST_FILESYSTEM == None or TEST_DRIVE_DEV == None:
> +                line = line.replace("DIRECTORY", test_dir)
> +            else:
> +                line = line.replace("DIRECTORY", TEST_MNT)
>               line = line.replace("SIZE", file_size)
>               #
> -            #  ramdisk can't do O_DIRECT, so skip this
> +            #  zfs and ramdisk can't do O_DIRECT, so skip this
>               #
>               if media == 'ramdisk' and "direct=1" in line:
>                   continue
> +            if TEST_FILESYSTEM == 'zfs' and "direct=1" in line:
> +                continue
>               fout.write(line)
>           fin.close()
>           fout.close()
> @@ -264,6 +346,7 @@ class ubuntu_performance_fio(test.test):
>           values['latency_stddev'] = stdev
>   
>           self.fio_clean_files(testname)
> +        self.cleanup_drive()
>   
>           return values
>   
> @@ -351,5 +434,4 @@ class ubuntu_performance_fio(test.test):
>               print 'cannot execute "%s", required %dMB, only got %dMB on disc' % (test_name, file_size_mb, free_mb)
>           print
>   
> -
>   # vi:set ts=4 sw=4 expandtab syntax=python:

-- 
-Sean Feole

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.ubuntu.com/archives/kernel-team/attachments/20200408/ede740d4/attachment-0001.html>


More information about the kernel-team mailing list