perf: heavily tune UDP socket buffers via socket2 to support 10Gbps+ micro-burst resilience

This commit is contained in:
ospab 2026-05-17 02:19:59 +03:00
parent ecba33e6d8
commit f0a93b4161
5 changed files with 25 additions and 9 deletions

12
Cargo.lock generated
View File

@ -745,7 +745,7 @@ checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381"
[[package]]
name = "ostp"
version = "0.1.55"
version = "0.1.56"
dependencies = [
"anyhow",
"base64",
@ -762,7 +762,7 @@ dependencies = [
[[package]]
name = "ostp-client"
version = "0.1.55"
version = "0.1.56"
dependencies = [
"anyhow",
"bytes",
@ -773,13 +773,14 @@ dependencies = [
"rand",
"serde",
"serde_json",
"socket2",
"tokio",
"tracing",
]
[[package]]
name = "ostp-core"
version = "0.1.55"
version = "0.1.56"
dependencies = [
"anyhow",
"async-trait",
@ -812,7 +813,7 @@ dependencies = [
[[package]]
name = "ostp-server"
version = "0.1.55"
version = "0.1.56"
dependencies = [
"anyhow",
"bytes",
@ -820,13 +821,14 @@ dependencies = [
"rand",
"serde",
"serde_json",
"socket2",
"tokio",
"tracing",
]
[[package]]
name = "ostp-tun-helper"
version = "0.1.55"
version = "0.1.56"
dependencies = [
"anyhow",
"chrono",

View File

@ -16,3 +16,4 @@ serde_json = "1.0"
json_comments = "0.2"
portable-atomic.workspace = true
chrono = "0.4"
socket2 = "0.6.3"

View File

@ -609,9 +609,14 @@ impl Bridge {
max_sent_history: 65536, // Greatly expanded to guarantee that oldest unacked packets are not prematurely popped and lost
})?;
let socket = UdpSocket::bind(&self.local_bind_addr)
.await
.with_context(|| format!("failed to bind local udp {}", self.local_bind_addr))?;
let addr = self.local_bind_addr.parse::<std::net::SocketAddr>().map_err(|e| anyhow::anyhow!("invalid bind addr: {}", e))?;
let domain = if addr.is_ipv6() { socket2::Domain::IPV6 } else { socket2::Domain::IPV4 };
let sock = socket2::Socket::new(domain, socket2::Type::DGRAM, Some(socket2::Protocol::UDP))?;
let _ = sock.set_recv_buffer_size(33554432); // 32MB
let _ = sock.set_send_buffer_size(33554432); // 32MB
sock.bind(&addr.into())?;
sock.set_nonblocking(true)?;
let socket = UdpSocket::from_std(sock.into())?;
if self.turn_enabled {
let turn_addr = if self.turn_server.contains(':') {

View File

@ -13,3 +13,4 @@ ostp-core = { path = "../ostp-core" }
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
rand.workspace = true
socket2 = "0.6.3"

View File

@ -116,7 +116,14 @@ pub async fn run_server(
}
});
let socket = UdpSocket::bind(&bind_addr).await?;
let addr = bind_addr.parse::<std::net::SocketAddr>().map_err(|e| anyhow::anyhow!("invalid bind addr: {}", e))?;
let domain = if addr.is_ipv6() { socket2::Domain::IPV6 } else { socket2::Domain::IPV4 };
let sock = socket2::Socket::new(domain, socket2::Type::DGRAM, Some(socket2::Protocol::UDP))?;
let _ = sock.set_recv_buffer_size(33554432); // 32MB
let _ = sock.set_send_buffer_size(33554432); // 32MB
sock.bind(&addr.into())?;
sock.set_nonblocking(true)?;
let socket = UdpSocket::from_std(sock.into())?;
let protocol_config = ProtocolConfig {
role: NoiseRole::Responder,
psk: [0u8; 32],