aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarko Zec <zec@FreeBSD.org>2021-05-05 10:28:17 +0000
committerMarko Zec <zec@FreeBSD.org>2021-05-05 10:28:17 +0000
commita43104ebe7630111d7e7debc56aacf49787dcf43 (patch)
tree1fece4aaabd445409e234b15cb712b23501071ab
parent122a8c7eb1baeed7d6d2e213dcfc7e2872bfe878 (diff)
downloadsrc-a43104ebe7630111d7e7debc56aacf49787dcf43.tar.gz
src-a43104ebe7630111d7e7debc56aacf49787dcf43.zip
Revise FIB lookups per second benchmarking routines.
Add a LPS benchmark variant which introduces artificial dependencies between successive lookups. While here, instead of writing the results from the lookups to a huge array, add them to an accumulator, in a more lightweight attempt at preventing the CPU's OOO machinery from discarding the lookup results if they would be completely unused. net.route.test.run_lps_rnd measures LPS throughput with independent uniformly random keys net.route.test.run_lps_seq measures LPS throughput with uniformly random keys with artificial interdependencies Reviewed by: melifaro MFC after: 7 days Differential Revision: https://reviews.freebsd.org/D30096
-rw-r--r--sys/tests/fib_lookup/fib_lookup.c42
1 files changed, 27 insertions, 15 deletions
diff --git a/sys/tests/fib_lookup/fib_lookup.c b/sys/tests/fib_lookup/fib_lookup.c
index ea07e3d697c6..4093ff9dd487 100644
--- a/sys/tests/fib_lookup/fib_lookup.c
+++ b/sys/tests/fib_lookup/fib_lookup.c
@@ -509,13 +509,13 @@ static int
rnd_lps(SYSCTL_HANDLER_ARGS)
{
struct epoch_tracker et;
- struct in_addr *keys;
- struct nhop_object **nhops;
-
+ struct in_addr key;
struct timespec ts_pre, ts_post;
uint64_t total_diff, lps;
- int error;
+ uint32_t *keys;
+ uintptr_t acc = 0;
int count = 0;
+ int error;
error = sysctl_handle_int(oidp, &count, 0, req);
if (error != 0)
@@ -524,12 +524,8 @@ rnd_lps(SYSCTL_HANDLER_ARGS)
return (0);
keys = malloc(sizeof(*keys) * count, M_TEMP, M_NOWAIT);
- nhops = malloc(sizeof(*nhops) * count, M_TEMP, M_NOWAIT);
- if (keys == NULL || nhops == NULL) {
- free(keys, M_TEMP);
- free(nhops, M_TEMP);
+ if (keys == NULL)
return (ENOMEM);
- }
printf("Preparing %d random keys...\n", count);
arc4random_buf(keys, sizeof(*keys) * count);
@@ -537,26 +533,42 @@ rnd_lps(SYSCTL_HANDLER_ARGS)
NET_EPOCH_ENTER(et);
nanouptime(&ts_pre);
- for (int i = 0; i < count; i++)
- nhops[i] = fib4_lookup(RT_DEFAULT_FIB, keys[i], 0, NHR_NONE, 0);
+ switch (arg2) {
+ case 0:
+ for (int i = 0; i < count; i++) {
+ key.s_addr = keys[i] + acc;
+ acc += (uintptr_t) fib4_lookup(RT_DEFAULT_FIB, key, 0,
+ NHR_NONE, 0);
+ }
+ case 1:
+ for (int i = 0; i < count; i++) {
+ key.s_addr = keys[i];
+ acc += (uintptr_t) fib4_lookup(RT_DEFAULT_FIB, key, 0,
+ NHR_NONE, 0);
+ }
+ }
nanouptime(&ts_post);
NET_EPOCH_EXIT(et);
free(keys, M_TEMP);
- free(nhops, M_TEMP);
total_diff = (ts_post.tv_sec - ts_pre.tv_sec) * 1000000000 +
- (ts_post.tv_nsec - ts_pre.tv_nsec);
+ (ts_post.tv_nsec - ts_pre.tv_nsec) + (acc & 1);
lps = 1000000000ULL * count / total_diff;
printf("%d lookups in %zu nanoseconds, %lu.%06lu MLPS\n",
count, total_diff, lps / 1000000, lps % 1000000);
return (0);
}
-SYSCTL_PROC(_net_route_test, OID_AUTO, rnd_lps,
+SYSCTL_PROC(_net_route_test, OID_AUTO, run_lps_seq,
CTLFLAG_VNET | CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_MPSAFE,
0, 0, rnd_lps, "I",
- "Measure lookups per second using uniformly random keys");
+ "Measure lookups per second, uniformly random keys, "
+ "artificial dependencies between lookups");
+SYSCTL_PROC(_net_route_test, OID_AUTO, run_lps_rnd,
+ CTLFLAG_VNET | CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_MPSAFE,
+ 0, 1, rnd_lps, "I",
+ "Measure lookups per second, uniformly random keys, independent lookups");
static int
test_fib_lookup_modevent(module_t mod, int type, void *unused)