Đo Bandwidth Thực Tế Qua Proxy Với CPython và cURL
5 tháng 10, 2026
Vì sao cần đo bandwidth thật qua proxy
Nhiều team chọn proxy dựa trên quảng cáo “tốc độ cao” nhưng khi triển khai scraping hoặc tải file, tốc độ thực tế lại khác. Proxy residential, datacenter và mobile có độ trễ khác nhau. Một IP có thể ổn định nhưng bị giới hạn throughput, hoặc bị nhà cung cấp giới hạn theo phiên. Nếu không đo đúng, bạn có thể:
- Chọn sai vùng địa lý cho tác vụ tải file lớn.
- Ước tính sai thời gian hoàn thành job scraping.
- Thiết kế queue và concurrency không đúng, gây nghẽn.
- Trả phí cho proxy không phù hợp với workload.
Mục tiêu của bài này là xây dựng cách đo bandwidth thực tế qua proxy bằng các phương pháp đơn giản nhưng kiểm soát được sai số.
Nguyên tắc đo đúng
Đo bandwidth qua proxy khác với đo tốc độ máy chủ. Bạn cần phân biệt ba lớp:
- Tốc độ mạng giữa client và proxy.
- Tốc độ mạng giữa proxy và đích.
- Giới hạn throughput của proxy.
Để đánh giá proxy, bạn nên tải một tệp từ cùng một server đích qua nhiều proxy khác nhau. Các yếu tố cần kiểm soát:
- Cùng một file hoặc nội dung có kích thước xác định.
- Cùng một endpoint, tránh CDN trả về node khác nhau.
- Bật TLS nếu ứng dụng thực tế dùng HTTPS.
- Chạy nhiều lần để loại nhiễu.
- Ghi lại thời gian, kích thước, số byte thực nhận và trạng thái HTTP.
Một sai lầm phổ biến là chỉ tải file 1MB rồi kết luận. File quá nhỏ khiến thời gian handshake, TLS và DNS chiếm tỷ trọng lớn, làm kết quả không đại diện.
Chọn file test phù hợp
Bạn nên dùng ba nhóm kích thước:
- Nhỏ: 1–5MB để đo độ trễ và thời gian bắt đầu nhận dữ liệu.
- Trung bình: 50–100MB để đo throughput ổn định.
- Lớn: 200–500MB nếu proxy cho phép, để phát hiện giới hạn sau một thời gian tải.
Nếu server có hỗ trợ Range, bạn có thể tải từng đoạn thay vì tải lại toàn bộ file. Điều này giúp kiểm soát kích thước chính xác và tránh tốn băng thông.
Đo bằng cURL
cURL là công cụ tốt để kiểm tra nhanh vì nó hiển thị thời gian từng giai đoạn. Bạn có thể dùng time để lấy thống kê JSON hoặc text.
Ví dụ tải qua proxy HTTP
curl -o /dev/null \
--proxy http://user:pass@proxy.example:8080 \
--silent --show-error \
-w \
'{"http_code":%{http_code},"total_time":%{time_total},"t_starttransfer":%{time_starttransfer},"size_download":%{size_download},"speed_download":%{speed_download},"remote_ip":%{remote_ip}}\n' \
https://speedtest.example.com/files/100mb.bin
Các trường quan trọng:
time_total: thời gian tổng.time_starttransfer: thời gian đến byte đầu tiên.size_download: số byte thực tải.speed_download: tốc độ trung bình.remote_ip: IP đích, giúp kiểm tra có đúng server không.
Nếu dùng proxy SOCKS5, thay bằng --proxy socks5://.... Nếu cần TLS qua proxy, cURL sẽ thực hiện tunnel khi tải HTTPS.
Lặp nhiều lần
Bạn nên chạy ít nhất 3 lần với mỗi proxy và lấy trung vị. Ví dụ:
for i in 1 2 3; do
curl -o /dev/null \
--proxy http://user:pass@proxy.example:8080 \
--silent \
-w '%{time_total} %{size_download} %{speed_download}\n' \
https://speedtest.example.com/files/100mb.bin
sleep 2
done
Tránh chạy liên tục quá nhanh vì có thể làm nóng kết nối, tạo cache hoặc kích hoạt giới hạn tốc độ.
Đo bằng Python
Python cho phép ghi log chi tiết, tính throughput tức thời và so sánh nhiều proxy. Dưới đây là ví dụ dùng requests với streaming để không tải toàn bộ file vào bộ nhớ.
Cài đặt
pip install requests
Hàm đo bandwidth
import time
import requests
from typing import Dict
PROXIES = {
"http": "http://user:pass@proxy.example:8080",
"https": "http://user:pass@proxy.example:8080",
}
URL = "https://speedtest.example.com/files/100mb.bin"
def measure_bandwidth(url: str, proxies: Dict[str, str]) -> Dict[str, float]:
start = time.perf_counter()
first_byte_time = None
total = 0
with requests.get(url, proxies=proxies, stream=True, timeout=30) as r:
r.raise_for_status()
for chunk in r.iter_content(chunk_size=1024 * 1024):
if not chunk:
continue
if first_byte_time is None:
first_byte_time = time.perf_counter()
total += len(chunk)
end = time.perf_counter()
ttfb = first_byte_time - start if first_byte_time else end - start
total_time = end - start
speed_mbps = (total * 8 / 1_000_000) / total_time if total_time else 0
return {
"bytes": total,
"total_time_sec": total_time,
"ttfb_sec": ttfb,
"speed_mbps": speed_mbps,
}
Chạy so sánh nhiều proxy
import statistics
proxy_list = [
{"http": "http://user:pass@proxy1.example:8080", "https": "http://user:pass@proxy1.example:8080"},
{"http": "http://user:pass@proxy2.example:8080", "https": "http://user:pass@proxy2.example:8080"},
]
results = []
for p in proxy_list:
runs = []
for _ in range(3):
res = measure_bandwidth(URL, p)
runs.append(res["speed_mbps"])
results.append((p["http"], statistics.median(runs)))
for proxy, median in results:
print(proxy, median)
Cách này phù hợp khi bạn cần tích hợp vào pipeline đánh giá proxy tự động.
Kiểm soát sai số TLS và DNS
Nếu ứng dụng thực tế dùng HTTPS, bạn bắt buộc phải đo qua HTTPS. TLS handshake có thể chiếm vài chục đến vài trăm millisecond. Với file nhỏ, chi phí này làm giảm tốc độ trung bình. Vì vậy, bạn nên ghi lại cả time_starttransfer hoặc ttfb để tách phần khởi tạo kết nối.
Một số lưu ý:
- Nếu proxy hỗ trợ CONNECT, HTTPS sẽ được tunnel qua proxy. Bạn không cần cấu hình thêm nếu dùng HTTP proxy chuẩn.
- Nếu dùng SOCKS5, DNS có thể được resolve phía proxy hoặc phía client tùy cấu hình. Hãy kiểm tra bằng
ipinfohoặc endpoint định vị IP. - Nếu test qua CDN, hãy cố gắng dùng URL trực tiếp hoặc tham số để chọn cùng một edge server nếu có thể.
So sánh residential, datacenter và mobile
Ba loại proxy thường cho kết quả khác nhau:
- Datacenter: thường có bandwidth cao, độ trễ thấp, phù hợp tải file lớn, API, load test.
- Residential: có thể ổn định nhưng throughput dao động theo nhà cung cấp và vị trí.
- Mobile: phù hợp mô phỏng mạng di động, nhưng tốc độ và độ ổn định thường thấp hơn.
Bạn không nên dùng một con số duy nhất để đánh giá. Hãy tạo bảng gồm:
- Trung vị tốc độ MB/s.
- P95 thời gian tải.
- Tỷ lệ lỗi.
- TTFB trung vị.
- Số lần bị giới hạn tốc độ hoặc timeout.
Ví dụ bảng đánh giá
Giả sử bạn tải file 100MB từ cùng một server:
| Proxy | TTFB trung vị | Tốc độ trung vị | P95 thời gian | Lỗi |
|---|---|---|---|---|
| DC-US | 0.18s | 48 MB/s | 2.9s | 0% |
| RES-VN | 0.65s | 9 MB/s | 14s | 2% |
| MOB-ID | 1.4s | 3.2 MB/s | 38s | 8% |
Kết luận: nếu tác vụ là tải dữ liệu lớn, datacenter có thể phù hợp hơn. Nếu cần mô phỏng người dùng di động, mobile proxy lại là lựa chọn đúng dù tốc độ thấp.
Xử lý giới hạn tốc độ và jitter
Một số proxy giới hạn throughput theo phiên hoặc theo IP. Bạn có thể gặp hiện tượng: tốc độ cao lúc đầu, sau đó giảm dần. Cách xử lý:
- Tải nhiều lần với khoảng nghỉ.
- Ghi lại tốc độ theo thời gian thực.
- Nếu tốc độ giảm mạnh, đổi proxy hoặc session.
- Dùng sticky session nếu cần giữ trạng thái, nhưng nên có cơ chế chuyển sang IP mới khi băng thông kém.
Bạn có thể phát hiện giới hạn bằng cách so sánh ba lần tải liên tiếp. Nếu lần ba giảm hơn 30% so với trung vị hai lần đầu, hãy đánh dấu proxy đó không ổn định cho tải nặng.
Khi nào không nên chỉ dựa vào bandwidth
Bandwidth chỉ là một chỉ số. Với scraping, độ ổn định, tỷ lệ thành công, khả năng vượt rate limit và chất lượng IP có thể quan trọng hơn tốc độ tải. Với ad verification hoặc SERP monitoring, bạn cần đúng vùng địa lý và kết quả nhất quán. Với multi-account, bạn cần tránh phát hiện liên kết giữa các tài khoản.
Tuy nhiên, với các tác vụ sau, bandwidth là yếu tố chính:
- Tải dataset lớn.
- Tải video hoặc ảnh.
- Load test.
- Đồng bộ file.
- Kiểm tra hiệu năng CDN.
Checklist thực hành
Trước khi chọn proxy cho workload nặng, bạn nên:
- Chọn file test có kích thước phù hợp với dữ liệu thực.
- Chạy tối thiểu 3 lần với mỗi proxy.
- Ghi TTFB, thời gian tổng, số byte và tốc độ.
- So sánh cùng một server đích.
- Kiểm tra cả HTTP và HTTPS nếu ứng dụng dùng HTTPS.
- Loại trừ proxy có tỷ lệ lỗi cao hoặc jitter lớn.
- Lưu kết quả để theo dõi theo thời gian.
Đo đúng bandwidth giúp bạn tránh quyết định dựa trên cảm giác và chọn proxy phù hợp với mục tiêu thật: tiết kiệm chi phí, tăng độ tin cậy và đạt hiệu năng hệ thống.