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

Async preemption trong Go: vì sao một vòng lặp for{} từng treo cả chương trình

Trước Go 1.14, một goroutine chạy vòng lặp chặt không gọi hàm có thể độc chiếm processor mãi mãi. Bài này đo thật: cùng một for{} vô hạn, bật async preemption thì main quay lại được (exit 0), tắt thì treo tới timeout (exit 124). Kèm cơ chế cắt bằng tín hiệu. Go 1.23.

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

GOMAXPROCS trong container: vì sao Go hiểu taskset nhưng bỏ qua --cpus, và cách sửa

Go đặt GOMAXPROCS theo số CPU nó nhìn thấy — nhưng trong Kubernetes, giới hạn CPU thường là CFS quota mà Go 1.23 không đọc. Đo thật: Go nhận biết affinity (taskset thành NumCPU 2) nhưng khi GOMAXPROCS thừa so với CPU thực, chuyển ngữ cảnh cưỡng bức tăng gấp 4 lần. Go 1.23.

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

Hàng đợi chạy cục bộ và toàn cục trong Go: vì sao mỗi P có queue riêng 256 slot

Bộ lập lịch Go không dùng một hàng đợi chung. Mỗi P giữ hàng đợi cục bộ lock-free tối đa 256 goroutine, cộng một hàng đợi toàn cục có khoá cho phần tràn. Đo thật bằng schedtrace: local queue không bao giờ vượt 256, global phình tới hàng vạn nhưng không bị bỏ đói. Go 1.23.

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

Đọc GODEBUG=schedtrace trong Go: giải mã trạng thái bộ lập lịch không cần thư viện

schedtrace là công cụ số một để nhìn vào bộ lập lịch Go. Bài này giải mã từng trường của một dòng SCHED thật, và theo dõi vòng đời một run qua bốn snapshot — từ lúc goroutine dồn vào hàng đợi cục bộ tới khi mọi core bận. Kèm cách đọc để chẩn đoán nút thắt. Go 1.23.