普通文本  |  252行  |  10.74 KB

import os, re
from autotest_lib.client.bin import test, utils
from autotest_lib.client.common_lib import error


class unixbench5(test.test):
    """
    This test measure system wide performance by running the following tests:
      - Dhrystone - focuses on string handling.
      - Whetstone - measure floating point operations.
      - Execl Throughput - measure the number of execl calls per second.
      - File Copy
      - Pipe throughput
      - Pipe-based context switching
      - Process creation - number of times a process can fork and reap
      - Shell Scripts - number of times a process can start and reap a script
      - System Call Overhead - estimates the cost of entering and leaving the
        kernel.

    @see: http://code.google.com/p/byte-unixbench/
    @author: Dale Curtis <dalecurtis@google.com>
    """
    version = 1


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


    def setup(self, tarball='unixbench-5.1.3.tgz'):
        """
        Compiles unixbench.

        @tarball: Path or URL to a unixbench tarball
        @see: http://byte-unixbench.googlecode.com/files/unixbench-5.1.3.tgz
        """
        tarball = utils.unmap_url(self.bindir, tarball, self.tmpdir)
        utils.extract_tarball_to_dir(tarball, self.srcdir)
        os.chdir(self.srcdir)

        utils.system('patch -p0 < ../Makefile.patch')
        utils.make()


    def run_once(self, args=''):
        vars = 'UB_TMPDIR="%s" UB_RESULTDIR="%s"' % (self.tmpdir,
                                                     self.resultsdir)
        os.chdir(self.srcdir)
        self.report_data = utils.system_output(vars + ' ./Run ' + args)
        self.results_path = os.path.join(self.resultsdir,
                                         'raw_output_%s' % self.iteration)
        utils.open_write_close(self.results_path, self.report_data)


    def cleanup(self):
        """
        Check error index list and throw TestError if necessary.
        """
        if self.err:
            e_msg = ("No measured results for output lines: %s\nOutput:%s" %
                     (" ".join(self.err), self.report_data))
            raise error.TestError(e_msg)


    def process_section(self, section, suffix):
        keyval = {}
        subsections = section.split('\n\n')

        if len(subsections) < 3:
            raise error.TestError('Invalid output format. Unable to parse')

        # Process the subsection containing performance results first.
        for index, line in enumerate(subsections[1].strip().split('\n')):
            # Look for problems first.
            if re.search('no measured results', line, flags=re.IGNORECASE):
                self.err.append(str(index + 1))

            # Every performance result line ends with 6 values, with the sixth
            # being the actual result. Make sure there are at least that words
            # in the line before processing.
            words = line.lower().split()
            if len(words) >= 6:
                key = re.sub('\W', '', '_'.join(words[:-6]))
                keyval[key + suffix] = words[-6]

        # The final score should be the last item in the third subsection.
        keyval['score' + suffix] = subsections[2].strip().split()[-1]

        self.write_perf_keyval(keyval)


    def postprocess_iteration(self):
        # Break up sections around dividing lines.
        sections = self.report_data.split('-'*72)

        # First section is junk to us, second has results for single CPU run.
        if len(sections) > 1:
            self.process_section(section=sections[1], suffix='')

            # Only machines with > 1 CPU will have a 3rd section.
            if len(sections) > 2:
                self.process_section(section=sections[2], suffix='_multi')
        else:
            raise error.TestError('Invalid output format. Unable to parse')


""" Here is a sample output:

   #    #  #    #  #  #    #          #####   ######  #    #   ####   #    #
   #    #  ##   #  #   #  #           #    #  #       ##   #  #    #  #    #
   #    #  # #  #  #    ##            #####   #####   # #  #  #       ######
   #    #  #  # #  #    ##            #    #  #       #  # #  #       #    #
   #    #  #   ##  #   #  #           #    #  #       #   ##  #    #  #    #
    ####   #    #  #  #    #          #####   ######  #    #   ####   #    #

   Version 5.1.2                      Based on the Byte Magazine Unix Benchmark

   Multi-CPU version                  Version 5 revisions by Ian Smith,
                                      Sunnyvale, CA, USA
   December 22, 2007                  johantheghost at yahoo period com


1 x Dhrystone 2 using register variables  1 2 3 4 5 6 7 8 9 10

1 x Double-Precision Whetstone  1 2 3 4 5 6 7 8 9 10

1 x Execl Throughput  1 2 3

1 x File Copy 1024 bufsize 2000 maxblocks  1 2 3

1 x File Copy 256 bufsize 500 maxblocks  1 2 3

1 x File Copy 4096 bufsize 8000 maxblocks  1 2 3

1 x Pipe Throughput  1 2 3 4 5 6 7 8 9 10

1 x Pipe-based Context Switching  1 2 3 4 5 6 7 8 9 10

1 x Process Creation  1 2 3

1 x System Call Overhead  1 2 3 4 5 6 7 8 9 10

1 x Shell Scripts (1 concurrent)  1 2 3

1 x Shell Scripts (8 concurrent)  1 2 3

2 x Dhrystone 2 using register variables  1 2 3 4 5 6 7 8 9 10

2 x Double-Precision Whetstone  1 2 3 4 5 6 7 8 9 10

2 x Execl Throughput  1 2 3

2 x File Copy 1024 bufsize 2000 maxblocks  1 2 3

2 x File Copy 256 bufsize 500 maxblocks  1 2 3

2 x File Copy 4096 bufsize 8000 maxblocks  1 2 3

2 x Pipe Throughput  1 2 3 4 5 6 7 8 9 10

2 x Pipe-based Context Switching  1 2 3 4 5 6 7 8 9 10

2 x Process Creation  1 2 3

2 x System Call Overhead  1 2 3 4 5 6 7 8 9 10

2 x Shell Scripts (1 concurrent)  1 2 3

2 x Shell Scripts (8 concurrent)  1 2 3

========================================================================
   BYTE UNIX Benchmarks (Version 5.1.2)

   System: localhost: GNU/Linux
   OS: GNU/Linux -- 2.6.32.26+drm33.12 -- #1 SMP Wed Jan 12 16:16:05 PST 2011
   Machine: i686 (GenuineIntel)
   Language: en_US.utf8 (charmap=, collate=)
   CPU 0: Intel(R) Atom(TM) CPU N455 @ 1.66GHz (3325.2 bogomips)
          Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT
   CPU 1: Intel(R) Atom(TM) CPU N455 @ 1.66GHz (3325.0 bogomips)
          Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT
   14:11:59 up 1 day,  1:10,  0 users,  load average: 0.47, 0.48, 0.51; runlevel

------------------------------------------------------------------------
Benchmark Run: Fri Jan 14 2011 14:11:59 - 14:41:26
2 CPUs in system; running 1 parallel copy of tests

Dhrystone 2 using register variables        2264000.6 lps   (10.0 s, 7 samples)
Double-Precision Whetstone                      507.0 MWIPS (10.1 s, 7 samples)
Execl Throughput                                796.7 lps   (30.0 s, 2 samples)
File Copy 1024 bufsize 2000 maxblocks        110924.1 KBps  (30.1 s, 2 samples)
File Copy 256 bufsize 500 maxblocks           32600.5 KBps  (30.1 s, 2 samples)
File Copy 4096 bufsize 8000 maxblocks        284236.5 KBps  (30.0 s, 2 samples)
Pipe Throughput                              301672.5 lps   (10.0 s, 7 samples)
Pipe-based Context Switching                  29475.3 lps   (10.0 s, 7 samples)
Process Creation                               3124.6 lps   (30.0 s, 2 samples)
Shell Scripts (1 concurrent)                   1753.0 lpm   (60.0 s, 2 samples)
Shell Scripts (8 concurrent)                    305.9 lpm   (60.1 s, 2 samples)
System Call Overhead                         592781.7 lps   (10.0 s, 7 samples)

System Benchmarks Index Values               BASELINE       RESULT    INDEX
Dhrystone 2 using register variables         116700.0    2264000.6    194.0
Double-Precision Whetstone                       55.0        507.0     92.2
Execl Throughput                                 43.0        796.7    185.3
File Copy 1024 bufsize 2000 maxblocks          3960.0     110924.1    280.1
File Copy 256 bufsize 500 maxblocks            1655.0      32600.5    197.0
File Copy 4096 bufsize 8000 maxblocks          5800.0     284236.5    490.1
Pipe Throughput                               12440.0     301672.5    242.5
Pipe-based Context Switching                   4000.0      29475.3     73.7
Process Creation                                126.0       3124.6    248.0
Shell Scripts (1 concurrent)                     42.4       1753.0    413.4
Shell Scripts (8 concurrent)                      6.0        305.9    509.8
System Call Overhead                          15000.0     592781.7    395.2
                                                                   ========
System Benchmarks Index Score                                         238.0

------------------------------------------------------------------------
Benchmark Run: Fri Jan 14 2011 14:41:26 - 15:09:23
2 CPUs in system; running 2 parallel copies of tests

Dhrystone 2 using register variables        3411919.6 lps   (10.0 s, 7 samples)
Double-Precision Whetstone                      964.3 MWIPS (10.1 s, 7 samples)
Execl Throughput                               2053.5 lps   (30.0 s, 2 samples)
File Copy 1024 bufsize 2000 maxblocks        158308.0 KBps  (30.0 s, 2 samples)
File Copy 256 bufsize 500 maxblocks           46249.5 KBps  (30.0 s, 2 samples)
File Copy 4096 bufsize 8000 maxblocks        389881.9 KBps  (30.0 s, 2 samples)
Pipe Throughput                              410193.1 lps   (10.0 s, 7 samples)
Pipe-based Context Switching                 113780.0 lps   (10.0 s, 7 samples)
Process Creation                               7609.0 lps   (30.0 s, 2 samples)
Shell Scripts (1 concurrent)                   2355.0 lpm   (60.0 s, 2 samples)
Shell Scripts (8 concurrent)                    308.1 lpm   (60.2 s, 2 samples)
System Call Overhead                        1057063.2 lps   (10.0 s, 7 samples)

System Benchmarks Index Values               BASELINE       RESULT    INDEX
Dhrystone 2 using register variables         116700.0    3411919.6    292.4
Double-Precision Whetstone                       55.0        964.3    175.3
Execl Throughput                                 43.0       2053.5    477.6
File Copy 1024 bufsize 2000 maxblocks          3960.0     158308.0    399.8
File Copy 256 bufsize 500 maxblocks            1655.0      46249.5    279.5
File Copy 4096 bufsize 8000 maxblocks          5800.0     389881.9    672.2
Pipe Throughput                               12440.0     410193.1    329.7
Pipe-based Context Switching                   4000.0     113780.0    284.5
Process Creation                                126.0       7609.0    603.9
Shell Scripts (1 concurrent)                     42.4       2355.0    555.4
Shell Scripts (8 concurrent)                      6.0        308.1    513.5
System Call Overhead                          15000.0    1057063.2    704.7
                                                                   ========
System Benchmarks Index Score                                         407.4

"""