From a699383933f647519efa5fce0e9563e392d7e620 Mon Sep 17 00:00:00 2001 From: YueGuobin Date: Tue, 11 Aug 2026 10:44:16 +0800 Subject: [PATCH] perf: raise marker UDP receive buffer from ~208KB to 8MB MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1000+ uBridge processes share a single UDP marker.sink endpoint. The default kernel receive buffer (~208 KB) holds ~1000 datagrams — a traffic burst can overflow it before the event loop drains them. Grow it to 8 MB via setsockopt(SO_RCVBUF) so the kernel absorbs bursts without silent packet loss. UDP is unordered — buffer size does not affect per-datagram latency, only burst-loss resilience. --- gns3server/compute/marker/marker_manager.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/gns3server/compute/marker/marker_manager.py b/gns3server/compute/marker/marker_manager.py index 6ec128158..2dfea31a7 100644 --- a/gns3server/compute/marker/marker_manager.py +++ b/gns3server/compute/marker/marker_manager.py @@ -17,6 +17,7 @@ import asyncio import logging +import socket from gns3server.compute.marker.marker_listener import MarkerListener from gns3server.compute.notification_manager import NotificationManager @@ -75,10 +76,20 @@ class MarkerManager: return loop = asyncio.get_running_loop() self._listener = MarkerListener(self) + + def _configure_transport(transport): + sock = transport.get_extra_info("socket") + if sock is not None: + # Raise the UDP receive buffer from the default ~208 KB to 8 MB + # so that 1000+ uBridge processes can burst marker.match signals + # without kernel-side datagram loss. + sock.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 8 * 1024 * 1024) + try: self._transport, _ = await loop.create_datagram_endpoint( lambda: self._listener, local_addr=(host, port) ) + _configure_transport(self._transport) except OSError: if port != 0: log.warning( @@ -88,6 +99,7 @@ class MarkerManager: self._transport, _ = await loop.create_datagram_endpoint( lambda: self._listener, local_addr=(host, 0) ) + _configure_transport(self._transport) except OSError as e: log.error( "Marker listener startup failed: %s. Traffic insight signals are unavailable.", e