From patchwork Wed Mar 18 01:12:14 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Eduardo Habkost X-Patchwork-Id: 11444379 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 7EA8D6CA for ; Wed, 18 Mar 2020 01:13:39 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 5460C206EC for ; Wed, 18 Mar 2020 01:13:39 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="fVutRdIO" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 5460C206EC Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=redhat.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Received: from localhost ([::1]:43872 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jENH8-0000Cm-Gi for patchwork-qemu-devel@patchwork.kernel.org; Tue, 17 Mar 2020 21:13:38 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:57374) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jENG0-0007Rt-Vm for qemu-devel@nongnu.org; Tue, 17 Mar 2020 21:12:34 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1jENFz-0004UN-Gm for qemu-devel@nongnu.org; Tue, 17 Mar 2020 21:12:28 -0400 Received: from us-smtp-delivery-74.mimecast.com ([63.128.21.74]:32354) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1jENFz-0004QY-Bc for qemu-devel@nongnu.org; Tue, 17 Mar 2020 21:12:27 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1584493946; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=yKMemzxXZBqk7hT78k1ip1hdWck5pBCC98Uw9VTFjSo=; b=fVutRdIOZH3e+9Si4RSxAOYsVR+dJ5JUsO131hN3s4/yZs3eOmTH8ninORn89JJUjJWwKQ RUkdQ1czrfXOmQuCHVEAmyO+Hw3zl1L7eELIwsNfVJ7COOS11jdbpUduzSlQVdTRZca8qm GZlg/2sKYoUzxp8FEqaCahxnm2GUkLM= Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-270-xYSISwthPhuw69n-uEXj1g-1; Tue, 17 Mar 2020 21:12:22 -0400 X-MC-Unique: xYSISwthPhuw69n-uEXj1g-1 Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id D591B1857BE0; Wed, 18 Mar 2020 01:12:21 +0000 (UTC) Received: from localhost (ovpn-118-148.rdu2.redhat.com [10.10.118.148]) by smtp.corp.redhat.com (Postfix) with ESMTP id 731B37386D; Wed, 18 Mar 2020 01:12:21 +0000 (UTC) From: Eduardo Habkost To: qemu-devel@nongnu.org, Cleber Rosa , Peter Maydell Subject: [PULL 1/4] scripts/simplebench: add simplebench.py Date: Tue, 17 Mar 2020 21:12:14 -0400 Message-Id: <20200318011217.2102748-2-ehabkost@redhat.com> In-Reply-To: <20200318011217.2102748-1-ehabkost@redhat.com> References: <20200318011217.2102748-1-ehabkost@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.15 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 63.128.21.74 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Vladimir Sementsov-Ogievskiy , Aleksandar Markovic Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" From: Vladimir Sementsov-Ogievskiy Add simple benchmark table creator. Signed-off-by: Vladimir Sementsov-Ogievskiy Reviewed-by: Aleksandar Markovic Message-Id: <20200228071914.11746-2-vsementsov@virtuozzo.com> Signed-off-by: Eduardo Habkost --- scripts/simplebench/simplebench.py | 128 +++++++++++++++++++++++++++++ 1 file changed, 128 insertions(+) create mode 100644 scripts/simplebench/simplebench.py diff --git a/scripts/simplebench/simplebench.py b/scripts/simplebench/simplebench.py new file mode 100644 index 0000000000..59e7314ff6 --- /dev/null +++ b/scripts/simplebench/simplebench.py @@ -0,0 +1,128 @@ +#!/usr/bin/env python +# +# Simple benchmarking framework +# +# Copyright (c) 2019 Virtuozzo International GmbH. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# + + +def bench_one(test_func, test_env, test_case, count=5, initial_run=True): + """Benchmark one test-case + + test_func -- benchmarking function with prototype + test_func(env, case), which takes test_env and test_case + arguments and returns {'seconds': int} (which is benchmark + result) on success and {'error': str} on error. Returned + dict may contain any other additional fields. + test_env -- test environment - opaque first argument for test_func + test_case -- test case - opaque second argument for test_func + count -- how many times to call test_func, to calculate average + initial_run -- do initial run of test_func, which don't get into result + + Returns dict with the following fields: + 'runs': list of test_func results + 'average': average seconds per run (exists only if at least one run + succeeded) + 'delta': maximum delta between test_func result and the average + (exists only if at least one run succeeded) + 'n-failed': number of failed runs (exists only if at least one run + failed) + """ + if initial_run: + print(' #initial run:') + print(' ', test_func(test_env, test_case)) + + runs = [] + for i in range(count): + print(' #run {}'.format(i+1)) + res = test_func(test_env, test_case) + print(' ', res) + runs.append(res) + + result = {'runs': runs} + + successed = [r for r in runs if ('seconds' in r)] + if successed: + avg = sum(r['seconds'] for r in successed) / len(successed) + result['average'] = avg + result['delta'] = max(abs(r['seconds'] - avg) for r in successed) + + if len(successed) < count: + result['n-failed'] = count - len(successed) + + return result + + +def ascii_one(result): + """Return ASCII representation of bench_one() returned dict.""" + if 'average' in result: + s = '{:.2f} +- {:.2f}'.format(result['average'], result['delta']) + if 'n-failed' in result: + s += '\n({} failed)'.format(result['n-failed']) + return s + else: + return 'FAILED' + + +def bench(test_func, test_envs, test_cases, *args, **vargs): + """Fill benchmark table + + test_func -- benchmarking function, see bench_one for description + test_envs -- list of test environments, see bench_one + test_cases -- list of test cases, see bench_one + args, vargs -- additional arguments for bench_one + + Returns dict with the following fields: + 'envs': test_envs + 'cases': test_cases + 'tab': filled 2D array, where cell [i][j] is bench_one result for + test_cases[i] for test_envs[j] (i.e., rows are test cases and + columns are test environments) + """ + tab = {} + results = { + 'envs': test_envs, + 'cases': test_cases, + 'tab': tab + } + n = 1 + n_tests = len(test_envs) * len(test_cases) + for env in test_envs: + for case in test_cases: + print('Testing {}/{}: {} :: {}'.format(n, n_tests, + env['id'], case['id'])) + if case['id'] not in tab: + tab[case['id']] = {} + tab[case['id']][env['id']] = bench_one(test_func, env, case, + *args, **vargs) + n += 1 + + print('Done') + return results + + +def ascii(results): + """Return ASCII representation of bench() returned dict.""" + from tabulate import tabulate + + tab = [[""] + [c['id'] for c in results['envs']]] + for case in results['cases']: + row = [case['id']] + for env in results['envs']: + row.append(ascii_one(results['tab'][case['id']][env['id']])) + tab.append(row) + + return tabulate(tab) From patchwork Wed Mar 18 01:12:15 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Eduardo Habkost X-Patchwork-Id: 11444381 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id A3E456CA for ; Wed, 18 Mar 2020 01:13:47 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 79F70206EC for ; Wed, 18 Mar 2020 01:13:47 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="VAa6s4CF" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 79F70206EC Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=redhat.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Received: from localhost ([::1]:43874 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jENHG-0000NT-HG for patchwork-qemu-devel@patchwork.kernel.org; Tue, 17 Mar 2020 21:13:46 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:57433) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jENG7-0007Ty-Bk for qemu-devel@nongnu.org; Tue, 17 Mar 2020 21:12:36 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1jENG5-0004i3-SN for qemu-devel@nongnu.org; Tue, 17 Mar 2020 21:12:35 -0400 Received: from us-smtp-delivery-74.mimecast.com ([216.205.24.74]:41668) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1jENG1-0004fx-LC for qemu-devel@nongnu.org; Tue, 17 Mar 2020 21:12:33 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1584493949; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=h6CSWcVjwf/mR4GA8o7TUHijgY6z8lbK7E/cQiK0XOA=; b=VAa6s4CFrye3cuxw0zXCSlZ7iPwh7qElhp/DxPe8vZXvx2miNrrPUYXIQkzVNCV9LFWvpp 6/zqZFwu0QwylVDi+RMw/kiiKYgkg545NVS62GHR6X0797gBCKmQgCL7gNGNGWHn8GtdvB MC6OYFvD+HlYOPxnaTA+F22jNov6rnM= Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-419-COwiw_BiM5Gjr-Rzf1XJkw-1; Tue, 17 Mar 2020 21:12:25 -0400 X-MC-Unique: COwiw_BiM5Gjr-Rzf1XJkw-1 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id BAB5E13F7; Wed, 18 Mar 2020 01:12:23 +0000 (UTC) Received: from localhost (ovpn-118-148.rdu2.redhat.com [10.10.118.148]) by smtp.corp.redhat.com (Postfix) with ESMTP id 575898AC30; Wed, 18 Mar 2020 01:12:23 +0000 (UTC) From: Eduardo Habkost To: qemu-devel@nongnu.org, Cleber Rosa , Peter Maydell Subject: [PULL 2/4] scripts/simplebench: add qemu/bench_block_job.py Date: Tue, 17 Mar 2020 21:12:15 -0400 Message-Id: <20200318011217.2102748-3-ehabkost@redhat.com> In-Reply-To: <20200318011217.2102748-1-ehabkost@redhat.com> References: <20200318011217.2102748-1-ehabkost@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 216.205.24.74 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Vladimir Sementsov-Ogievskiy , Aleksandar Markovic Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" From: Vladimir Sementsov-Ogievskiy Add block-job benchmarking helper functions. Signed-off-by: Vladimir Sementsov-Ogievskiy Reviewed-by: Aleksandar Markovic Message-Id: <20200228071914.11746-3-vsementsov@virtuozzo.com> Signed-off-by: Eduardo Habkost --- scripts/simplebench/bench_block_job.py | 119 +++++++++++++++++++++++++ 1 file changed, 119 insertions(+) create mode 100755 scripts/simplebench/bench_block_job.py diff --git a/scripts/simplebench/bench_block_job.py b/scripts/simplebench/bench_block_job.py new file mode 100755 index 0000000000..9808d696cf --- /dev/null +++ b/scripts/simplebench/bench_block_job.py @@ -0,0 +1,119 @@ +#!/usr/bin/env python +# +# Benchmark block jobs +# +# Copyright (c) 2019 Virtuozzo International GmbH. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# + + +import sys +import os +import socket +import json + +sys.path.append(os.path.join(os.path.dirname(__file__), '..', '..', 'python')) +from qemu.machine import QEMUMachine +from qemu.qmp import QMPConnectError + + +def bench_block_job(cmd, cmd_args, qemu_args): + """Benchmark block-job + + cmd -- qmp command to run block-job (like blockdev-backup) + cmd_args -- dict of qmp command arguments + qemu_args -- list of Qemu command line arguments, including path to Qemu + binary + + Returns {'seconds': int} on success and {'error': str} on failure, dict may + contain addional 'vm-log' field. Return value is compatible with + simplebench lib. + """ + + vm = QEMUMachine(qemu_args[0], args=qemu_args[1:]) + + try: + vm.launch() + except OSError as e: + return {'error': 'popen failed: ' + str(e)} + except (QMPConnectError, socket.timeout): + return {'error': 'qemu failed: ' + str(vm.get_log())} + + try: + res = vm.qmp(cmd, **cmd_args) + if res != {'return': {}}: + vm.shutdown() + return {'error': '"{}" command failed: {}'.format(cmd, str(res))} + + e = vm.event_wait('JOB_STATUS_CHANGE') + assert e['data']['status'] == 'created' + start_ms = e['timestamp']['seconds'] * 1000000 + \ + e['timestamp']['microseconds'] + + e = vm.events_wait((('BLOCK_JOB_READY', None), + ('BLOCK_JOB_COMPLETED', None), + ('BLOCK_JOB_FAILED', None)), timeout=True) + if e['event'] not in ('BLOCK_JOB_READY', 'BLOCK_JOB_COMPLETED'): + vm.shutdown() + return {'error': 'block-job failed: ' + str(e), + 'vm-log': vm.get_log()} + end_ms = e['timestamp']['seconds'] * 1000000 + \ + e['timestamp']['microseconds'] + finally: + vm.shutdown() + + return {'seconds': (end_ms - start_ms) / 1000000.0} + + +# Bench backup or mirror +def bench_block_copy(qemu_binary, cmd, source, target): + """Helper to run bench_block_job() for mirror or backup""" + assert cmd in ('blockdev-backup', 'blockdev-mirror') + + source['node-name'] = 'source' + target['node-name'] = 'target' + + return bench_block_job(cmd, + {'job-id': 'job0', 'device': 'source', + 'target': 'target', 'sync': 'full'}, + [qemu_binary, + '-blockdev', json.dumps(source), + '-blockdev', json.dumps(target)]) + + +def drv_file(filename): + return {'driver': 'file', 'filename': filename, + 'cache': {'direct': True}, 'aio': 'native'} + + +def drv_nbd(host, port): + return {'driver': 'nbd', + 'server': {'type': 'inet', 'host': host, 'port': port}} + + +if __name__ == '__main__': + import sys + + if len(sys.argv) < 4: + print('USAGE: {} ' + ' ' + ''.format(sys.argv[0])) + exit(1) + + res = bench_block_job(sys.argv[1], json.loads(sys.argv[2]), sys.argv[3:]) + if 'seconds' in res: + print('{:.2f}'.format(res['seconds'])) + else: + print(res) From patchwork Wed Mar 18 01:12:16 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Eduardo Habkost X-Patchwork-Id: 11444385 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 026D2159A for ; Wed, 18 Mar 2020 01:15:04 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id CB53320663 for ; Wed, 18 Mar 2020 01:15:03 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="EsIRW3u/" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org CB53320663 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=redhat.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Received: from localhost ([::1]:43892 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jENIU-0002UR-V3 for patchwork-qemu-devel@patchwork.kernel.org; Tue, 17 Mar 2020 21:15:03 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:57452) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jENG8-0007VN-75 for qemu-devel@nongnu.org; Tue, 17 Mar 2020 21:12:37 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1jENG6-0004kl-Mi for qemu-devel@nongnu.org; Tue, 17 Mar 2020 21:12:36 -0400 Received: from us-smtp-delivery-74.mimecast.com ([216.205.24.74]:38725) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1jENG6-0004kV-Hh for qemu-devel@nongnu.org; Tue, 17 Mar 2020 21:12:34 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1584493954; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=MKK+41mV43lMygsikZOzhnUdZoMCAJVD3k2MPho1DeM=; b=EsIRW3u/Xl9zF6bl2l898biIlv4VwCKlpJf1ryplQ8untfl+QCye0KW+cUxCqze1+RdD6N WaiwGs/IKnyx4FfFXX61MgaLBwvCUvZyKcoKeu1JFKG7W/yUe5pzTdrEh1EiuY1OP6dcA0 E7IWRlSXHs5Ymplbkhr6ngbYAvfao0Q= Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-289-oh1GbW7zMqOnbCY0H_tyYQ-1; Tue, 17 Mar 2020 21:12:27 -0400 X-MC-Unique: oh1GbW7zMqOnbCY0H_tyYQ-1 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 0EF5C13E2; Wed, 18 Mar 2020 01:12:26 +0000 (UTC) Received: from localhost (ovpn-118-148.rdu2.redhat.com [10.10.118.148]) by smtp.corp.redhat.com (Postfix) with ESMTP id 8C80A7E331; Wed, 18 Mar 2020 01:12:25 +0000 (UTC) From: Eduardo Habkost To: qemu-devel@nongnu.org, Cleber Rosa , Peter Maydell Subject: [PULL 3/4] scripts/simplebench: add example usage of simplebench Date: Tue, 17 Mar 2020 21:12:16 -0400 Message-Id: <20200318011217.2102748-4-ehabkost@redhat.com> In-Reply-To: <20200318011217.2102748-1-ehabkost@redhat.com> References: <20200318011217.2102748-1-ehabkost@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 216.205.24.74 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Vladimir Sementsov-Ogievskiy , Aleksandar Markovic Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" From: Vladimir Sementsov-Ogievskiy This example may be used as a template for custom benchmark. It illustrates three things to prepare: - define bench_func - define test environments (columns) - define test cases (rows) And final call of simplebench API. Signed-off-by: Vladimir Sementsov-Ogievskiy Reviewed-by: Aleksandar Markovic Message-Id: <20200228071914.11746-4-vsementsov@virtuozzo.com> Signed-off-by: Eduardo Habkost --- scripts/simplebench/bench-example.py | 80 ++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 scripts/simplebench/bench-example.py diff --git a/scripts/simplebench/bench-example.py b/scripts/simplebench/bench-example.py new file mode 100644 index 0000000000..c642a5b891 --- /dev/null +++ b/scripts/simplebench/bench-example.py @@ -0,0 +1,80 @@ +#!/usr/bin/env python3 +# +# Benchmark example +# +# Copyright (c) 2019 Virtuozzo International GmbH. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# + +import simplebench +from bench_block_job import bench_block_copy, drv_file, drv_nbd + + +def bench_func(env, case): + """ Handle one "cell" of benchmarking table. """ + return bench_block_copy(env['qemu_binary'], env['cmd'], + case['source'], case['target']) + + +# You may set the following five variables to correct values, to turn this +# example to real benchmark. +ssd_source = '/path-to-raw-source-image-at-ssd' +ssd_target = '/path-to-raw-target-image-at-ssd' +hdd_target = '/path-to-raw-source-image-at-hdd' +nbd_ip = 'nbd-ip-addr' +nbd_port = 'nbd-port-number' + +# Test-cases are "rows" in benchmark resulting table, 'id' is a caption for +# the row, other fields are handled by bench_func. +test_cases = [ + { + 'id': 'ssd -> ssd', + 'source': drv_file(ssd_source), + 'target': drv_file(ssd_target) + }, + { + 'id': 'ssd -> hdd', + 'source': drv_file(ssd_source), + 'target': drv_file(hdd_target) + }, + { + 'id': 'ssd -> nbd', + 'source': drv_file(ssd_source), + 'target': drv_nbd(nbd_ip, nbd_port) + }, +] + +# Test-envs are "columns" in benchmark resulting table, 'id is a caption for +# the column, other fields are handled by bench_func. +test_envs = [ + { + 'id': 'backup-1', + 'cmd': 'blockdev-backup', + 'qemu_binary': '/path-to-qemu-binary-1' + }, + { + 'id': 'backup-2', + 'cmd': 'blockdev-backup', + 'qemu_binary': '/path-to-qemu-binary-2' + }, + { + 'id': 'mirror', + 'cmd': 'blockdev-mirror', + 'qemu_binary': '/path-to-qemu-binary-1' + } +] + +result = simplebench.bench(bench_func, test_envs, test_cases, count=3) +print(simplebench.ascii(result)) From patchwork Wed Mar 18 01:12:17 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Eduardo Habkost X-Patchwork-Id: 11444383 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 370F9159A for ; Wed, 18 Mar 2020 01:15:00 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 0C2E520663 for ; Wed, 18 Mar 2020 01:15:00 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="FNa5LXeU" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 0C2E520663 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=redhat.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Received: from localhost ([::1]:43886 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jENIR-0002P1-7l for patchwork-qemu-devel@patchwork.kernel.org; Tue, 17 Mar 2020 21:14:59 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:57423) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jENG6-0007TW-Ud for qemu-devel@nongnu.org; Tue, 17 Mar 2020 21:12:35 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1jENG6-0004in-0G for qemu-devel@nongnu.org; Tue, 17 Mar 2020 21:12:34 -0400 Received: from us-smtp-delivery-74.mimecast.com ([216.205.24.74]:33173) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1jENG5-0004hP-Sd for qemu-devel@nongnu.org; Tue, 17 Mar 2020 21:12:33 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1584493951; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=NvsIcJn+vDR+XVp29U5PoUNWI6fz3PjojaW3lFBTsCU=; b=FNa5LXeUgaRREFt8s1sEdwTjCNrMNDkRxjpB042F2xfjPv/mLWgnKhOtHE63yZqw2IfdA1 obRMoqn9weO9uvv/sysR51/jNhcnMzLpf3hJ3+IXXMntsRJFjOamXO/cJz1bQdZrn5wPcs WzoX9e6+Ux0yEgXLGRUA5uGcBFoUByk= Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-467-Wglkl5ALPTWuiDcEsnk0Vg-1; Tue, 17 Mar 2020 21:12:29 -0400 X-MC-Unique: Wglkl5ALPTWuiDcEsnk0Vg-1 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 336AC8017CC; Wed, 18 Mar 2020 01:12:28 +0000 (UTC) Received: from localhost (ovpn-118-148.rdu2.redhat.com [10.10.118.148]) by smtp.corp.redhat.com (Postfix) with ESMTP id 95D945C1BB; Wed, 18 Mar 2020 01:12:27 +0000 (UTC) From: Eduardo Habkost To: qemu-devel@nongnu.org, Cleber Rosa , Peter Maydell Subject: [PULL 4/4] MAINTAINERS: add simplebench Date: Tue, 17 Mar 2020 21:12:17 -0400 Message-Id: <20200318011217.2102748-5-ehabkost@redhat.com> In-Reply-To: <20200318011217.2102748-1-ehabkost@redhat.com> References: <20200318011217.2102748-1-ehabkost@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 216.205.24.74 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Vladimir Sementsov-Ogievskiy , Aleksandar Markovic Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" From: Vladimir Sementsov-Ogievskiy Signed-off-by: Vladimir Sementsov-Ogievskiy Reviewed-by: Aleksandar Markovic Message-Id: <20200228071914.11746-5-vsementsov@virtuozzo.com> Signed-off-by: Eduardo Habkost --- MAINTAINERS | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/MAINTAINERS b/MAINTAINERS index 7364af0d8b..9b462ef009 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -2142,6 +2142,11 @@ F: python/qemu/*py F: scripts/*.py F: tests/*.py +Benchmark util +M: Vladimir Sementsov-Ogievskiy +S: Maintained +F: scripts/simplebench/ + QAPI M: Markus Armbruster M: Michael Roth From patchwork Wed Mar 18 17:02:26 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Vladimir Sementsov-Ogievskiy X-Patchwork-Id: 11445735 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 4257613B1 for ; Wed, 18 Mar 2020 17:04:36 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id AA1EF2071C for ; Wed, 18 Mar 2020 17:04:35 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=virtuozzo.com header.i=@virtuozzo.com header.b="lxWwDozD" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org AA1EF2071C Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=virtuozzo.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Received: from localhost ([::1]:56022 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jEc7O-0008Ns-Sv for patchwork-qemu-devel@patchwork.kernel.org; Wed, 18 Mar 2020 13:04:34 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:54787) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jEc5h-0006Rn-OI for qemu-devel@nongnu.org; Wed, 18 Mar 2020 13:02:51 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1jEc5f-0000pc-Kx for qemu-devel@nongnu.org; Wed, 18 Mar 2020 13:02:48 -0400 Received: from mail-am5eur02on0713.outbound.protection.outlook.com ([2a01:111:f400:fe07::713]:5947 helo=EUR02-AM5-obe.outbound.protection.outlook.com) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1jEc5f-0000ip-2e for qemu-devel@nongnu.org; Wed, 18 Mar 2020 13:02:47 -0400 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=P0nag3UT/d1Ds+16IIG799ahjRLWK+B9YuwlaUfWgdENkaMkUCchpgfiWipqUh0TquPMB3mAOXDF9ITrfZ/DvAZdynU2UnkpyZUcMYcDHLJIVITuQgrPVaxP+hHy2yO9dHIcqYQBR041HDX9gr6TNPsNnV8Ccf/gBuonU5hKUWX5+Ytn9hUdDkCYQjY+k4sX3fzmAhfJaHEkRW7p6p9+yTIZDOK8Tw1J02sbzO7mrKfKLy93bZQLHzH3DO/HlMcORiPb0BXarWeNnaE5kqMDCksVEDghzFFzquHaKraRR0N5bDuZlZsnAbOw27FcSICU+MIjmjECMDdpMJaKQE80Og== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=vg5ar+ehNaWrbJ84xx+aPsd8VPvc588j5QUYY5bOdO0=; b=FZrWSDFfTcBjeCPF8fTT3tHlMR1ezzb3rGhFyoKwd+iiq4S7KhHTGtuLx+Gbc7cEIuvVRakOAua+vm/qw0r09O0cKBsgUHRScQYLDE2B8kqwYON1Ga2Ok9+Z2ofCzHuMIGmfhlx4FCkHaVGVAayQOrcPc/xlOBxkX3q8Df053CJjPxUA/kTdO8B8HeaZqva0KnQ7nIY6exfNTEIQat2XMIOcprA3iZGUMWt7fO6c0n73Xd/voJJjjQHkN+QNBROKYiOnnjtDy8YPvsj7KUJQ8su4WLXXqR2PHwcysE77nb238U8U3fV2n8ou5VKA+9v+mSLW2JwnPT8PLfcxHod5bw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=virtuozzo.com; dmarc=pass action=none header.from=virtuozzo.com; dkim=pass header.d=virtuozzo.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=virtuozzo.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=vg5ar+ehNaWrbJ84xx+aPsd8VPvc588j5QUYY5bOdO0=; b=lxWwDozDWY2pGjdMyy67NMfBV/K7E12lr1PWYM69QrjzAe6xzM8DvpfWTPmfzZ/85/kG1vrtmNYeMyM3vqdzgnAScgF0KC0nM4e7a8tQQD6eCezanD10fZZ10au9f7NTL2vvN+LHWRo3EG4raBx4zXV4H0yUgv8YlT1Tr+IU0G0= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=vsementsov@virtuozzo.com; Received: from HE1PR0802MB2507.eurprd08.prod.outlook.com (10.175.35.136) by HE1PR0802MB2313.eurprd08.prod.outlook.com (10.172.127.146) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.2835.18; Wed, 18 Mar 2020 17:02:43 +0000 Received: from HE1PR0802MB2507.eurprd08.prod.outlook.com ([fe80::4d32:e4e1:5b9f:240f]) by HE1PR0802MB2507.eurprd08.prod.outlook.com ([fe80::4d32:e4e1:5b9f:240f%12]) with mapi id 15.20.2835.017; Wed, 18 Mar 2020 17:02:43 +0000 From: Vladimir Sementsov-Ogievskiy To: qemu-devel@nongnu.org Subject: [PATCH 5/4] scripts/simplebench: fix python script ! headers Date: Wed, 18 Mar 2020 20:02:26 +0300 Message-ID: <20200318170226.12186-1-vsementsov@virtuozzo.com> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20200318011217.2102748-1-ehabkost@redhat.com> References: <20200318011217.2102748-1-ehabkost@redhat.com> X-ClientProxiedBy: HE1PR0901CA0045.eurprd09.prod.outlook.com (2603:10a6:3:45::13) To HE1PR0802MB2507.eurprd08.prod.outlook.com (2603:10a6:3:e1::8) MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 Received: from kvm.sw.ru (185.215.60.249) by HE1PR0901CA0045.eurprd09.prod.outlook.com (2603:10a6:3:45::13) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.2835.15 via Frontend Transport; Wed, 18 Mar 2020 17:02:42 +0000 X-Mailer: git-send-email 2.21.0 X-Originating-IP: [185.215.60.249] X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 4e820e28-77f2-44b9-db90-08d7cb5e2ca4 X-MS-TrafficTypeDiagnostic: HE1PR0802MB2313: X-MS-Exchange-Transport-Forked: True X-Microsoft-Antispam-PRVS: X-MS-Oob-TLC-OOBClassifiers: OLM:3631; X-Forefront-PRVS: 03468CBA43 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10019020)(4636009)(366004)(199004)(81156014)(81166006)(8676002)(4326008)(5660300002)(8936002)(6486002)(86362001)(36756003)(52116002)(498600001)(2616005)(4744005)(66946007)(2906002)(1076003)(6916009)(956004)(6512007)(26005)(6666004)(6506007)(66476007)(66556008)(186003)(16526019); DIR:OUT; SFP:1102; SCL:1; SRVR:HE1PR0802MB2313; H:HE1PR0802MB2507.eurprd08.prod.outlook.com; FPR:; SPF:None; LANG:en; PTR:InfoNoRecords; A:1; Received-SPF: None (protection.outlook.com: virtuozzo.com does not designate permitted sender hosts) X-MS-Exchange-SenderADCheck: 1 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: u3nAQnhRKf7FSwQxA9lrCQ+9lC7E1gFfn+hf+JgWJiRYWgEfx9qnwPJzKzIs/eCN0PIhlouD902Ns2UNTW1fTD3plOG6qp5h/nXjGv4foT/NFilQzbnrmBtz5X+/ylT+o+Gq6pAZG6J/156Tg0S0TqFaVbL9LQ2ipWLuOyh0IOs4v7e89EilA1JvLmn0zeKq8Vxpf43n9Fv0SkarG/IfJXhKMwR0i334WWWS+QDawjh6fEf90h3uG9zssbHP11E+z6cLBeeDN6wZpq+1VwDUKeVR8UMK8Q36Gq9XHP288GieykJegQu/OGlGWR4WspSWFfQrgHt5GK+SYb6neGE6tRRb0/Ls9r6N0618SLAx6+dFFidyQv4ip8X1ec7POn9aIxXYOyCqlB1/C6kdgMfjtybyOPKs0kLneZTLPqDLLkztTVn523asUz9pjyvteQaj X-MS-Exchange-AntiSpam-MessageData: fvr0CLjl4iltkFFnGv2H6tIF4kfHogx0A7+CDa/jZR8Rly99v7mDF8i9WVbhFxwgCxh0EmB4TKL2eNzI+hBRSiSOHTs+YbDy7tkW/JzuZZeM4cauo/Ly0U11+NzxFkFNvgIrRUFYlzNI9NJGOFIsDQ== X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-Network-Message-Id: 4e820e28-77f2-44b9-db90-08d7cb5e2ca4 X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Mar 2020 17:02:43.6178 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 0bc7f26d-0264-416e-a6fc-8352af79c58f X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: kpoUMtlMNTaPAGFn9xrBTmdcConOkkDBVp5EQnaE4hPO/vut7oE1v2R2gGUbIheufNbFf0w8myFg3gKyS8yceR7pdscOcFjbhNwxN23jxuM= X-MS-Exchange-Transport-CrossTenantHeadersStamped: HE1PR0802MB2313 X-detected-operating-system: by eggs.gnu.org: Windows 7 or 8 [fuzzy] X-Received-From: 2a01:111:f400:fe07::713 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: peter.maydell@linaro.org, aleksandar.qemu.devel@gmail.com, vsementsov@virtuozzo.com, ehabkost@redhat.com, crosa@redhat.com Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" - simplebench.py is not for executing by itself, so drop the header - in bench_block_job.py fix python to python3 Signed-off-by: Vladimir Sementsov-Ogievskiy Reviewed-by: Philippe Mathieu-Daudé --- scripts/simplebench/bench_block_job.py | 2 +- scripts/simplebench/simplebench.py | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/scripts/simplebench/bench_block_job.py b/scripts/simplebench/bench_block_job.py index 9808d696cf..a0dda1dc4e 100755 --- a/scripts/simplebench/bench_block_job.py +++ b/scripts/simplebench/bench_block_job.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 # # Benchmark block jobs # diff --git a/scripts/simplebench/simplebench.py b/scripts/simplebench/simplebench.py index 59e7314ff6..7e25f3590b 100644 --- a/scripts/simplebench/simplebench.py +++ b/scripts/simplebench/simplebench.py @@ -1,5 +1,3 @@ -#!/usr/bin/env python -# # Simple benchmarking framework # # Copyright (c) 2019 Virtuozzo International GmbH.