From 1e562fb73527adb46a6ce8f4f302e22460aedf95 Mon Sep 17 00:00:00 2001 From: eunhhu Date: Tue, 29 Sep 2026 16:13:48 +0100 Subject: Put ngtcp2 beside quinn in M5, as the design planned ngtcp2 1.25.0 with OpenSSL 3.5's QUIC TLS (its ossl backend), fetched and built into build/third by ngtcp2/build.sh; drain.c does in C what the quinn harness does: one connection, one stream, "pure" and then the messages each after its u32 length, counted by the service, packets in GSO bursts. Its stream bytes are a function of their offset, so what ngtcp2 keeps to send again points into a pattern that never changes. run.py's drain_ngtcp2 measures both sides' CPU as drain_quic does. Five rounds each, both sides' CPU a message: 61 B Pure 0.280, ngtcp2 0.270, quinn 0.310 us; 1 KiB 2.62, 3.54, 3.94; 16 KiB 40.2, 54.4, 60.2. --- research/experiments/019-idle-links/run.py | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) (limited to 'research/experiments/019-idle-links/run.py') diff --git a/research/experiments/019-idle-links/run.py b/research/experiments/019-idle-links/run.py index 7f2647d..0d18c1d 100644 --- a/research/experiments/019-idle-links/run.py +++ b/research/experiments/019-idle-links/run.py @@ -543,6 +543,26 @@ def drain_quic(work, n, size): return row +def drain_ngtcp2(work, n, size): + """The same over ngtcp2 (ngtcp2/drain.c, OpenSSL 3.5's QUIC TLS): one + connection, one stream, n messages; CPU of both sides.""" + import resource + binary = ROOT / 'build/third/ngtcp2-drain' + server, info = start([binary, 'serve', work / 'cert.der', work / 'key.der']) + before, children = thread_cpu(server.pid, None), resource.getrusage(resource.RUSAGE_CHILDREN) + client = subprocess.run([str(binary), 'drain', str(info['port']), str(n), str(size + 8 + 5)], capture_output=True, + timeout=600) + after = resource.getrusage(resource.RUSAGE_CHILDREN) + row = json.loads(client.stdout) + server_cpu = thread_cpu(server.pid, None) - before + client_cpu = (after.ru_utime + after.ru_stime - children.ru_utime - children.ru_stime) * 1000 + row['client_cpu_us_per_message'] = round(client_cpu * 1000 / n, 2) + server.kill() + server.wait() + row['service_cpu_us_per_message'] = round(server_cpu * 1000 / n, 2) + return row + + def transport(work, size, n): """The transport alone (transport.c): a backlog of n records of an order with a size-byte item drained through a link and a listener in one -- cgit v1.2.3