Locust load test qua proxy tĩnh dân cư Việt Nam

Locust (Python) phù hợp khi bạn mô phỏng user HTTP và cần script linh hoạt. Nhiều API / storefront Việt Nam trả kết quả khác theo geo; nếu worker Locust chạy từ IP nước ngoài, bạn đo nhầm latency và tỉ lệ lỗi. Gắn proxy tĩnh dân cư VN giúp toàn bộ request của swarm đi ra cùng exit IP — dễ whitelist và so sánh run-to-run.

Chỉ load test hệ thống bạn sở hữu hoặc được phép. Tôn trọng rate limit và cửa sổ bảo trì.

Khi nào Locust cần IP tĩnh VN?

  • Đo API nội địa chỉ mở cho IP Việt Nam đã khai báo.
  • So sánh p95 trước/sau deploy với cùng điều kiện geo.
  • Staging bắt buộc whitelist một IP nguồn — IP xoay phá rule firewall giữa các wave.
  • Thu thập evidence: mọi request trong report cùng exit IP.

Thông số đã xác nhận

Proxy tĩnh dân cư Việt Nam: 1.000đ/ngày hoặc gói 30 ngày 30.000đ; Viettel / VNPT / FPT; HTTP hoặc SOCKS5; mạng dân cư thật, IP sạch. Xem: proxy tĩnh Việt Nam. Checker: check-proxy.

Chuẩn bị env

bash
export HTTP_PROXY='http://USER:PASS@HOST:PORT' export HTTPS_PROXY="$HTTP_PROXY" export EXPECTED_EXIT_IP='x.x.x.x' curl -x "$HTTP_PROXY" --max-time 25 https://api.ipify.org echo

Cài Locust:

bash
python -m venv .venv && source .venv/bin/activate pip install locust

Cách 1: env HTTP_PROXY / HTTPS_PROXY (đơn giản)

Nhiều phiên bản Locust / urllib3 tôn trọng biến môi trường proxy. Export trước khi chạy:

bash
export HTTP_PROXY='http://USER:PASS@HOST:PORT' export HTTPS_PROXY="$HTTP_PROXY" locust -f locustfile.py --host https://api.example.vn

Verify bằng task đầu tiên gọi ipify (xem dưới) — đừng tin proxy đã gắn cho đến khi thấy đúng exit IP.

Cách 2: gắn proxy trên HttpSession trong Locust

python
import os from locust import HttpUser, task, between PROXY = os.environ["HTTP_PROXY"] # http://USER:PASS@HOST:PORT EXPECTED = os.environ["EXPECTED_EXIT_IP"] class VnApiUser(HttpUser): wait_time = between(1, 3) def on_start(self): self.client.proxies.update({ "http": PROXY, "https": PROXY, }) # verify một lần mỗi user r = self.client.get("https://api.ipify.org", name="ip_check") if r.text.strip() != EXPECTED: r.failure(f"exit IP lệch: {r.text.strip()}") @task(5) def list_products(self): self.client.get("/api/products", headers={"Accept-Language": "vi"}) @task(1) def health(self): self.client.get("/healthz")

Chạy headless:

bash
locust -f locustfile.py --headless -u 20 -r 5 -t 3m --host https://api.example.vn

Giữ số user vừa phải trên một IP dân cư — residential không phải pipe datacenter. Tăng dần -u sau khi đo latency ổn.

Distributed workers

Mỗi worker process cần cùng HTTP_PROXY / secrets. Trên master:

bash
locust -f locustfile.py --master --expect-workers 2

Trên worker:

bash
export HTTP_PROXY='http://USER:PASS@HOST:PORT' export HTTPS_PROXY="$HTTP_PROXY" export EXPECTED_EXIT_IP='x.x.x.x' locust -f locustfile.py --worker --master-host=MASTER_IP

Đừng để một nửa worker quên proxy — report sẽ trộn IP local và IP VN.

HTTP vs SOCKS5

  • Locust dựa requests/urllib3: HTTP proxy phổ biến nhất.
  • SOCKS5: cần requests[socks] / PySocks và URL socks5://... — thử kỹ trước buổi test chính thức.
  • Nếu SOCKS lỗi, dùng HTTP từ panel hoặc tunnel local.

Đọc kết quả có ý thức geo

  • So p50/p95 với baseline cùng IP tĩnh (không so với run từ cafe Wi-Fi nước ngoài).
  • Tách failure do proxy (407, connect timeout) khỏi failure app (5xx).
  • Ghi exit IP + thời điểm ICT vào note của report.

Lỗi thường gặp

  • 407: thiếu USER:PASS trong URL proxy.
  • Max retries exceeded: hết hạn gói hoặc HOST sai — curl lại.
  • IP local trong ip_check: proxies chưa gắn hoặc task dùng client khác.
  • Latency cao bất thường: giảm -u; residential có jitter — chạy đủ dài để p95 ổn định.

Gợi ý vận hành

  • Một proxy tĩnh cho một suite load test staging VN.
  • Không commit credential; dùng CI secrets.
  • Proxy xoay (5.000đ/ngày, 26.000đ/tuần, 69.000đ/tháng) khi cần nhiều IP; test whitelist một IP thì giữ tĩnh.
  • Trước run dài: check-proxy.

Locust + proxy tĩnh dân cư VN giúp load test phản ánh đúng đường đi từ IP Việt Nam và giữ exit IP cố định giữa các lần đo.