- #go
- #concurrency
- #goroutine-leak
- #context
Sai lầm Go khiến production sập: rò rỉ goroutine và context bị bỏ quênGo Pitfalls That Crash Production: Goroutine Leaks and Forgotten Context
Cách phát hiện và sửa rò rỉ goroutine, đảm bảo context được truyền đúng trong Go, giúp dịch vụ ổn định hơn.How to detect and fix goroutine leaks and missed context propagation in Go, keeping your services stable.
Mục lụcContents· 8
Bạn đã bao giờ thấy service Go của mình tăng dần RAM và cuối cùng chết vì “out of memory” chưa? Thông thường nguyên nhân không phải bộ nhớ leak của object mà là goroutine leak – những luồng nhẹ bị tạo ra nhưng không bao giờ kết thúc. Thêm vào đó, nếu bạn quên truyền context.Context vào các hàm con, các goroutine sẽ không nhận được signal dừng khi request hủy, làm tình hình tồi tệ hơn. Bài viết này sẽ chỉ cho bạn cách phát hiện, ngăn chặn và sửa các lỗi này bằng các mẫu Go chuẩn như errgroup và worker‑pool.
Nguyên nhân phổ biến#
- Tạo goroutine trong vòng lặp mà không có điều kiện dừng rõ ràng. Khi một request bị hủy, các goroutine vẫn tiếp tục chạy.
- Quên truyền
contextvào hàm phụ trợ. Khictx.Done()được kích hoạt, các hàm con không biết và không thể dừng công việc. - Sử dụng
time.Tickhoặctime.AfterFuncmà không dừng chúng khi request kết thúc, dẫn đến các ticker tiếp tục gửi tín hiệu.
Cách phát hiện#
- runtime.NumGoroutine() – In ra số goroutine hiện tại mỗi khi một endpoint được gọi; nếu số này không giảm, có khả năng rò rỉ.
- pprof – Khởi động HTTP
/debug/pprof/goroutine?debug=2để xem stack trace của mọi goroutine đang chạy.
