git: 09274116f4d9 - stable/13 - tests: Revise FIB lookups per second benchmarking routines

Marko Zec zec at FreeBSD.org
Sun Jun 20 11:31:15 UTC 2021


The branch stable/13 has been updated by zec:

URL: https://cgit.FreeBSD.org/src/commit/?id=09274116f4d90f5c25cfad3bd7d13b48b2d494da

commit 09274116f4d90f5c25cfad3bd7d13b48b2d494da
Author:     Marko Zec <zec at FreeBSD.org>
AuthorDate: 2021-06-17 06:49:09 +0000
Commit:     Marko Zec <zec at FreeBSD.org>
CommitDate: 2021-06-20 11:27:17 +0000

    tests: Revise FIB lookups per second benchmarking routines
    
    Fix a bug in the LPM SEQ benchmark (missing break inside a switch block)
    by restructuring the test loop, while introducing additional two
    synthetic test options:
    
    ANN: scan only the address space announced in current RIB
    REP: repeat lookups over several keys in a sliding window scheme
    
    The total of eight combinations of test options are now available
    through dedicated sysctl hooks.
    
    Differential Revision:  <https://reviews.freebsd.org/D30311>
    Reviewed by:    melifaro
    MFC after:      3 days
    
    (cherry picked from commit b6f8436b094daf7b1c429ce74997a4daf6994fcb)
---
 sys/tests/fib_lookup/fib_lookup.c | 140 ++++++++++++++++++++++++++++++++------
 1 file changed, 119 insertions(+), 21 deletions(-)

diff --git a/sys/tests/fib_lookup/fib_lookup.c b/sys/tests/fib_lookup/fib_lookup.c
index 4093ff9dd487..927664166fdd 100644
--- a/sys/tests/fib_lookup/fib_lookup.c
+++ b/sys/tests/fib_lookup/fib_lookup.c
@@ -505,16 +505,46 @@ SYSCTL_PROC(_net_route_test, OID_AUTO, run_inet_scan,
     CTLFLAG_VNET | CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_MPSAFE,
     0, 0, run_test_inet_scan, "I", "Execute fib4_lookup scan tests");
 
+#define	LPS_SEQ		0x1
+#define	LPS_ANN		0x2
+#define	LPS_REP		0x4
+
+struct lps_walk_state {
+	uint32_t *keys;
+	int pos;
+	int lim;
+};
+
+static int
+reduce_keys(struct rtentry *rt, void *_data)
+{
+        struct lps_walk_state *wa = (struct lps_walk_state *) _data;
+	struct in_addr addr;
+	uint32_t scopeid;
+	int plen;
+
+	rt_get_inet_prefix_plen(rt, &addr, &plen, &scopeid);
+	wa->keys[wa->pos] = ntohl(addr.s_addr) |
+	    (wa->keys[wa->pos] & ~(0xffffffffU << (32 - plen)));
+
+	wa->pos++;
+	return (wa->pos == wa->lim);
+}
+
 static int
 rnd_lps(SYSCTL_HANDLER_ARGS)
 {
 	struct epoch_tracker et;
 	struct in_addr key;
+	struct lps_walk_state wa;
 	struct timespec ts_pre, ts_post;
+	struct nhop_object *nh_fib;
 	uint64_t total_diff, lps;
 	uint32_t *keys;
+	uint32_t t, p;
 	uintptr_t acc = 0;
-	int count = 0;
+	int i, pos, count = 0;
+	int seq = 0, rep = 0;
 	int error;
 
 	error = sysctl_handle_int(oidp, &count, 0, req);
@@ -526,25 +556,62 @@ rnd_lps(SYSCTL_HANDLER_ARGS)
 	keys = malloc(sizeof(*keys) * count, M_TEMP, M_NOWAIT);
 	if (keys == NULL)
 		return (ENOMEM);
-
 	printf("Preparing %d random keys...\n", count);
 	arc4random_buf(keys, sizeof(*keys) * count);
-	printf("Starting LPS test...\n");
+	if (arg2 & LPS_ANN) {
+		wa.keys = keys;
+		wa.pos = 0;
+		wa.lim = count;
+		printf("Reducing keys to announced address space...\n");
+		do {
+			rib_walk(RT_DEFAULT_FIB, AF_INET, false, reduce_keys,
+			    &wa);
+		} while (wa.pos < wa.lim);
+		printf("Reshuffling keys...\n");
+		for (int i = 0; i < count; i++) {
+			p = random() % count;
+			t = keys[p];
+			keys[p] = keys[i];
+			keys[i] = t;
+		}
+	}
+
+	if (arg2 & LPS_REP) {
+		rep = 1;
+		printf("REP ");
+	}
+	if (arg2 & LPS_SEQ) {
+		seq = 1;
+		printf("SEQ");
+	} else if (arg2 & LPS_ANN)
+		printf("ANN");
+	else
+		printf("RND");
+	printf(" LPS test starting...\n");
 
 	NET_EPOCH_ENTER(et);
 	nanouptime(&ts_pre);
-	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);
+	for (i = 0, pos = 0; i < count; i++) {
+		key.s_addr = keys[pos++] ^ ((acc >> 10) & 0xff);
+		nh_fib = fib4_lookup(RT_DEFAULT_FIB, key, 0, NHR_NONE, 0);
+		if (seq) {
+			if (nh_fib != NULL) {
+				acc += (uintptr_t) nh_fib + 123;
+				if (acc & 0x1000)
+					acc += (uintptr_t) nh_fib->nh_ifp;
+				else
+					acc -= (uintptr_t) nh_fib->nh_ifp;
+			} else
+				acc ^= (acc >> 3) + (acc << 2) + i;
+			if (acc & 0x800)
+				pos++;
+			if (pos >= count)
+				pos = 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);
+		if (rep && ((i & 0xf) == 0xf)) {
+			pos -= 0xf;
+			if (pos < 0)
+				pos += 0xf;
 		}
 	}
 	nanouptime(&ts_post);
@@ -553,22 +620,53 @@ rnd_lps(SYSCTL_HANDLER_ARGS)
 	free(keys, M_TEMP);
 
 	total_diff = (ts_post.tv_sec - ts_pre.tv_sec) * 1000000000 +
-	    (ts_post.tv_nsec - ts_pre.tv_nsec) + (acc & 1);
+	    (ts_post.tv_nsec - ts_pre.tv_nsec);
 	lps = 1000000000ULL * count / total_diff;
-	printf("%d lookups in %zu nanoseconds, %lu.%06lu MLPS\n",
-	    count, total_diff, lps / 1000000, lps % 1000000);
+	printf("%d lookups in %zu.%06zu milliseconds, %lu.%06lu MLPS\n",
+	    count, total_diff / 1000000, total_diff % 1000000,
+	    lps / 1000000, lps % 1000000);
 
 	return (0);
 }
-SYSCTL_PROC(_net_route_test, OID_AUTO, run_lps_seq,
+SYSCTL_PROC(_net_route_test, OID_AUTO, run_lps_rnd,
     CTLFLAG_VNET | CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_MPSAFE,
     0, 0, rnd_lps, "I",
+    "Measure lookups per second, uniformly random keys, independent lookups");
+SYSCTL_PROC(_net_route_test, OID_AUTO, run_lps_rnd_ann,
+    CTLFLAG_VNET | CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_MPSAFE,
+    0, LPS_ANN, rnd_lps, "I",
+    "Measure lookups per second, random keys from announced address space, "
+    "independent lookups");
+SYSCTL_PROC(_net_route_test, OID_AUTO, run_lps_seq,
+    CTLFLAG_VNET | CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_MPSAFE,
+    0, LPS_SEQ, rnd_lps, "I",
     "Measure lookups per second, uniformly random keys, "
     "artificial dependencies between lookups");
-SYSCTL_PROC(_net_route_test, OID_AUTO, run_lps_rnd,
+SYSCTL_PROC(_net_route_test, OID_AUTO, run_lps_seq_ann,
     CTLFLAG_VNET | CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_MPSAFE,
-    0, 1, rnd_lps, "I",
-    "Measure lookups per second, uniformly random keys, independent lookups");
+    0, LPS_SEQ | LPS_ANN, rnd_lps, "I",
+    "Measure lookups per second, random keys from announced address space, "
+    "artificial dependencies between lookups");
+SYSCTL_PROC(_net_route_test, OID_AUTO, run_lps_rnd_rep,
+    CTLFLAG_VNET | CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_MPSAFE,
+    0, LPS_REP, rnd_lps, "I",
+    "Measure lookups per second, uniformly random keys, independent lookups, "
+    "repeated keys");
+SYSCTL_PROC(_net_route_test, OID_AUTO, run_lps_rnd_ann_rep,
+    CTLFLAG_VNET | CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_MPSAFE,
+    0, LPS_ANN | LPS_REP, rnd_lps, "I",
+    "Measure lookups per second, random keys from announced address space, "
+    "independent lookups, repeated keys");
+SYSCTL_PROC(_net_route_test, OID_AUTO, run_lps_seq_rep,
+    CTLFLAG_VNET | CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_MPSAFE,
+    0, LPS_SEQ | LPS_REP, rnd_lps, "I",
+    "Measure lookups per second, uniformly random keys, "
+    "artificial dependencies between lookups, repeated keys");
+SYSCTL_PROC(_net_route_test, OID_AUTO, run_lps_seq_ann_rep,
+    CTLFLAG_VNET | CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_MPSAFE,
+    0, LPS_SEQ | LPS_ANN | LPS_REP, rnd_lps, "I",
+    "Measure lookups per second, random keys from announced address space, "
+    "artificial dependencies between lookups, repeated keys");
 
 static int
 test_fib_lookup_modevent(module_t mod, int type, void *unused)


More information about the dev-commits-src-all mailing list