Mobile proxy concurrency planning for 2026
Mobile proxy concurrency planning for 2026
Mobile proxy concurrency planning is what stops your team from buying too few ports and watching jobs queue, or buying too many ports and bleeding cash. Get this right at procurement time and your ops are smooth for the contract term. Get it wrong and either the work piles up or you end up paying for unused capacity. This guide gives you sizing models, formulas, and worked examples for common 2026 workloads.
For pricing implications of concurrency choices, pair this with the TCO worksheet. For protocol context, see what is a mobile proxy.
what concurrency means for mobile proxies
Concurrency, in the mobile proxy context, is the number of simultaneous TCP connections (or HTTP requests) the proxy can carry without performance degrading. It is bounded at three layers: the per-port limit, the per-account limit, and the per-modem physical limit.
A mobile modem (the LTE module behind a port) has finite radio resources. A 4G modem typically supports 50-100 simultaneous TCP connections before performance degrades. A 5G modem can support more. Above the limit, latency spikes, packets drop, or the radio renegotiates the cell connection. The vendor caps per-port concurrency below the modem’s hard limit to leave headroom for stability.
| concurrency layer | typical limit | who controls |
|---|---|---|
| per-port | 20-50 | vendor, configurable |
| per-account | 50-200 (sum across ports) | vendor, contractual |
| per-modem (physical) | 50-150 | radio, immutable |
| target-imposed | 1-20 per IP | target site rate limits |
The smallest of these binds you. For most workloads in 2026, target-imposed limits are the binding constraint, not the proxy. A target site that throttles after 5 requests/second per IP makes per-port concurrency above 5 useless.
the concurrency planning formula
The general formula:
required_ports = ceil(
target_requests_per_second / per_port_safe_rate
)
per_port_safe_rate = min(
vendor_per_port_concurrency,
target_per_ip_rate_limit,
your_app_throughput_per_request_per_second
)
The three caps are vendor, target, and your app. The vendor cap might be 30 concurrent connections per port. The target cap might be 5 requests/second. Your app might serialize at 2 useful requests/second per worker. Take the smallest.
Applied: if you need to scrape 100 product pages/second on Shopee, and Shopee throttles at ~3 RPS per IP, you need approximately 34 ports.
five workloads, five capacity profiles
Different workloads have very different concurrency profiles. Same target site, different jobs, can need very different port counts.
profile 1: continuous scraper
Always-on scraper that pulls a steady stream of pages. Throughput requirement: average + 30% headroom.
| input | example value |
|---|---|
| daily pages target | 2 million |
| target rate limit | 3 RPS per IP |
| useful work / response | 1 page |
| ports needed | ceil(2M / 86400 / 3) = 8 |
| with 30% headroom | 11 ports |
profile 2: burst scraper
Runs for 2 hours every night, peak rate during that window.
| input | example value |
|---|---|
| nightly pages target | 1 million |
| window | 2 hours |
| target rate limit | 3 RPS per IP |
| ports needed | ceil(1M / 7200 / 3) = 47 |
| with 30% headroom | 61 ports |
The burst job needs 5x more ports than the continuous job for the same daily volume.
profile 3: account warmer
Logs into accounts, simulates human behavior, holds session for 30+ minutes.
| input | example value |
|---|---|
| accounts to maintain | 50 |
| session duration each | 30 minutes |
| concurrent active | 10 (rotating) |
| ports needed | 10 (one per active session) |
Account warmers do not benefit from concurrency above the active-session count.
profile 4: ad verification
Hits ads on real sites, verifies creative, checks placement.
| input | example value |
|---|---|
| ads to verify daily | 5,000 |
| time per verification | 8 seconds |
| useful concurrency | 4 per port (heavy pages) |
| ports needed | ceil(5000 * 8 / 86400 / 4) = 1.2 -> 2 |
| with peaks during ad placements | 4-5 |
profile 5: cyber threat intel
Pulls threat feeds, malware samples, dark-leaning sites with anti-bot.
| input | example value |
|---|---|
| daily fetches | 50,000 |
| target rate limit | varies, often 1 RPS |
| retry overhead | 1.5x |
| ports needed | ceil(50000 * 1.5 / 86400) = 1 -> 3 |
Adjust upward if any single fetch is large or session-bound.
comparison: undersizing vs oversizing
| consequence | undersizing | oversizing |
|---|---|---|
| direct cost | cheap | expensive |
| operational | jobs queue, pages drop | unused capacity |
| sla breaches | rate-limited, errors | none |
| growth headroom | requires emergency add | absorbs spikes |
| typical annual impact | -15% to -40% throughput | +10% to +30% bill |
Undersizing is the more dangerous failure. Bills can be cut next month; missed pages are gone forever.
headroom planning
Always size with headroom. The right amount depends on workload variance.
| variance | headroom | notes |
|---|---|---|
| stable continuous load | 20-30% | covers daily fluctuation |
| weekly cycle (e.g. weekend spike) | 30-50% | covers peak day |
| campaign-driven (e.g. e-commerce sales) | 50-100% | covers known spikes |
| event-driven (e.g. news, drops) | 100%+ or burstable | covers unknowable spikes |
For variable workloads, prefer a vendor with burstable plans over a flat plan. Even at higher list price, burstable wins on TCO when you have variance.
per-port limits in practice
Vendor-stated per-port concurrency is the upper bound, not the real-world ceiling. Real-world ceiling depends on target site response size and whether the target throttles.
A small JSON API response (5KB, fast turnaround) might let you saturate 30 concurrent connections per port. A large product page (500KB with images, 8-second total time) saturates a single connection’s bandwidth and the radio’s capacity earlier. On heavy pages, useful concurrency per port is often 3-5 even if the vendor allows 30.
| target type | typical per-port useful concurrency |
|---|---|
| small JSON API | 20-30 |
| static HTML | 10-15 |
| heavy ecom page | 3-5 |
| logged-in app | 1-2 |
| video or heavy media | 1-2 |
Test your specific target during the POC to find the real number.
scaling architecture
Once you have a port count, design how your jobs distribute across them.
worker pool
import asyncio
import aiohttp
import random
PORTS = [
{"id": 1, "url": "http://u:p@gw1.example.com:8001"},
{"id": 2, "url": "http://u:p@gw1.example.com:8002"},
# ... up to N
]
async def worker(queue, port):
async with aiohttp.ClientSession(
connector=aiohttp.TCPConnector(limit=5)
) as session:
while True:
target = await queue.get()
try:
async with session.get(target, proxy=port["url"], timeout=20) as r:
body = await r.text()
handle_result(target, port, r.status, body)
finally:
queue.task_done()
async def main(targets, concurrency_per_port=5):
queue = asyncio.Queue()
for t in targets:
queue.put_nowait(t)
workers = [
asyncio.create_task(worker(queue, port))
for port in PORTS
for _ in range(concurrency_per_port)
]
await queue.join()
for w in workers:
w.cancel()
This gives you N ports x M concurrency per port. Tune M based on target type.
round-robin vs sticky assignment
Two strategies for distributing requests across ports.
| strategy | when |
|---|---|
| round-robin | rotating workloads, no session state |
| sticky (consistent hash) | sessions, account warmers, logins |
For sticky, hash the account ID (or session ID) modulo port count to always route a session to the same port. This preserves cookies, IP affinity, and request patterns the target expects from one user.
def pick_port(session_id):
return PORTS[hash(session_id) % len(PORTS)]
monitoring concurrency in production
Three metrics to track:
- mean concurrency per port (over 5-min windows)
- p95 concurrency per port
- peak concurrency observed
If p95 is at the vendor’s per-port limit, you are running out of headroom. Add ports before peak grows further.
metric | port_1 | port_2 | port_3 | ...
mean concurrency | 4.2 | 4.1 | 4.3 |
p95 concurrency | 8.0 | 8.5 | 7.9 |
peak concurrency | 12 | 14 | 11 |
target peak | 30 | 30 | 30 |
headroom | 60% | 53% | 63% |
concurrency and bandwidth interaction
High concurrency consumes bandwidth quickly. A 50 concurrent connection workload at 100 KB/response and 5 RPS each uses 25 MB/s, or 90 GB/hour. Pair the concurrency plan with the bandwidth planning guide.
| concurrency | response size | RPS each | bandwidth/hour |
|---|---|---|---|
| 10 | 50 KB | 2 | 3.6 GB |
| 30 | 100 KB | 3 | 32 GB |
| 50 | 200 KB | 5 | 180 GB |
| 100 | 500 KB | 10 | 1800 GB |
A workload that sounds modest in concurrency terms can blow your bandwidth budget if response sizes are large.
concurrency for special cases
cdn and edge-cached targets
Some targets respond from CDN edge. The same IP hitting the same edge will see consistent latency but cached content. Higher concurrency works well here because the target is doing little work.
authenticated apis
API targets that gate by API key, not by IP, do not throttle on per-IP concurrency. You can run high per-port concurrency without target-side issues. The vendor’s per-port cap is the binding constraint.
sticky-session workloads
If your workload requires sticky sessions (login, multi-step checkout, account warming), per-port concurrency is irrelevant. You need one port per concurrent session. Plan port count = peak concurrent sessions.
decision matrix
Use the matrix below to translate workload type to concurrency plan.
| workload | concurrency planning method | typical ports |
|---|---|---|
| continuous scrape | average + 30% | 10-30 |
| burst scrape | peak window + 30% | 30-100 |
| API throughput | sum of RPS / per-port RPS | 5-20 |
| account warmer | active session count | 10-50 |
| ad verification | (jobs * time) / (window * concurrency) | 2-10 |
| sneaker drop | exact concurrent slots needed | 50-500 |
changing concurrency mid-contract
Most vendors allow scaling concurrency up but make it painful to scale down. Negotiate flexibility at signing.
Sample contract clauses:
Customer may add ports during the contract term at the per-port rate
plus pro-rated monthly fee. Customer may remove ports with 30 days
notice; removed ports cease billing on the next month boundary. Customer
may temporarily increase concurrency on existing ports up to 2x for
up to 7 days per month at no additional cost.
The 2x temporary burst is the most underused concession. Vendors will agree to it because they have headroom in their pool. You get a stress safety valve without buying for peak.
sizing exercise template
WORKLOAD: ____________________
Target site(s): ____________________
Target rate limit (RPS per IP): ____
Useful concurrency per port (from POC): ____
Avg requests per second I need: ____
Peak requests per second I need: ____
Headroom %: ____
Calculated ports = ceil(peak_RPS / per_port_safe_rate * (1 + headroom))
= ceil(___ / ___ * ___)
= ___ ports
Account-level concurrency = ports * per_port_concurrency = ____
Confirm against vendor account cap.
Bandwidth budget = ports * avg_RPS * avg_response_size * 86400 / day
= ___ GB/day
= ___ GB/month
Confirm against bandwidth plan.
Fill out one of these per workload. Sum across workloads to get account total.
vendor capacity questions to ask
| question | what answer should look like |
|---|---|
| per-port concurrency limit | specific number, e.g. 30 |
| account concurrency cap | sum of all ports allowed |
| temp burst allowed | yes, X% over Y duration |
| how is excess concurrency handled | queued / rejected with 429 / new connection refused |
| can a single port saturate the modem | yes when above N concurrent |
| do per-port limits include both HTTP and SOCKS5 | yes / no |
faq
Q: Should we buy ports for peak or for average? A: For peak +20-30%. Underbuying for peak leads to rate-limit failures during the moments that matter most.
Q: Can we share ports across workloads? A: Technically yes, operationally risky. Each workload may have different session needs. Tag traffic and segregate logically.
Q: What if our target rate-limits below 1 RPS? A: You need many ports. This is the case for high-anti-bot targets. Concurrency plan focuses on port count, not per-port concurrency.
Q: Does mobile network speed cap real concurrency? A: Yes. A modem on 4G LTE typically peaks at 50-150 Mbps. Concurrent heavy responses share that bandwidth.
Q: How does port count interact with success rate? A: More ports usually means more diversity, which improves success rate. But beyond a certain count, marginal benefit drops. Track success rate as you scale and stop when it plateaus.
For a Singapore vendor that publishes per-port concurrency limits, supports temp burst, and lets you scale ports monthly, see SMP. Or check the pricing page for port-based plans.