From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id B254EA034F; Mon, 11 Oct 2021 10:57:23 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id B16A14111F; Mon, 11 Oct 2021 10:57:09 +0200 (CEST) Received: from AZHDRRW-EX02.NVIDIA.COM (azhdrrw-ex02.nvidia.com [20.64.145.131]) by mails.dpdk.org (Postfix) with ESMTP id 95D2E410F8 for ; Mon, 11 Oct 2021 10:57:07 +0200 (CEST) Received: from NAM12-MW2-obe.outbound.protection.outlook.com (104.47.66.43) by mxs.oss.nvidia.com (10.13.234.37) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.858.15; Mon, 11 Oct 2021 01:57:06 -0700 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=jZmDvm5Kk/4dZ8m2iqmb/xZUQxSj32Qv4Zc5zkYHz4+Qe5N7DADIIXZ+o/6sTFIQyZeQ+/8LoGSNaZcXnC/WU/Gh+YBypeHqHTJvk/X/W6ZM85eBCvykDKbggbbMbkc0QU3KBy4aGt0iRezqcha01djhnlwDWhq+G6WWxHnZv7rcmrT5ZiPzSKNiSh/xIRkAG7kJIDnj1dyZ3Mvy/n//bYDGbx7S6BIgBMR2B1Y9Kh8DMOECkaxqKcZkmZthj0AMxBsd14NnlELtXEoI0GKOYpvx5es3NCh2dmtePTVoTEl+bWakajNLymAlivJU4eWmUlQy3/CglmFciFUCxTBtaw== 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-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=8fx7Pa362+pk8b/rV8NSxLpfVuTx2X7s1n0kddImHbM=; b=O17fEZsio5q17P0epoPVjCDXXrOXqFQCQp2LVE1IbQRIkrXy5Or6ucTRgu7zLhD6ljiDBHu8b4D2M8WTI6DLEoelm5gyDIKaPNlO6iEPyCQvKDY2OCqdLMQBJBrHrIxNfrWxuJApLm59LoVxTcTBFttEyUYlysCGs/RC6TD5cpk3TCo2n06cEDd53EHd0Xscme5NY1HhGkEHDiaVLvuDBxf0gW97Z7EpxO2zUeJiOdHifqGrbbaIp9qYj8S8pZr82WYMqwBAm1EOEwJoyYYv+YTXC9GUtEwrk3skTst0ahLViOaoYUyHrJtuj0wpdzJMUqZFGEUAHEBJZOgzQ12i+A== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 216.228.112.34) smtp.rcpttodomain=dpdk.org smtp.mailfrom=nvidia.com; dmarc=pass (p=quarantine sp=none pct=100) action=none header.from=nvidia.com; dkim=none (message not signed); arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=8fx7Pa362+pk8b/rV8NSxLpfVuTx2X7s1n0kddImHbM=; b=AVNU5XtDXyq/sJxNnatoQJS4uV705bxNsPsCdmPr9c81LedkiR+8kdPkvDli5ygdsC9EbCxz6rEge8MKnW6W7uZqAA/Z74ClOdO4TpPIQZJMG7TBk4HS0VzhAqkYqXrA1eOaLwFkPzk8NpqohL6yXdElMAeEjQ2/xoaoCSMqdg4MLhUNUmr3V97PcHqs0YTzXscNZLMcheTiS3k7qfttEOFPPpmc4NLffJWH5DZbmvttxEnzd/Viez2WDXHxa9rYSSnIp097yHI3Gwe5VhsQiCjGtX5Vv3tuCva6pOT0Xf3jTWnA+t8h21xqVTxXEZtazsqlP04DktLII7Plc1J0bQ== Received: from BN8PR04CA0028.namprd04.prod.outlook.com (2603:10b6:408:70::41) by BY5PR12MB5014.namprd12.prod.outlook.com (2603:10b6:a03:1c4::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4587.18; Mon, 11 Oct 2021 08:57:05 +0000 Received: from BN8NAM11FT067.eop-nam11.prod.protection.outlook.com (2603:10b6:408:70:cafe::88) by BN8PR04CA0028.outlook.office365.com (2603:10b6:408:70::41) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4587.18 via Frontend Transport; Mon, 11 Oct 2021 08:57:05 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 216.228.112.34) smtp.mailfrom=nvidia.com; dpdk.org; dkim=none (message not signed) header.d=none;dpdk.org; dmarc=pass action=none header.from=nvidia.com; Received-SPF: Pass (protection.outlook.com: domain of nvidia.com designates 216.228.112.34 as permitted sender) receiver=protection.outlook.com; client-ip=216.228.112.34; helo=mail.nvidia.com; Received: from mail.nvidia.com (216.228.112.34) by BN8NAM11FT067.mail.protection.outlook.com (10.13.177.159) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384) id 15.20.4587.18 via Frontend Transport; Mon, 11 Oct 2021 08:57:04 +0000 Received: from nvidia.com (172.20.187.6) by HQMAIL107.nvidia.com (172.20.187.13) with Microsoft SMTP Server (TLS) id 15.0.1497.18; Mon, 11 Oct 2021 08:57:03 +0000 From: Dmitry Kozlyuk To: CC: Viacheslav Ovsiienko Date: Mon, 11 Oct 2021 11:56:44 +0300 Message-ID: <20211011085644.2716490-4-dkozlyuk@nvidia.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20211011085644.2716490-1-dkozlyuk@nvidia.com> References: <20210921081632.858873-1-dkozlyuk@nvidia.com> <20211011085644.2716490-1-dkozlyuk@nvidia.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain X-Originating-IP: [172.20.187.6] X-ClientProxiedBy: HQMAIL105.nvidia.com (172.20.187.12) To HQMAIL107.nvidia.com (172.20.187.13) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 33f0c884-7d70-420a-191a-08d98c951918 X-MS-TrafficTypeDiagnostic: BY5PR12MB5014: X-Microsoft-Antispam-PRVS: X-MS-Oob-TLC-OOBClassifiers: OLM:1923; X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: sS2I71lXeNMf0UcsPw9+OQJktWDa+Dlh3TEXVSvfmm9ztvHXW+KoMds4AyF1lXs44CEKDRHTuDto2xhpR/JP5u3BIEVmyx7nB5Bv2n1JKCuppqycYXbCSQoLvVFa/l/w0t/W0pvP9dJ0ov7kGFoWtU0lpijpQqmSxTKV/J1lc/GeUS8N7NXVS2N8HnER68UrTwoDU/wgk53JkypSX0u06qOcEyCKaJwLcWEl48LPrGCQZaT481v6Ak98yfnLd0tJWFn2aO9CzJ1xR2IgH9Mlxt3SJa+pDYjWCjd6oVvholAPAMRRlRW0I5dFB99yFaeyNTwQOEUJZO7hQ89bGpDHI+FiJbw3LSrjYyv8WgbFSDBRw0zjGhWzxmZhsnfWoCkqyIluiZhBKylkfWn2WW4KhQDZxVBkqgbPmKL6lPsuMcY93mEuARD4rOeqKhZDOhIzOxOc8QZX18y+1vEZJXP/rKiXASyNzSdXBdNgLJHTyrCDjrO2zRcteCF47UoMnwxWCg0oHa96RE4M/k6L1TvIoA7Kb6v/cPHmGZgGfN65V9Py88LJnP6gW6e5bjrJ93toa24eg2MoEqZH64370i3dj9ZSYZjTvx9tKcYfPiORzlvfHd2J/NGo40T27RJZMVCmpGfM9FQDU/57z3Cikv48a6yzLOVBf1ix36MHTX9RWnqV0/bnIKqdzuUsBdO+aSdb X-Forefront-Antispam-Report: CIP:216.228.112.34; CTRY:US; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:mail.nvidia.com; PTR:schybrid03.nvidia.com; CAT:NONE; SFS:(4636009)(36840700001)(46966006)(5660300002)(186003)(16526019)(47076005)(86362001)(4326008)(26005)(8936002)(36756003)(336012)(8676002)(36860700001)(426003)(107886003)(6286002)(6666004)(7636003)(316002)(70586007)(508600001)(82310400003)(2906002)(6916009)(1076003)(70206006)(7696005)(2616005)(55016002)(356005); DIR:OUT; SFP:1101; X-MS-Exchange-CrossTenant-OriginalArrivalTime: 11 Oct 2021 08:57:04.6912 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 33f0c884-7d70-420a-191a-08d98c951918 X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=43083d15-7273-40c1-b7db-39efd9ccc17a; Ip=[216.228.112.34]; Helo=[mail.nvidia.com] X-MS-Exchange-CrossTenant-AuthSource: BN8NAM11FT067.eop-nam11.prod.protection.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: BY5PR12MB5014 Subject: [dpdk-dev] [PATCH v6 3/3] app/test: add allocator performance autotest X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" Memory allocator performance is crucial to applications that deal with large amount of memory or allocate frequently. DPDK allocator performance is affected by EAL options, API used and, at least, allocation size. New autotest is intended to be run with different EAL options. It measures performance with a range of sizes for dirrerent APIs: rte_malloc, rte_zmalloc, and rte_memzone_reserve. Work distribution between allocation and deallocation depends on EAL options. The test prints both times and total time to ease comparison. Memory can be filled with zeroes at different points of allocation path, but it always takes considerable fraction of overall timing. This is why the test measures filling speed and prints how long clearing would take for each size as a hint. Signed-off-by: Dmitry Kozlyuk Reviewed-by: Viacheslav Ovsiienko --- app/test/meson.build | 2 + app/test/test_malloc_perf.c | 161 ++++++++++++++++++++++++++++++++++++ 2 files changed, 163 insertions(+) create mode 100644 app/test/test_malloc_perf.c diff --git a/app/test/meson.build b/app/test/meson.build index f144d8b8ed..47d1d60ded 100644 --- a/app/test/meson.build +++ b/app/test/meson.build @@ -85,6 +85,7 @@ test_sources = files( 'test_lpm6_perf.c', 'test_lpm_perf.c', 'test_malloc.c', + 'test_malloc_perf.c', 'test_mbuf.c', 'test_member.c', 'test_member_perf.c', @@ -282,6 +283,7 @@ fast_tests = [ perf_test_names = [ 'ring_perf_autotest', + 'malloc_perf_autotest', 'mempool_perf_autotest', 'memcpy_perf_autotest', 'hash_perf_autotest', diff --git a/app/test/test_malloc_perf.c b/app/test/test_malloc_perf.c new file mode 100644 index 0000000000..fa7357f540 --- /dev/null +++ b/app/test/test_malloc_perf.c @@ -0,0 +1,161 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright (c) 2021 NVIDIA Corporation & Affiliates + */ + +#include +#include +#include +#include +#include +#include + +#include "test.h" + +typedef void * (alloc_t)(const char *name, size_t size, unsigned int align); +typedef void (free_t)(void *addr); + +static const uint64_t KB = 1 << 10; +static const uint64_t GB = 1 << 30; + +static double +tsc_to_us(uint64_t tsc, size_t runs) +{ + return (double)tsc / rte_get_tsc_hz() * US_PER_S / runs; +} + +static int +test_memset_perf(double *us_per_gb) +{ + static const size_t RUNS = 20; + + void *ptr; + size_t i; + uint64_t tsc; + + puts("Performance: memset"); + + ptr = rte_malloc(NULL, GB, 0); + if (ptr == NULL) { + printf("rte_malloc(size=%"PRIx64") failed\n", GB); + return -1; + } + + tsc = rte_rdtsc_precise(); + for (i = 0; i < RUNS; i++) + memset(ptr, 0, GB); + tsc = rte_rdtsc_precise() - tsc; + + *us_per_gb = tsc_to_us(tsc, RUNS); + printf("Result: %f.3 GiB/s <=> %.2f us/MiB\n", + US_PER_S / *us_per_gb, *us_per_gb / KB); + + rte_free(ptr); + putchar('\n'); + return 0; +} + +static int +test_alloc_perf(const char *name, alloc_t *alloc_fn, free_t free_fn, + size_t max_runs, double memset_gb_us) +{ + static const size_t SIZES[] = { + 1 << 6, 1 << 7, 1 << 10, 1 << 12, 1 << 16, 1 << 20, + 1 << 21, 1 << 22, 1 << 24, 1 << 30 }; + + size_t i, j; + void **ptrs; + + printf("Performance: %s\n", name); + + ptrs = calloc(max_runs, sizeof(ptrs[0])); + if (ptrs == NULL) { + puts("Cannot allocate memory for pointers"); + return -1; + } + + printf("%12s%8s%12s%12s%12s%12s\n", + "Size (B)", "Runs", "Alloc (us)", "Free (us)", + "Total (us)", "memset (us)"); + for (i = 0; i < RTE_DIM(SIZES); i++) { + size_t size = SIZES[i]; + size_t runs_done; + uint64_t tsc_start, tsc_alloc, tsc_free; + double alloc_time, free_time, memset_time; + + tsc_start = rte_rdtsc_precise(); + for (j = 0; j < max_runs; j++) { + ptrs[j] = alloc_fn(NULL, size, 0); + if (ptrs[j] == NULL) + break; + } + tsc_alloc = rte_rdtsc_precise() - tsc_start; + + if (j == 0) { + printf("%12zu Interrupted: out of memory.\n", size); + break; + } + runs_done = j; + + tsc_start = rte_rdtsc_precise(); + for (j = 0; j < runs_done && ptrs[j] != NULL; j++) + free_fn(ptrs[j]); + tsc_free = rte_rdtsc_precise() - tsc_start; + + alloc_time = tsc_to_us(tsc_alloc, runs_done); + free_time = tsc_to_us(tsc_free, runs_done); + memset_time = memset_gb_us * size / GB; + printf("%12zu%8zu%12.2f%12.2f%12.2f%12.2f\n", + size, runs_done, alloc_time, free_time, + alloc_time + free_time, memset_time); + + memset(ptrs, 0, max_runs * sizeof(ptrs[0])); + } + + free(ptrs); + putchar('\n'); + return 0; +} + +static void * +memzone_alloc(const char *name __rte_unused, size_t size, unsigned int align) +{ + const struct rte_memzone *mz; + char gen_name[RTE_MEMZONE_NAMESIZE]; + + snprintf(gen_name, sizeof(gen_name), "test-mz-%"PRIx64, rte_rdtsc()); + mz = rte_memzone_reserve_aligned(gen_name, size, SOCKET_ID_ANY, + RTE_MEMZONE_1GB | RTE_MEMZONE_SIZE_HINT_ONLY, align); + return (void *)(uintptr_t)mz; +} + +static void +memzone_free(void *addr) +{ + rte_memzone_free((struct rte_memzone *)addr); +} + +static int +test_malloc_perf(void) +{ + static const size_t MAX_RUNS = 10000; + + double memset_gb_us; + + if (test_memset_perf(&memset_gb_us) < 0) + return -1; + + if (test_alloc_perf("rte_malloc", rte_malloc, rte_free, + MAX_RUNS, memset_gb_us) < 0) + return -1; + if (test_alloc_perf("rte_zmalloc", rte_zmalloc, rte_free, + MAX_RUNS, memset_gb_us) < 0) + return -1; + + if (test_alloc_perf("rte_memzone_reserve", memzone_alloc, memzone_free, + RTE_MAX_MEMZONE - 1, memset_gb_us) < 0) + return -1; + + return 0; +} + +REGISTER_TEST_COMMAND(malloc_perf_autotest, test_malloc_perf); -- 2.25.1