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

Allocator ba tầng của Go: mcache, mcentral, mheap và vì sao cấp phát nhỏ không cần khoá

Go cấp phát bộ nhớ qua ba tầng như tcmalloc: mcache mỗi P không khoá, mcentral có khoá, mheap khoá heap. Đo thật: cấp đối tượng nhỏ song song còn nhanh hơn một luồng (mcache per-P), cấp lớn song song chậm gấp 3 vì tranh khoá mheap. Và tiny allocator gộp đối tượng nhỏ. Go 1.23.

Lập trình Go 22/09/2026 10 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 11 phút

sync.Pool trong Go: cơ chế, bẫy làm nó chậm hơn, và vì sao GC dọn sạch nó

sync.Pool tái dùng object giữa các goroutine, nhưng không phải lúc nào cũng nhanh hơn. Đo thật: pool []byte khi buffer không thoát heap còn CHẬM hơn (compiler để stack + boxing); pool *bytes.Buffer khi object thật sự cấp phát thì nhanh 28%. Và GC dọn sạch pool sau hai chu kỳ. Go 1.23.

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

GC tricolor mark-sweep của Go: gom rác mà chỉ dừng chương trình 62 micro-giây

Bộ thu gom rác của Go chạy đồng thời với chương trình, dùng ba màu để đánh dấu object sống. Đo thật: 10 chu kỳ GC chỉ dừng chương trình tổng 0.62 ms (62 micro-giây mỗi lần), trong khi công việc nền chạy 111 triệu lần. Cơ chế tricolor và write barrier. Go 1.23.

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

Tinh chỉnh connection pool của database/sql trong Go: ba nút quyết định thông lượng

sql.DB không phải một kết nối — nó là một pool. Hiểu sai ba nút MaxOpenConns, MaxIdleConns, ConnMaxLifetime khiến app hoặc nghẽn cổ chai hoặc giết chết DB. Đo thật trong Go: cùng 1000 truy vấn, throughput đi từ 174 lên 8497 truy vấn mỗi giây khi chỉnh pool, và WaitCount về 0 khi đủ kết nối.