Received: by 2002:a05:7412:3b8b:b0:fc:a2b0:25d7 with SMTP id nd11csp184597rdb; Thu, 8 Feb 2024 03:02:20 -0800 (PST) X-Forwarded-Encrypted: i=3; AJvYcCXlAjs7SmjEj6upHZYMHQ0mv57YdSpknX6IlPpRBCPMw2rKU11awx0stP3nhAuiEqK8FIff5QK6/oL63Po9R0vzfhNem1fMKqD2vViwGA== X-Google-Smtp-Source: AGHT+IELKvD0JjheJRu9klOnR9JSgc17hIKvpugEzgWILWMb0c8/5Xi2pK8lhQ6zorBWGObQB+ZP X-Received: by 2002:a17:903:487:b0:1d9:8249:6651 with SMTP id jj7-20020a170903048700b001d982496651mr6428306plb.44.1707390140366; Thu, 08 Feb 2024 03:02:20 -0800 (PST) ARC-Seal: i=2; a=rsa-sha256; t=1707390140; cv=pass; d=google.com; s=arc-20160816; b=kdYQstUVqgemn+L83lmJ5MPo4beHVkj61cpPwEsC0Mg2IJnaN2QxERK3Cccw7TvrQQ N13U1WdR+bmyE1eLpAjlKWdKR03GFora5uVzIaARJvHGn8R0v4dVA+g1bjHN77DRKaju pSYssnlCG6zd6BkT65z7MIv3Jp8imceyXMfAHqiCmHXrFaMK3RW6fufo61MZpi3CtRev +RUnjwHEnVfzFMM8UgpbyHXRBhHmkXOFYwYRuuT6aO0PwwNuyiRrI/QP3PlNfGrYflFr u9RoTieFGZ7/JYu5E9ZTBuq2lq+wC6oWI4M9336tfOVRmiSmx1EXI7wAkdE5YjoAedhK RGkA== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=user-agent:in-reply-to:content-disposition:mime-version :list-unsubscribe:list-subscribe:list-id:precedence:references :message-id:subject:cc:to:from:date:dkim-signature; bh=S/kb+gyU3Rtfx6Hm+9IXxrBKwcOt1NhZJ++2tQxBh8Y=; fh=6Yb8nv+Uvk2ffX9tw4G6Et4OxRW+ThUmSQuNCyP5WSI=; b=rDRJ1Z/3Oyy1aAYRHgg2eQXb8qJEb5PWgBua4Ki7iq8eJAfxIPgWddYrLVuc/CFGXG tNRwSA5++kSWAHlaM6V0Vm+slhnYIPlZQHXQgCC5i/wxuZOfOSSjO1etFYsnP/ZiOc43 9GcpFscMd3uDMXfFNGhPIh1O8Z03JRy0E/kNqsJZ10sAoJw29XqGDuFaRrKyEqDRKykI 7jrmQsvV9Ui59S4Gp0LqEl1ZEvca9tD09IFEEsYsd6qiAWpMarHLFupZI0wl8F+DSgmA HIwkSH8TcaOZ0+Ha5bUEteYoeqGO6ogAyn4IqN1RYoV3Bo725FEUTlifBs8FdIzIyPG2 dIEw==; dara=google.com ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@google.com header.s=20230601 header.b=Jh7w1I82; arc=pass (i=1 spf=pass spfdomain=google.com dkim=pass dkdomain=google.com dmarc=pass fromdomain=google.com); spf=pass (google.com: domain of linux-kernel+bounces-57925-linux.lists.archive=gmail.com@vger.kernel.org designates 139.178.88.99 as permitted sender) smtp.mailfrom="linux-kernel+bounces-57925-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com X-Forwarded-Encrypted: i=2; AJvYcCW2w+OdiKDbM9qvZzkMqKCmGzSx0tmKXgDrkETrE9suj1PyZQ6Rce4eusapdNLAKYVDuF8YHTSsOqEssYFaw+LTHjcweSylLpjqKOrMOA== Return-Path: Received: from sv.mirrors.kernel.org (sv.mirrors.kernel.org. [139.178.88.99]) by mx.google.com with ESMTPS id j5-20020a170902da8500b001d6f3a8accfsi4115788plx.112.2024.02.08.03.02.20 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 08 Feb 2024 03:02:20 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel+bounces-57925-linux.lists.archive=gmail.com@vger.kernel.org designates 139.178.88.99 as permitted sender) client-ip=139.178.88.99; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20230601 header.b=Jh7w1I82; arc=pass (i=1 spf=pass spfdomain=google.com dkim=pass dkdomain=google.com dmarc=pass fromdomain=google.com); spf=pass (google.com: domain of linux-kernel+bounces-57925-linux.lists.archive=gmail.com@vger.kernel.org designates 139.178.88.99 as permitted sender) smtp.mailfrom="linux-kernel+bounces-57925-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by sv.mirrors.kernel.org (Postfix) with ESMTPS id 03150280C10 for ; Thu, 8 Feb 2024 11:02:20 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 5AC1F6EB76; Thu, 8 Feb 2024 10:54:40 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="Jh7w1I82" Received: from mail-wr1-f46.google.com (mail-wr1-f46.google.com [209.85.221.46]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6EC8B763E1 for ; Thu, 8 Feb 2024 10:54:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.46 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1707389678; cv=none; b=H53QkLZ7yXPZ5vDvLRxY6jhmMLUxXbt5O5ZUzLJG9Q5LnvynUhfxPExRHy01+2HrlbkSkBXPuyHD8CoO+P4sJSdFAYf1Qpd/KIo4Ppo/2UjLYIt9bOkKs/H5Om+Wfkb5JMKjGir2kG4enfL9jY0NT8ABrgV0z71eKIkPAkPGn2s= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1707389678; c=relaxed/simple; bh=t4jjhQCQU5K2RcQenB+fy1X5o6Y7FBupo8tnX6DuXkk=; h=Date:From:To:Cc:Subject:Message-ID:References:MIME-Version: Content-Type:Content-Disposition:In-Reply-To; b=khF14qX3fXaQz5cnLczrZnqDReENFgU04pMOWyyXs44XYkRKX7xfV146FaS1UzqLfSuBdZQhSl/RKnC0j3G9Lts+/oPD8sl94Qt5xNmaHMo/kDwDCawwXU4MidSW8Cde1jPDE2V7WWAnXvcHHktgmD2aXCqqpkbNE55ca33N+tI= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=Jh7w1I82; arc=none smtp.client-ip=209.85.221.46 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=google.com Received: by mail-wr1-f46.google.com with SMTP id ffacd0b85a97d-33adec41b55so903028f8f.0 for ; Thu, 08 Feb 2024 02:54:35 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1707389674; x=1707994474; darn=vger.kernel.org; h=user-agent:in-reply-to:content-disposition:mime-version:references :message-id:subject:cc:to:from:date:from:to:cc:subject:date :message-id:reply-to; bh=S/kb+gyU3Rtfx6Hm+9IXxrBKwcOt1NhZJ++2tQxBh8Y=; b=Jh7w1I82iPCbA9wvE0wqHlimKp5H6YkSqa/l7xHuvSDUxsqsFR7AsGBeAyqW3qPo2B XzIk118w0bK25v1u/uuaKfZExtsKH2Y3r0Pjvmss4b41loMxqX04Tsffszy+ATXaaDYF W3oYdDmLnLb9inMSlBlnQBr210U+l88EJpUNpLOfVEjQMdIbWIBonweAHsEYqbGvyhQm 8ARNT4CRVDxG7UQNM0WMsPSevcWR6ZtRl9b3Bve0dWYrdMXZA4elIcvxmW3vFi2270C2 DksNz5lz9t6OuzAqBHRTmObdRNR4WrDgaRFy1iMoQFYYVA2Fdz5WFwCaSxQJ1YMWM7bY xkPA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1707389674; x=1707994474; h=user-agent:in-reply-to:content-disposition:mime-version:references :message-id:subject:cc:to:from:date:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=S/kb+gyU3Rtfx6Hm+9IXxrBKwcOt1NhZJ++2tQxBh8Y=; b=mIsiEZlzpjdUZMpVD3Xa7xndoMMdD7zIBQerRf/mgYqVbWcUqiqbozgvfJLkUiV1Fu gdmzrYwlWcRuP7ZamfEuIag62jnRHFvD867COEq0WDLpKjBrswEN8U/FlQ1CA6qJNsOY cgxPLfR8ZRqVwnCPe5ReX3Gfrk0AuP1cqZEmbK6ueZfHL4PaV3I2xOM479wPTmkMjbYI CjIZBU9qfV3Uwvp0g8Qmo4AFns/YRW6xCayuUZejTeuTeqU1yYbs54Mv3FXRv3DpHNUQ j/yYasX1FptruuPK4kfTr78XuqSPgNiBKzmoKPo8NcWLc4WHPF7Hfl3aR7Ws2UG0AyRv utDA== X-Forwarded-Encrypted: i=1; AJvYcCVtvXLkZG39PZmPqsoFOm163cLAXPr0K9Ib1hmc84LN+Fd8VRpJZYOHfsdd+B4cfEI8FfMs1PUS5VWSR4K41quu97za3CSXLLcvhpaT X-Gm-Message-State: AOJu0Ywu1ODL7SFxARYZMH+yca28wGDXmaZbreWGLM5eCAGbLn0ODUqm 4oC4jacNer1vJUZ3mRHfsRkIr7RvfUTk/N60imVPT2EHDa+ZiE3TI7WwudGoHQ== X-Received: by 2002:a05:6000:110b:b0:33b:4f08:ac9e with SMTP id z11-20020a056000110b00b0033b4f08ac9emr3510758wrw.34.1707389673485; Thu, 08 Feb 2024 02:54:33 -0800 (PST) X-Forwarded-Encrypted: i=1; AJvYcCWuwHeFPV3uIlxqCtv9KzsVgdLmeMJHm3Ze9vu5+QmqRFygR7ZCD03KV7KqDAq8m7x7sxwo3BHEvysqkMFRYouCWqwZkw3b0Gg2bv8zdGiVG6SQXi7lKback5OGEPJOG/+rPklOk7EHN4f25fAqLffIKhYm3R247FJxDfJSiE/VuLtuPwF4rjVkdvfLihUDod9wJ7Gfi1njCJx5dPfLtfSFdRB6BDCuYKF4HvSotYt87aOXLhwZ/3j3q91rpXl4/zkBrmYnzcNng2ro85Rl0CSK+PhD5y7B4z+Ev1LXD0pSIeOZLWTGuf4NBWfK0DiW2Luj0wWp4JXjraAhinaAJV8ffhCY93fgViwxZVM/rkhj6CX7XpLUxT4yuYbIEKdRZClvgHRk5t6lJbvxgWkwSxUmlPXnNPfij1JkWpjIGyoCECASIpQ8OhVs5FsQBQsvAi83NCZ0nGqbvqZPkYd7EhLRHkfG4NlnDPUOabhzZ1zLaOYMnzBxUV0jr2kMt0TckKH7eWf5da9Vp/eFNHY5Wpo= Received: from elver.google.com ([2a00:79e0:9c:201:d242:69f5:cb36:120]) by smtp.gmail.com with ESMTPSA id c13-20020a056000184d00b0033b07f428b6sm3382401wri.0.2024.02.08.02.54.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 08 Feb 2024 02:54:32 -0800 (PST) Date: Thu, 8 Feb 2024 11:54:27 +0100 From: Marco Elver To: Yonghong Song Cc: Alexei Starovoitov , Daniel Borkmann , Andrii Nakryiko , Martin KaFai Lau , Song Liu , John Fastabend , KP Singh , Stanislav Fomichev , Hao Luo , Jiri Olsa , Mykola Lysenko , Shuah Khan , Ilya Leoshkevich , Yafang Shao , Tejun Heo , bpf@vger.kernel.org, linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org Subject: Re: [PATCH bpf-next v2] bpf: Allow compiler to inline most of bpf_local_storage_lookup() Message-ID: References: <20240207122626.3508658-1-elver@google.com> <289242c3-052b-436d-8c7c-b0fa5ae45bce@linux.dev> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/2.2.12 (2023-09-09) On Thu, Feb 08, 2024 at 08:37AM +0100, Marco Elver wrote: > On Thu, 8 Feb 2024 at 00:58, Yonghong Song wrote: > > On 2/7/24 4:26 AM, Marco Elver wrote: > > > In various performance profiles of kernels with BPF programs attached, > > > bpf_local_storage_lookup() appears as a significant portion of CPU > > > cycles spent. To enable the compiler generate more optimal code, turn > > > bpf_local_storage_lookup() into a static inline function, where only the > > > cache insertion code path is outlined > > > > > > Notably, outlining cache insertion helps avoid bloating callers by > > > duplicating setting up calls to raw_spin_{lock,unlock}_irqsave() (on > > > architectures which do not inline spin_lock/unlock, such as x86), which > > > would cause the compiler produce worse code by deciding to outline > > > otherwise inlinable functions. The call overhead is neutral, because we > > > make 2 calls either way: either calling raw_spin_lock_irqsave() and > > > raw_spin_unlock_irqsave(); or call __bpf_local_storage_insert_cache(), > > > which calls raw_spin_lock_irqsave(), followed by a tail-call to > > > raw_spin_unlock_irqsave() where the compiler can perform TCO and (in > > > optimized uninstrumented builds) turns it into a plain jump. The call to > > > __bpf_local_storage_insert_cache() can be elided entirely if > > > cacheit_lockit is a false constant expression. > > > > > > Based on results from './benchs/run_bench_local_storage.sh' (21 trials, > > > reboot between each trial; x86 defconfig + BPF, clang 16) this produces > > > improvements in throughput and latency in the majority of cases, with an > > > average (geomean) improvement of 8%: > [...] > > > include/linux/bpf_local_storage.h | 30 ++++++++++- > > > kernel/bpf/bpf_local_storage.c | 52 +++++-------------- > > > .../bpf/prog_tests/task_local_storage.c | 6 --- > > > .../selftests/bpf/progs/cgrp_ls_recursion.c | 26 ---------- > > > .../selftests/bpf/progs/task_ls_recursion.c | 17 ------ > > > 5 files changed, 41 insertions(+), 90 deletions(-) > > > > > > diff --git a/include/linux/bpf_local_storage.h b/include/linux/bpf_local_storage.h > > > index 173ec7f43ed1..dcddb0aef7d8 100644 > > > --- a/include/linux/bpf_local_storage.h > > > +++ b/include/linux/bpf_local_storage.h > > > @@ -129,10 +129,36 @@ bpf_local_storage_map_alloc(union bpf_attr *attr, > > > struct bpf_local_storage_cache *cache, > > > bool bpf_ma); > > > > > > -struct bpf_local_storage_data * > > > +void __bpf_local_storage_insert_cache(struct bpf_local_storage *local_storage, > > > + struct bpf_local_storage_map *smap, > > > + struct bpf_local_storage_elem *selem); > > > +/* If cacheit_lockit is false, this lookup function is lockless */ > > > +static inline struct bpf_local_storage_data * > > > bpf_local_storage_lookup(struct bpf_local_storage *local_storage, > > > struct bpf_local_storage_map *smap, > > > - bool cacheit_lockit); > > > + bool cacheit_lockit) > > > +{ > > > + struct bpf_local_storage_data *sdata; > > > + struct bpf_local_storage_elem *selem; > > > + > > > + /* Fast path (cache hit) */ > > > + sdata = rcu_dereference_check(local_storage->cache[smap->cache_idx], > > > + bpf_rcu_lock_held()); > > > + if (sdata && rcu_access_pointer(sdata->smap) == smap) > > > + return sdata; > > > > I think we should focus on fast path (your v1 patch) > > and I suppose most production environments > > want to hit fast path in most times. In your production environment did > > you see more than 16 local storage maps per entity (task/sk/inode)? > > I think having more than 16 local storage maps isn't entirely unlikely > as eBPF usage grows. But at the moment, it should be rare. > > > In the fast path, the memory accesses are > > two from local_storage->cache[smap->cache_idx] and > > one from sdata->smap > > > > > > > + > > > + /* Slow path (cache miss) */ > > > + hlist_for_each_entry_rcu(selem, &local_storage->list, snode, > > > + rcu_read_lock_trace_held()) > > > + if (rcu_access_pointer(SDATA(selem)->smap) == smap) > > > + break; > > > > But if we reach slow path here which means we have more than 16 local > > storage maps, then traversing the list and getting SDATA(selem)->smap > > will be very expensive, in addition to memory accesses in fast path. > > > > I suppose here we mostly care about socket local storage since it is > > totally possible for a production workload to have millions of sockets. > > To improve performance, fast path should hit in most cases. > > If there are too many sk local storage maps, some kind of sharing > > can be done so multiple applications might be using a single sk > > local storage. > > > > Your above inlining/outlining analysis also show how tricky it is > > for compilation optimization. Without profiling, it is totally > > possible that compiler might do optimization differently in > > the future. > > Sure, but it's usually the case that we have to help the compiler a > little to produce more optimal code - if the compiler becomes stupid > in future, we need either fix the compiler or help it some more. > > > So here is my suggestion, let us do inlining > > for fast path and focus on performance of fast path. > > The slow-path (iterate list w/o cache insertion) is still relatively > small (it's a pointer-chasing loop and a compare), and I decided that > it can be justified inlining it. Martin asked in v1 why there were > slowdowns above 16 local maps, and I analyzed, and concluded that > inlining most is needed to fix and does not hurt performance: in fact, > the current version is better than v1 in all cases (even for 16 maps > or below). > > Let me know which version you prefer, and I'll change it. However, > based on the results, I would prefer the current version. FTR, these were the results going from v1 (before) -> v2 (after): +---- Local Storage ---------------------- | | + num_maps: 1 | : | | +-+ local_storage cache sequential get +----------------------+---------------------- | +- hits throughput | 38.593 M ops/s | 39.068 M ops/s (+1.2%) | +- hits latency | 25.913 ns/op | 25.598 ns/op (-1.2%) | +- important_hits throughput | 38.593 M ops/s | 39.068 M ops/s (+1.2%) | : | : | | +-+ local_storage cache interleaved get +----------------------+---------------------- | +- hits throughput | 44.406 M ops/s | 44.926 M ops/s (+1.2%) | +- hits latency | 22.521 ns/op | 22.259 ns/op (-1.2%) | +- important_hits throughput | 44.406 M ops/s | 44.926 M ops/s (+1.2%) | | + num_maps: 10 | : | | +-+ local_storage cache sequential get +----------------------+---------------------- | +- hits throughput | 37.583 M ops/s | 38.099 M ops/s (+1.4%) | +- hits latency | 26.609 ns/op | 26.248 ns/op (-1.4%) | +- important_hits throughput | 3.758 M ops/s | 3.810 M ops/s (+1.4%) | : | : | | +-+ local_storage cache interleaved get +----------------------+---------------------- | +- hits throughput | 40.698 M ops/s | 41.145 M ops/s (+1.1%) | +- hits latency | 24.573 ns/op | 24.307 ns/op (-1.1%) | +- important_hits throughput | 14.535 M ops/s | 14.695 M ops/s (+1.1%) | | + num_maps: 16 | : | | +-+ local_storage cache sequential get +----------------------+---------------------- | +- hits throughput | 38.061 M ops/s | 38.341 M ops/s ( ~ ) | +- hits latency | 26.275 ns/op | 26.083 ns/op ( ~ ) | +- important_hits throughput | 2.379 M ops/s | 2.396 M ops/s ( ~ ) | : | : | | +-+ local_storage cache interleaved get +----------------------+---------------------- | +- hits throughput | 40.890 M ops/s | 41.338 M ops/s (+1.1%) | +- hits latency | 24.458 ns/op | 24.193 ns/op (-1.1%) | +- important_hits throughput | 13.010 M ops/s | 13.153 M ops/s (+1.1%) | | + num_maps: 17 | : | | +-+ local_storage cache sequential get +----------------------+---------------------- | +- hits throughput | 31.799 M ops/s | 32.756 M ops/s (+3.0%) | +- hits latency | 31.448 ns/op | 30.530 ns/op (-2.9%) | +- important_hits throughput | 1.873 M ops/s | 1.929 M ops/s (+3.0%) | : | : | | +-+ local_storage cache interleaved get +----------------------+---------------------- | +- hits throughput | 35.284 M ops/s | 36.110 M ops/s (+2.3%) | +- hits latency | 28.343 ns/op | 27.697 ns/op (-2.3%) | +- important_hits throughput | 10.742 M ops/s | 10.993 M ops/s (+2.3%) | | + num_maps: 24 | : | | +-+ local_storage cache sequential get +----------------------+---------------------- | +- hits throughput | 17.947 M ops/s | 19.937 M ops/s (+11.1%) | +- hits latency | 55.725 ns/op | 50.166 ns/op (-10.0%) | +- important_hits throughput | 0.748 M ops/s | 0.831 M ops/s (+11.1%) | : | : | | +-+ local_storage cache interleaved get +----------------------+---------------------- | +- hits throughput | 21.379 M ops/s | 23.332 M ops/s (+9.1%) | +- hits latency | 46.775 ns/op | 42.865 ns/op (-8.4%) | +- important_hits throughput | 6.014 M ops/s | 6.564 M ops/s (+9.1%) | | + num_maps: 32 | : | | +-+ local_storage cache sequential get +----------------------+---------------------- | +- hits throughput | 13.279 M ops/s | 14.626 M ops/s (+10.1%) | +- hits latency | 75.317 ns/op | 68.381 ns/op (-9.2%) | +- important_hits throughput | 0.416 M ops/s | 0.458 M ops/s (+10.2%) | : | : | | +-+ local_storage cache interleaved get +----------------------+---------------------- | +- hits throughput | 16.444 M ops/s | 17.906 M ops/s (+8.9%) | +- hits latency | 60.816 ns/op | 55.865 ns/op (-8.1%) | +- important_hits throughput | 4.590 M ops/s | 4.998 M ops/s (+8.9%) | | + num_maps: 100 | : | | +-+ local_storage cache sequential get +----------------------+---------------------- | +- hits throughput | 4.912 M ops/s | 5.528 M ops/s (+12.5%) | +- hits latency | 207.291 ns/op | 183.059 ns/op (-11.7%) | +- important_hits throughput | 0.049 M ops/s | 0.055 M ops/s (+12.7%) | : | : | | +-+ local_storage cache interleaved get +----------------------+---------------------- | +- hits throughput | 6.039 M ops/s | 6.498 M ops/s (+7.6%) | +- hits latency | 167.325 ns/op | 152.877 ns/op (-8.6%) | +- important_hits throughput | 1.577 M ops/s | 1.697 M ops/s (+7.6%) | | + num_maps: 1000 | : | | +-+ local_storage cache sequential get +----------------------+---------------------- | +- hits throughput | 0.342 M ops/s | 0.354 M ops/s (+3.6%) | +- hits latency | 2930.550 ns/op | 2827.139 ns/op (-3.5%) | +- important_hits throughput | 0.000 M ops/s | 0.000 M ops/s ( ~ ) | : | : | | +-+ local_storage cache interleaved get +----------------------+---------------------- | +- hits throughput | 0.413 M ops/s | 0.403 M ops/s (-2.5%) | +- hits latency | 2427.830 ns/op | 2487.555 ns/op (+2.5%) | +- important_hits throughput | 0.104 M ops/s | 0.101 M ops/s (-2.6%) | | Geomean: | hits throughput: 102.93% | hits latency: 97.11% | important_hits throughput: 102.77%