🚀 Enhancement Request: Optimizing "mode: full" Performance and Stability in Large-Scale GAS Deployments
I am using MasterHttpRelayVPN in mode: full with a multi-account architecture to bypass restrictions. My setup is as follows:
- Architecture:
Client > 7x Google Apps Script (GAS) Deployments (using 7 distinct Google accounts) > Node Nginx > Tunnel Container.
- Concurrency: Utilizing parallel dispatching with a factor of 2-3 across these 7 deployments.
📉 The Problem: Bottleneck in Client Dispatching
Despite distributing the load across 7 independent GAS deployments, I am observing high latency and frequent connection timeouts. The current implementation of the Rust client seems to struggle with managing these concurrent requests efficiently, particularly when the network or Google's endpoints face momentary congestion.
The logs consistently show long RTT spikes leading to os error 10060. Instead of failing over to other healthy GAS deployments, the client appears to wait for the stalled request to time out, which creates a "blocking" effect that degrades the entire tunnel's performance.
Log evidence:
2026-04-26T15:20:32.688953Z INFO batch: 1 ops → AKfycbwA, rtt=21.0450168s
2026-04-26T15:20:32.688974Z WARN batch failed: io: A connection attempt failed ... (os error 10060)
2026-04-26T15:20:34.877856Z INFO batch: 1 ops → AKfycbwA, rtt=21.0389911s
2026-04-26T15:20:34.877877Z WARN batch failed: io: A connection attempt failed ... (os error 10060)
💡 Suggested Optimizations
To effectively utilize parallel deployments and resolve these bottlenecks, I suggest the following refactorings:
1. "Fail-Fast" Dispatcher & Timeout Logic
Waiting 21 seconds for a batch to fail is unacceptable for real-time traffic.
Proposal: Implement a configurable request_timeout (e.g., 5-8 seconds). If a request to a specific GAS Deployment ID exceeds this limit, the client should treat it as a failure, mark that deployment as "temporarily degraded," and offload the batch to the next available deployment immediately.
2. Deployment Health-Scoring System
With 7 deployments in use, the client needs better awareness of backend health.
Proposal: Introduce a simple scoring or weight system for the Deployment ID list. If a deployment triggers a timeout, it should be penalized (cooldown period) and removed from the rotation for a few minutes. This prevents the client from repeatedly hitting a throttled or slow account.
3. Optimized Flush Interval (Batch Muxer)
Proposal: The current batching logic appears to be too conservative, contributing to unnecessary latency. Please make max_batch_size and flush_interval tunable parameters. For mode: full, we need a more aggressive flush strategy to ensure that traffic is not unnecessarily queued when RTT is high.
4. Persistent Connection Pooling
Proposal: Ensure that the Rust HTTP client (using reqwest or hyper) is configured to maintain keep-alive connections to all 7 GAS endpoints. Currently, if the client performs a new TLS handshake for every batch request across 7 accounts, the overhead is massive. Maintaining persistent TCP tunnels to each Google front-end is critical for performance.
🏁 Conclusion
The current multi-account setup shows great potential, but the client-side dispatching logic is holding it back by treating all endpoints as equally reliable regardless of their real-time performance. Implementing these changes will transform mode: full into a much more stable and responsive tunneling solution.
I am highly motivated to help test these changes. Please let me know if you are open to a PR or need further debugging information.
🚀 Enhancement Request: Optimizing "mode: full" Performance and Stability in Large-Scale GAS Deployments
I am using
MasterHttpRelayVPNinmode: fullwith a multi-account architecture to bypass restrictions. My setup is as follows:Client > 7x Google Apps Script (GAS) Deployments (using 7 distinct Google accounts) > Node Nginx > Tunnel Container.📉 The Problem: Bottleneck in Client Dispatching
Despite distributing the load across 7 independent GAS deployments, I am observing high latency and frequent connection timeouts. The current implementation of the Rust client seems to struggle with managing these concurrent requests efficiently, particularly when the network or Google's endpoints face momentary congestion.
The logs consistently show long RTT spikes leading to
os error 10060. Instead of failing over to other healthy GAS deployments, the client appears to wait for the stalled request to time out, which creates a "blocking" effect that degrades the entire tunnel's performance.Log evidence: