mirror of
https://github.com/therealaleph/MasterHttpRelayVPN-RUST.git
synced 2026-05-17 21:24:48 +03:00
tune: lower coalesce/settle step from 40 → 10 ms, raise tunnel-node settle max to 1 s (#674)
The batch coalesce step controls how long the client (and the
tunnel-node's straggler settle) waits between checking for more ops
to pack into the same batch. At 40 ms the wait was conservative —
good for packing uploads but needlessly slow on the download path
where the tunnel-node round-trip, not coalescing, is the bottleneck.
Lowering the step to 10 ms means we fire batches almost immediately
when there's nothing else queued, cutting ~30 ms of dead air on
every download-dominated round-trip. When both sides DO have data
in flight (uploads, bursty page loads), the adaptive reset still
works: each arriving op resets the 10 ms step timer, so a rapid
burst naturally coalesces up to the 1 s hard cap without wasting
quota on many small batches.
In short: don't wait when there's nothing to wait for; batch
aggressively when there is.
Client side:
- DEFAULT_COALESCE_STEP_MS 40 → 10 ms
- DEFAULT_COALESCE_MAX_MS unchanged at 1000 ms
Tunnel-node side:
- STRAGGLER_SETTLE_STEP 40 → 10 ms (matches client step)
- STRAGGLER_SETTLE_MAX 500 → 1000 ms (more room to pack
straggler responses when upstream targets reply at different
speeds — saves Apps Script quota on the return leg)
Users who prefer the old behaviour can set "coalesce_step_ms": 40
in config.json.
Co-authored-by: yyoyoian-pixel <279225925+yyoyoian-pixel@users.noreply.github.com>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -96,7 +96,7 @@ data class MhrvConfig(
|
||||
val verifySsl: Boolean = true,
|
||||
val logLevel: String = "info",
|
||||
val parallelRelay: Int = 1,
|
||||
val coalesceStepMs: Int = 40,
|
||||
val coalesceStepMs: Int = 10,
|
||||
val coalesceMaxMs: Int = 1000,
|
||||
val upstreamSocks5: String = "",
|
||||
|
||||
@@ -210,7 +210,7 @@ data class MhrvConfig(
|
||||
put("verify_ssl", verifySsl)
|
||||
put("log_level", logLevel)
|
||||
put("parallel_relay", parallelRelay)
|
||||
if (coalesceStepMs != 40) put("coalesce_step_ms", coalesceStepMs)
|
||||
if (coalesceStepMs != 10) put("coalesce_step_ms", coalesceStepMs)
|
||||
if (coalesceMaxMs != 1000) put("coalesce_max_ms", coalesceMaxMs)
|
||||
if (upstreamSocks5.isNotBlank()) {
|
||||
put("upstream_socks5", upstreamSocks5.trim())
|
||||
@@ -422,7 +422,7 @@ object ConfigStore {
|
||||
verifySsl = obj.optBoolean("verify_ssl", true),
|
||||
logLevel = obj.optString("log_level", "info"),
|
||||
parallelRelay = obj.optInt("parallel_relay", 1),
|
||||
coalesceStepMs = obj.optInt("coalesce_step_ms", 40),
|
||||
coalesceStepMs = obj.optInt("coalesce_step_ms", 10),
|
||||
coalesceMaxMs = obj.optInt("coalesce_max_ms", 1000),
|
||||
upstreamSocks5 = obj.optString("upstream_socks5", ""),
|
||||
passthroughHosts = obj.optJSONArray("passthrough_hosts")?.let { arr ->
|
||||
|
||||
Reference in New Issue
Block a user