Load Testing Kubernetes: Resolving bottlenecks and improving performance (Part 2)

Bài tóm tắt Achievers 2023 3. Quy mô lớn Độ khó: Trung bình

Achievers · 2023 · 3. Quy mô lớn · Độ khó: Trung bình — bài gốc

Phần 2; phần 1 (dựng framework, baseline, threshold theo SLO): Achievers 2023.

Bối cảnh

  • Sau khi có baseline, đội đặt mục tiêu cho từng tiêu chí (throughput, lỗi, latency, scale) và dựng dashboard New Relic để thấy nút thắt ngay trong lúc chạy test.

Thay đổi chính

Mỗi nút thắt tìm được là một chỗ khác nhau trong hệ, đúng như danh sách dưới:

  • Throughput — cân bằng tải gRPC: gRPC giữ kết nối TCP sống lâu, nên khi autoscale thêm pod thì client vẫn bám pod cũ; có pod gần như không nhận request. Đổi DestinationRule của Istio từ round-robin sang LEAST_REQUEST (Envoy chia sẻ số request đang xử lý) → phân phối đều, throughput tăng rõ ở mọi service.
  • Lỗi — nằm ở bộ sinh tải: VM GCP không có IP ngoài đi qua Cloud NAT; khi bơm tải từ một project GCP khác, egress chạm trần cổng và báo OUT_OF_RESOURCES. Sửa bằng thêm IP và tăng số cổng cho mỗi đích; hướng dài hạn là IPv6 (kế hoạch 2024).
  • Latency — thử cấu hình Istio: đổi số worker thread của Envoy (2, 4, 6) không đem lại khác biệt đáng kể; ghi lại như một thử nghiệm âm tính.
  • Latency — code dùng chung: connector DB dùng lock để chuyển schema trước mỗi query, thêm latency cho mọi service dùng nó; sửa bằng ghi tên schema thẳng vào query. Một endpoint cũ trong monolith hơn 10 giây được tối ưu query xuống mức mili giây.
  • Cache: chuyển ảnh sang CDN; Redis ở vài namespace quan trọng vượt limit bộ nhớ của Kubernetes và bị OOM, sửa bằng tăng request. Theo Achievers, Redis không nên là phụ thuộc bắt buộc nhưng service nào dựa nhiều vào cache thì hiệu năng tụt mạnh khi Redis bão hoà.
  • Scale — giới hạn IP: dải IP pod chia theo max_pods_per_node giới hạn số node (ví dụ dải /21, mỗi node /24 → tối đa 8 node), nên cụm có thể không scale được dù còn quota; sửa dải IP.
  • Scale — topologySpreadConstraints với DoNotSchedule cho service quan trọng, buộc cụm thêm node sớm khi các node đã có pod; cùng chỉnh ngưỡng autoscale, cụm scale "hiệu quả hơn 10 lần" (theo bài, không nói rõ cách đo).

Vì sao

  • Kết quả: đạt mọi mục tiêu, không vi phạm SLO lỗi/latency; throughput gấp 4, đủ để một region gánh traffic failover khi region kia sự cố (theo Achievers, 2023).

Bài học cho SWE

  • Load test lộ ra nút thắt ở những lớp không ai nghĩ tới khi viết code: cấu hình cân bằng tải mặc định, dải IP đặt lúc tạo cụm, NAT của bộ sinh tải. Đây là các "mặc định của nền tảng" (mẫu 34 trong Lộ trình từ đơn giản đến phức tạp).
  • Kiểm bộ sinh tải trước khi kết luận về hệ thống: lỗi có thể đến từ phía client.
  • Kết nối sống lâu (gRPC, HTTP/2) cần cân bằng theo request chứ không theo kết nối.

Liên quan