: uperf streaming read test with 50 parallel connections
One guest acts as the uperf client, the other as the server
Open vSwitch configuration:
OVS bridge with two ports
Guests attached via virtio‑net
Each guest configured with 4 vhost‑queues
Problem Description
When comparing PREEMPT_LAZY against full PREEMPT, we see a substantial drop in throughput—on some systems up to 50%.
Observed Behaviour
By tracing packets inside Open vSwitch (ovs_do_execute_action), we see:
Packet drops
Retransmissions
Reductions in packet size (from 64K down to 32K)
Capturing traffic inside the VM and inspecting it in Wireshark shows the following TCP‑level differences between PREEMPT_FULL and PREEMPT_LAZY:
|--------------------------------------+--------------+--------------+------------------|
| Wireshark Warning / Note | PREEMPT_FULL | PREEMPT_LAZY | (lazy vs full) |
|--------------------------------------+--------------+--------------+------------------|
| D-SACK Sequence | 309 | 2603 | ×8.4 |
| Partial Acknowledgement of a segment | 54 | 279 | ×5.2 |
| Ambiguous ACK (Karn) | 32 | 747 | ×23 |
| (Suspected) spurious retransmission | 205 | 857 | ×4.2 |
| (Suspected) fast retransmission | 54 | 1622 | ×30 |
| Duplicate ACK | 504 | 3446 | ×6.8 |
| Packet length exceeds MSS (TSO/GRO) | 13172 | 34790 | ×2.6 |
| Previous segment(s) not captured | 9205 | 6730 | -27% |
| ACKed segment that wasn't captured | 7022 | 8272 | +18% |
| (Suspected) out-of-order segment | 436 | 303 | -31% |
|--------------------------------------+--------------+--------------+------------------|
This pattern indicates reordering, loss, or scheduling‑related delays, but it is still unclear why PREEMPT_LAZY is causing this behaviour in this workload.
Additional observations:
Monitoring the guest CPU run time shows that it drops from 16% with PREEMPT_FULL to 9% with PREEMPT_LAZY.
The workload is dominated by voluntary preemption (schedule()), and PREEMPT_LAZY is, as far as I understand, mainly concerned with forced preemption.
It is therefore not obvious why PREEMPT_LAZY has an impact here.
Changing guest configuration to disable mergeable RX buffers:
had a clear effect on throughput:
PREEMPT_LAZY: throughput improved from 40 Gb/s → 60 Gb/s
From - Tue Feb 24 15:53:32 2026
X-Mozilla-Status: 0001
X-Mozilla-Status2: 00000000
Return-Path:
Delivered-To: hi@josie.lol
Received: from witcher.mxrouting.net
by witcher.mxrouting.net with LMTP
id MKylHnfJnWmDexwAYBR5ng
(envelope-from )
for ; Tue, 24 Feb 2026 15:53:27 +0000
Return-path:
Envelope-to: hi@josie.lol
Delivery-date: Tue, 24 Feb 2026 15:53:27 +0000
Received: from sea.lore.kernel.org ([172.234.253.10])
by witcher.mxrouting.net with esmtps (TLS1.3) tls TLS_AES_256_GCM_SHA384
(Exim 4.98)
(envelope-from )
id 1vuuj0-00000008mMH-3mdu
for hi@josie.lol;
Tue, 24 Feb 2026 15:53:27 +0000
Received: from smtp.subspace.kernel.org (conduit.subspace.kernel.org [100.90.174.1])
by sea.lore.kernel.org (Postfix) with ESMTP id AC944308B76F
for ; Tue, 24 Feb 2026 15:47:05 +0000 (UTC)
Received: from localhost.localdomain (localhost.localdomain [127.0.0.1])
by smtp.subspace.kernel.org (Postfix) with ESMTP id DFDC83A4F5D;
Tue, 24 Feb 2026 15:47:04 +0000 (UTC)
Authentication-Results: smtp.subspace.kernel.org;
dkim=pass (2048-bit key) header.d=rowland.harvard.edu header.i=@rowla2100→2101)
2026-03-06T21:10:38.747Z [DEBUG] [useDeferredValue] Messages deferred by 1 (2101→2102)
2026-03-06T21:10:39.747Z [DEBUG] [useDeferredValue] Messages deferred by 1 (2102→2103)
2026-03-06T21:10:40.747Z [DEBUG] [useDeferredValue] Messages deferred by 1 (2103→2104)
2026-03-06T21:10:41.747Z [DEBUG] [useDeferredValue] Messages deferred by 1 (2104→2105)
2026-03-06T21:10:42.747Z [DEBUG] [useDeferredValue] Messages deferred by 1 (2105→2106)
2026-03-06T21:10:43.747Z [DEBUG] [useDeferredValue] Messages deferred by 1 (2106→2107)
2026-03-06T21:10:44.747Z [DEBUG] [useDeferredValue] Messages deferred by 1 (2107→2108)
2026-03-06T21:10:45.750Z [DEBUG] [useDeferredValue] Messages deferred by 1 (2108→2109)
2026-03-06T21:10:46.747Z [DEBUG] [useDeferredValue] Messages deferred by 1 (2109→2110)
2026-03-06T21:10:47.748Z [DEBUG] [useDeferredValue] Messages deferred by 1 (2110→2111)
2026-03-06T21:10:48.748Z [DEBUG] [useDeferredValue] Messages deferred by 1 (2111→2112)
2026-03-06T21:10:49.747Z [DEBUG] [useDeferredValue] Messages deferred by 1 (2112→2113)
2026-03-06T21:10:50.748Z [DEBUG] [useDeferredValue] Messages deferred by 1 (2113→2114)
2026-03-06T21:10:51.749Z [DEBUG] [useDeferredValue] Messages deferred by 1 (2114→2115)
2026-03-06T21:10:52.749Z [DEBUG] [useDeferredValue] Messages deferred by 1 (2115→2116)
2026-03-06T21:10:53.750Z [DEBUG] [useDeferredValue] Messages deferred by 1 (2116→2117)
2026-03-06T21:10:54.749Z [DEBUG] [useDeferredValue] Messages deferred by 1 (2117→2118)
2026-03-06T21:10:55.749Z [DEBUG] [useDeferredValue] Messages deferred by 1 (2118→2119)
2026-03-06T21:10:56.749Z [DEBUG] [useDeferredValue] Messages deferred by 1 (2119→2120)
2026-03-06T21:10:57.753Z [DEBUG] [useDeferredValue] Messages deferred by 1 (2120→2121)
2026-03-06T21:10:58.753Z [DEBUG] [useDeferredValue] Messages deferred by 1 (2121→2122)
2026-03-06T21:10:59.754Z [DEBUG] [useDeferredValue] Messages deferred by 1 (2122→2123)
2026-03-06T21:11:00.752Z [DEBUG] [useDeferredValue] Messages deferred by 1 (2123→2124)
2026-03-06T21:11:01.754Z [DEBUG] [useDeferredValue] Messages deferred by 1 (2124→2125)
2026-03-06T21:11:02.753Z [DEBUG] [useDeferredValue] Messages deferred by 1 (2125→2126)
2026-03-06T21:11:03.753Z [DEBUG] [useDeferredValue] Messages deferred by 1 (2126→2127)
2026-03-06T21:11:04.753Z [DEBUG] [useDeferredValue] Messages deferred by 1 (2127→2128)
2026-03-06T21:11:05.753Z [DEBUG] [useDeferredValue] Messages deferred by 1 (2128→2129)
2026-03-06T21:11:06.753Z [DEBUG] [useDeferredValue] Messages deferred by 1 (2129→2130)
2026-03-06T21:11:07.753Z [DEBUG] [useDeferredValue] Messages deferred by 1 (2130→2131)
2026-03-06T21:11:08.753Z [DEBUG] [useDeferredValue] Messages deferred by 1 (2131→2132)
2026-03-06T21:11:09.753Z [DEBUG] [useDeferredValue] Messages deferred by 1 (2132→2133)
2026-03-06T21:11:10.753Z [DEBUG] [useDeferredValue] Messages deferred by 1 (2133→2134)
2026-03-06T21:11:11.754Z [DEBUG] [useDeferredValue] Messages deferred by 1 (2134→2135)
2026-03-06T21:11:12.754Z [DEBUG] [useDeferredValue] Messages deferred by 1 (2135→2136)
2026-03-06T21:11:13.753Z [DEBUG] [useDeferredValue] Messages deferred by 1 (2136→2137)
2026-03-06T21:11:14.753Z [DEBUG] [useDeferredValue] Messages deferred by 1 (2137→2138)
2026-03-06T21:11:15.753Z [DEBUG] [useDeferredValue] Messages deferred by 1 (2138→2139)
2026-03-06T21:11:16.753Z [DEBUG] [useDeferredValue] Messages deferred by 1 (2139→2140)
2026-03-06T21:11:17.755Z [DEBUG] [useDeferredValue] Messages deferred by 1 (2140→2141)
2026-03-06T21:11:18.758Z [DEBUG] [useDeferredValue] Messages deferred by 1 (2141→2142)
2026-03-06T21:11:19.758Z [DEBUG] [useDeferredValue] Messages deferred by 1 (2142→2143)
2026-03-06T21:11:20.758Z [DEBUG] [useDeferredValue] Messages deferred by 1 (2143→2144)
2026-03-06T21:11:21.758Z [DEBUG] [useDeferredValue] Messages deferred by 1 (2144→2145)
2026-03-06T21:11:22.758Z [DEBUG] [useDeferredValue] Messages deferred by 1 (2145→2146)
2026-03-06T21:11:23.758Z [DEBUG] [useDeferredValue] Messages deferred by 1 (21