Lập trình 22/09/2026 6 phút

runtime/metrics: quan sát goroutine, heap và GC từ bên trong app Go — bắt rò rỉ goroutine tại chỗ

Metric ứng dụng (phần 3-6) cho biết dịch vụ thế nào, nhưng runtime Go bên dưới cũng cần quan sát: bao nhiêu goroutine đang sống, heap lớn bao nhiêu, GC chạy mấy lần và dừng thế giới bao lâu. Bài này đo thật bằng gói runtime/metrics: sinh 5000 goroutine + cấp phát 1.3GB, thấy goroutines 1→5001, 27 lần GC, 0.70ms STW; rồi thả ra thấy goroutines về 1 — chính là cách bắt rò rỉ goroutine, một trong những lỗi Go nguy hiểm nhất.

Lập trình 22/09/2026 10 phút

Tail latency WebSocket dưới 10.000 kết nối đo thật: 50 client không đọc làm hub không deadline đứng hẳn, deadline 1 giây đẩy p99 lên 2 giây, cấp phát 1 KB mỗi client đẩy p99 từ 45 lên 115 ms dù GC chỉ dừng 2 ms, GOGC 400 làm p99.9 tệ hơn

Server Go fan-out 100 vòng 1 KB tới 10.000 client, 1.000.000 mẫu độ trễ mỗi lần chạy, đo p50, p99, p99.9, max trước và sau từng cách sửa. Nền: p99.9 59 ms. 50 client không đọc với shard không write deadline: hub đứng ở vòng 22, 1.169 mẫu trễ 20 giây. Thêm deadline 1 giây: p99 2.016 ms, max 5.039 ms. Kênh riêng từng client: p99.9 50 ms. Cấp phát bản sao 1 KB cho từng client cộng rác nền 100 MB/s: GC dừng tổng 2,3 ms nhưng p99 115 ms, p99.9 148 ms. GOGC 400: p99 71 nhưng p99.9 251 ms và RSS 870 MB. Bỏ cấp phát trong đường nóng: p99.9 49 ms. GOMAXPROCS 2: p50 34,9 thay vì 20,4 ms.