Mở endpoint pprof rồi lấy profile trực tiếp từ tiến trình đang chạy — không cần dựng lại tải trên máy dev.
import _ "net/http/pprof" // đăng ký handler vào DefaultServeMux
go func() {
// cổng nội bộ, KHÔNG mở ra internet
log.Println(http.ListenAndServe("127.0.0.1:6060", nil))
}()go tool pprof http://127.0.0.1:6060/debug/pprof/profile?seconds=30 # CPU
go tool pprof http://127.0.0.1:6060/debug/pprof/heap # heap
go tool pprof -http=:8081 profile.out # xem flame graphChọn loại profile theo triệu chứng:
- CPU cao → profile (lấy mẫu 30s). Đọc top, rồi list <hàm> để thấy dòng nào tốn.
- RAM tăng dần → heap. Dùng -inuse_space để xem cái gì đang giữ bộ nhớ, -alloc_space để xem cái gì cấp phát nhiều nhất từ đầu. Rò rỉ thường lộ ra khi so hai heap profile cách nhau vài phút (-base).
- Số goroutine tăng không giảm → goroutine, xem stack đang kẹt ở đâu.
- Latency cao nhưng CPU thấp → block và mutex (phải bật runtime.SetBlockProfileRate / SetMutexProfileFraction), hoặc trace bằng go tool trace.
Lưu ý vận hành: endpoint pprof để lộ dữ liệu nội bộ và cho phép ai cũng lấy profile — luôn đặt sau cổng nội bộ hoặc middleware xác thực, đừng gắn vào mux công khai của service. Chi phí lấy mẫu CPU khoảng vài phần trăm, chấp nhận được trong một cửa sổ ngắn.