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

View File

@ -16,3 +16,4 @@ serde_json = "1.0"
json_comments = "0.2" json_comments = "0.2"
portable-atomic.workspace = true portable-atomic.workspace = true
chrono = "0.4" 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 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) let addr = self.local_bind_addr.parse::<std::net::SocketAddr>().map_err(|e| anyhow::anyhow!("invalid bind addr: {}", e))?;
.await let domain = if addr.is_ipv6() { socket2::Domain::IPV6 } else { socket2::Domain::IPV4 };
.with_context(|| format!("failed to bind local udp {}", self.local_bind_addr))?; 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 { if self.turn_enabled {
let turn_addr = if self.turn_server.contains(':') { 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 = { version = "1.0", features = ["derive"] }
serde_json = "1.0" serde_json = "1.0"
rand.workspace = true 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 { let protocol_config = ProtocolConfig {
role: NoiseRole::Responder, role: NoiseRole::Responder,
psk: [0u8; 32], psk: [0u8; 32],