Answer-first: Go 1.26 ra mắt ba tính năng runtime mang tính bước ngoặt: Garbage Collector Green Tea (giảm từ 10–40% GC overhead), các cuộc gọi CGO (cgo calls) nhanh hơn khoảng ~30% cho các ứng dụng liên kết AI inference (suy luận AI), và một profile thử nghiệm về goroutine leak (rò rỉ goroutine) giúp phát hiện các goroutine bị block (khóa) vĩnh viễn thông qua phân tích khả năng tiếp cận của GC (GC reachability analysis).

Được phát hành vào tháng 02 năm 2026, Go 1.26 không phải là một bản vá lỗi thông thường. Nó làm thay đổi căn bản cách mà Go runtime quản lý bộ nhớ, tương tác với mã C, và làm nổi bật các lỗi đồng thời (concurrency bugs). Đối với các đội ngũ đang chạy Golang microservices ở quy mô lớn, những cải tiến này cộng dồn trên toàn bộ hệ thống (fleet) — mà không yêu cầu bạn phải thay đổi bất kỳ dòng code nào (zero code changes required).

Bài viết này trình bày những gì đã thay đổi, tại sao nó lại quan trọng đối với các hệ thống trên production, cách áp dụng nó, và những lưu ý trong quá trình nâng cấp.


1. Garbage Collector Green Tea: Quét Theo Trang (Page-Oriented Marking)

Answer-first: Green Tea thay thế chiến lược đánh dấu object-by-object (từng đối tượng một) truyền thống của Go bằng một chiến lược quét theo từng trang (page-oriented scanning). Việc này cải thiện độ tập trung của bộ nhớ đệm CPU (CPU cache locality), giảm bớt sự cạnh tranh danh sách công việc (work list contention), và hỗ trợ tính năng gia tốc AVX-512 vector — giúp giảm bớt từ 10–40% GC CPU overhead trong các khối lượng công việc thực tế.

Tại Sao GC Cũ Đã Đi Đến Giới Hạn

Trình dọn dẹp bộ nhớ (Garbage Collector - GC) dạng mark-sweep trước đây của Go tuân theo một đồ thị quét (graph flood) thẳng thắn: lấy một đối tượng (object) ra khỏi danh sách công việc (work list), quét các con trỏ (pointers) của nó, thêm các object mới được tìm thấy vào danh sách, và lặp lại. Vấn đề nằm ở cấu trúc vi mô (microarchitectural):

  • Cache thrashing (Băm bộ nhớ đệm): Hai object trỏ đến nhau không có gì đảm bảo chúng nằm gần nhau trong bộ nhớ. GC liên tục nhảy qua lại giữa các trang (pages), làm vô hiệu hóa luôn bộ nhớ đệm CPU (CPU caches).
  • Branch misprediction (Dự đoán sai nhánh): Mỗi hoạt động quét đều rất nhỏ, khó đoán trước, và phụ thuộc hoàn toàn vào lần quét trước đó — CPU không bao giờ có thể “nhìn trước” đủ xa để sử dụng luồng (pipeline) một cách hiệu quả.
  • Work list contention (Sự cạnh tranh trong danh sách công việc): Các luồng đánh dấu song song (Parallel marking threads) tất cả đều tranh giành nhau một hàng đợi object (queue of objects) dùng chung.

Các xu hướng phần cứng hiện đại làm cho điều này ngày càng trở nên tồi tệ hơn: truy cập bộ nhớ không đồng nhất (non-uniform memory access - NUMA), băng thông bộ nhớ trên mỗi lõi bị giảm sút, và ngày càng có nhiều cores (lõi) cạnh tranh cho cùng một trạng thái dùng chung (shared state).

Green Tea Hoạt Động Như Thế Nào

Insight (sự thấu hiểu) cốt lõi là đơn giản đến mức đánh lừa người ta: làm việc với các trang (pages), chứ không phải các object.

Thay vì theo dõi các object cá biệt trên danh sách công việc, Green Tea theo dõi các page (trang bộ nhớ) 8 KiB. Các object tích tụ lại trên một page trong khi nó chờ đợi trong hàng đợi FIFO (vào trước ra trước), sau đó GC quét nhiều object trong một lần lướt từ trái sang phải của bộ nhớ (single left-to-right memory pass) — khai thác tối đa tính địa phương không gian (spatial locality).

flowchart LR
    subgraph "Traditional GC (Object-by-Object)"
        A1[Object A] -->|jump| B1[Object B]
        B1 -->|jump| C1[Object C]
        C1 -->|jump| A2[Object D]
    end

    subgraph "Green Tea (Page-Oriented)"
        PA[Page A: scan 4 objects sequentially] --> PB[Page B: scan 2 objects sequentially]
        PB --> PA2[Page A again: scan 1 new object]
    end

Các cơ chế (Mechanics) chính yếu:

  1. Hai bit cho mỗi vị trí object (Two bits per object slot) — “seen” (đã thấy - tìm thấy con trỏ) và “scanned” (đã quét - object đã được xử lý xong). Sự khác biệt giữa hai bit này cho biết những object nào cần quét trong lượt đi qua page tiếp theo.
  2. Hàng đợi page FIFO (FIFO page queue) — các page tích lũy các object “đã thấy nhưng chưa quét” trong lúc chờ đợi, giúp tối đa hóa khối lượng công việc trên mỗi lần quét (work per pass).
  3. Các page có thể vào lại hàng đợi — Không giống như mark truyền thống nơi mỗi object được xếp hàng chính xác một lần, một page có thể xuất hiện lại nếu các con trỏ mới đến các object của nó được khám phá ra sau đó.

AVX-512 Vector Acceleration (Gia Tốc AVX-512 Vector)

Trên các dòng chip từ Intel Ice Lake / AMD Zen 4 trở lên, Green Tea sử dụng các thanh ghi véc-tơ (vector registers) 512-bit để xử lý siêu dữ liệu (metadata) của toàn bộ một page chỉ trong một vài câu lệnh (instructions):

  1. Tải các sơ đồ bit (bitmaps) “seen” và “scanned” vào hai thanh ghi 512-bit.
  2. Tính toán sự khác biệt (đưa ra bitmap active objects - các object đang hoạt động) chỉ với một lệnh XOR duy nhất.
  3. Mở rộng bitmap active objects thành một bitmap “active pointers” (con trỏ đang hoạt động) sử dụng lệnh VGF2P8AFFINEQB — một lệnh duy nhất thực hiện thao tác nhân ma trận (matrix multiplication) 8x8 bit trên mỗi byte.
  4. Lặp qua vùng bộ nhớ của page với bước nhảy 64 byte một lần, thu thập lại tất cả các live pointers (con trỏ còn sống).

Điều này mang lại thêm khoảng ~10% GC CPU giảm thiểu ngoài những cải tiến cơ bản mà Green Tea mang lại.

Tác Động Trong Thực Tế (Real-World Impact)

Số Đo (Metric)Trước Đây (Go 1.25)Hiện Tại (Go 1.26)Thay Đổi
GC CPU overhead (modal)Căn bản-10%Mức cải thiện điển hình
GC CPU overhead (heavy allocation - cấp phát mạnh)Căn bản-40%Kịch bản tốt nhất
GC pause time (Thời gian tạm ngưng p99)Căn bản~-35%Được báo cáo từ các đội ngũ production
Độ trễ trung bình (không đổi một dòng code nào)Căn bản~-6%Quan sát thực tế trên diện rộng (Fleet-wide observation)

Đối với một dịch vụ đang tiêu tốn 10% lượng CPU chỉ cho GC, mức độ cải thiện điển hình này sẽ chuyển hóa thành 1% tổng lượng sử dụng CPU được giảm bớt — nhân lên cho hàng trăm con pods, đó là một mức tiết kiệm chi phí cực kì chân thực.

Tắt Tính Năng (Opting Out - Nếu Cần)

# Tắt Garbage Collector Green Tea (tùy chọn tắt này sẽ bị loại bỏ trong phiên bản Go 1.27)
GOEXPERIMENT=nogreenteagc go build ./...

Nếu bạn quan sát thấy sự suy giảm (regressions), hãy gửi báo cáo lỗi (file an issue). Đội ngũ phát triển Go đặc biệt mong muốn nhận được phản hồi (feedback) thực tế từ production trước khi loại bỏ tùy chọn opt-out này trong phiên bản 1.27.


2. CGO Calls Nhanh Hơn 30%: Tại Sao Các Kỹ Sư AI Nên Quan Tâm

Answer-first: Go 1.26 làm giảm đi độ trễ cơ bản (baseline runtime overhead) của các cuộc gọi CGO (cgo calls) khoảng chừng 30%, giúp cho Go trở nên khả thi (viable) hơn đáng kể khi đóng vai trò làm lớp điều phối (orchestration layer) xung quanh các AI inference engines được viết bằng C/C++ như llama.cpp, ONNX Runtime, và TensorRT.

Điểm Nghẽn CGO (The CGO Bottleneck) Cho Các Khối Lượng Công Việc AI

Việc chạy Local LLMs (các mô hình LLM nội bộ) bằng Go thông thường đòi hỏi việc gọi vào (calling into) các C++ inference engines thông qua hệ thống cgo. Mỗi một cgo call sẽ phải gánh chịu độ trễ (overhead) từ:

  • Goroutine-to-thread context switch (Chuyển đổi bối cảnh từ goroutine sang luồng OS): M:N scheduler của Go bắt buộc phải ghim (pin) goroutine vào một OS thread (luồng hệ điều hành) trong toàn bộ thời gian diễn ra lời gọi C (C call duration).
  • Stack switching (Chuyển đổi Stack): Các goroutines của Go sử dụng segmented stacks (ngăn xếp phân đoạn); trong khi đó C code lại cần đến cấu trúc stack truyền thống.
  • Signal handling setup (Thiết lập quản lý tín hiệu): Bộ runtime sẽ tiến hành điều chỉnh các signal masks (mặt nạ tín hiệu) để phù hợp cho cái bối cảnh thực thi (execution context) của ngôn ngữ C.

Trong một hệ thống inference pipeline (đường ống suy luận) có thông lượng cao thực hiện hàng ngàn cgo calls nhỏ mỗi giây (cho công việc tokenization, embedding lookups, gọi các hàm attention layer), lượng overhead này cộng dồn lại thành một con số vô cùng khủng khiếp (compounds severely).

Có Gì Mới Đã Được Thay Đổi

Phiên bản Go 1.26 tối ưu hóa đường truyền cho cgo call (cgo call path) bằng cách giảm tải các thủ tục liên quan đến signal mask dư thừa, đồng thời làm mượt lại (streamlining) luồng chuyển giao tay (handoff) từ goroutine sang thread. Kết quả thu được là một mức giảm trơn tru ~30% per-call overhead (giảm 30% trên mỗi một call) — mà không bắt chúng ta phải thay đổi bất kì dòng code nào.

Tác Động Trong Thực Tế (Practical Impact)

Đối với một dịch vụ AI orchestration (điều phối AI) đang gọi llama.cpp cho nhiệm vụ token generation (tạo ra token):

// Trước bản Go 1.26: ~850ns overhead cho mỗi một cgo call
// Sau bản Go 1.26:  ~595ns overhead cho mỗi một cgo call (-30%)

// Cứ tính ở mức 10.000 cgo calls/giây (một mức bình thường cho quá trình streaming token generation):
// Trước đây: 8.5ms/giây thất thoát cho cgo overhead
// Hiện tại:  5.95ms/giây thất thoát cho cgo overhead
// Đã cứu lấy được: 2.55ms/giây — một con số có ý nghĩa rất lớn cho quá trình inference nhạy cảm với độ trễ

Điều này củng cố vị thế cho việc Go chính là ngôn ngữ lập trình tối ưu số một để xây dựng các API orchestration layers bao quanh lớp lõi là các inference engines viết bằng C++ thô sơ — thứ chính xác cũng là pattern mà chúng ta đang sử dụng cho Kiến trúc production AI swarm architecture của bản thân.


3. Goroutine Leak Detection (Phát hiện rò rỉ Goroutine) Thử Nghiệm

Answer-first: Go 1.26 giới thiệu thêm một tùy chọn pprof profile mang tên goroutineleak hoàn toàn mới, thứ mà sử dụng chính chức năng phân tích khả năng tiếp cận (reachability analysis) của Garbage Collector để dò ra các goroutines nào đang bị kẹt cứng mãi mãi (permanently blocked goroutines) — đó là những goroutines đang ngồi mòn mỏi chờ đợi trên các channels, mutexes, hoặc các sync primitives mà rốt cục là không bao giờ có thể được mở khóa (unblocked) lại.

Tính Năng Này Hoạt Động Như Thế Nào

Một sự rò rỉ goroutine (goroutine leaks) xảy ra khi nó bị block (kẹt cứng) ngay trên một điểm concurrency primitive (có thể là channel, mutex, hay cond) nhưng mà lối dẫn vào con đường “tỉnh giấc” (wake) của nó đã không còn có thể nào mà chạm tới được (unreachable) nữa. Hệ thống runtime truy lùng dấu vết này thông qua việc sử dụng chính Garbage Collector: nếu như cái primitive P (nơi mà con goroutine G kia đang bị tắc tịt lại) trở nên “unreachable” tính từ vị trí của mọi con goroutine nào khác vẫn đang trong trạng thái runnable (có thể chạy được), điều đó cũng có nghĩa con goroutine G kia vĩnh viễn không bao giờ có thể tự mình thức tỉnh.

// ❌ Ví dụ điển hình cho Goroutine leak: gửi vào kênh unbuffered nhưng bị dội trả early return từ sớm
func processWorkItems(ws []workItem) ([]workResult, error) {
    ch := make(chan result) // unbuffered (kênh không có bộ nhớ đệm)
    for _, w := range ws {
        go func() {
            res, err := processWorkItem(w)
            ch <- result{res, err} // sẽ bị kẹt vĩnh viễn nếu consumer đã chạy hàm return từ sớm mất rồi
        }()
    }

    var results []workResult
    for range len(ws) {
        r := <-ch
        if r.err != nil {
            return nil, r.err // dội early return → toàn bộ số goroutines còn lại bị rò rỉ (leak) toàn tập
        }
        results = append(results, r.res)
    }
    return results, nil
}

Ngay sau quá trình dội early return, đối tượng ch lúc này trở nên unreachable đối với tất cả những con goroutines khác đang hoàn toàn bình thường không bị rò rỉ. Garbage Collector sẽ dễ dàng đánh hơi ra được và báo cáo lại ngay các goroutines bị lọt sổ (leaked goroutines) trong cái mục báo cáo mới của nó (the new profile).

Cách Kích Hoạt (Enabling the Profile)

# Biến dịch (Build) với tùy biến đang thử nghiệm (experiment enabled)
GOEXPERIMENT=goroutineleakprofile go build ./...

Và ngay khi đã kích hoạt, bạn có thể nhảy vào truy cập tùy chọn cấu hình profile đó thông qua:

  • Gói runtime/pprof: pprof.Lookup("goroutineleak")
  • Đường dẫn HTTP endpoint: /debug/pprof/goroutineleak

Tích Hợp Vào Môi Trường Production

Sử dụng cho Các đợt triển khai Kubernetes thông qua GitOps, mọi người hoàn toàn có quyền mang cái nòng cốt này nhúng dính ngay vào cái bộ theo dõi observability stack của nội bộ luôn:

// Phơi bầy bộ đếm (count) goroutine leak dưới dạng một Prometheus metric
import "runtime/pprof"

func goroutineLeakCount() int {
    p := pprof.Lookup("goroutineleak")
    if p == nil {
        return 0 // do chưa thiết đặt cấu hình (profile not enabled)
    }
    return p.Count()
}

Chủ động kích hoạt hệ thống cảnh báo (alerts) trong trường hợp số lượng bộ đếm đó nhảy lố qua ngưỡng giới hạn cho phép (threshold) — cách này giúp ta “tóm” gọn các dòng lệnh rò rỉ rác dữ liệu còn sớm lăm rắp trước cả khi chúng kịp làm nổ tung bằng OOM kills (Mã lỗi văng exit code 137). Nếu tò mò về toàn cục của vòng lặp thao tác gỡ rối (debugging workflow), mọi người xem ngay Hướng Dẫn Dò Tìm Rò Rỉ Goroutine (goroutine leak detection) Trực Tiếp Trên Production.

Một Vài Mặt Giới Hạn

  • Tính năng chỉ mới quét tìm thấy được mấy phần lỗi rò rỉ (leaks) ngay tại điểm cái vật bị block (blocking primitive) có dấu hiệu trở thành “GC-unreachable”. Nếu có tồn tại những biến tổng (Global variables) hay mấy tay long-lived goroutines (goroutines sống thọ dai dẳng) mà vẫn khư khư ôm rịt chộp giữ lại mấy cái references (tham chiếu) thì cái lỗi leaks sẽ rành rành được che dấu khuất lấp đi mất.
  • Đảm bảo bằng 0 phần bị tiêu phí (Zero runtime overhead) trong cái bối cảnh là khi không phải chủ đích quét thông tin chủ động (not actively profiling).
  • Chỉ mới đóng vai ở diện chạy thể nghiệm kiếm thêm hồi đáp ý kiến (experimental for API feedback) — còn thật sự mà nói phần trí tuệ tư duy để xử lý bắt lệnh dò tìm (detection logic) kia thực sự đã được đẽo gọt vô cùng tinh gọn chuẩn chỉ dùng trên nền production-ready (Đóng góp tới từ tác giả Vlad Saioc của Uber).
  • Lên lịch chính thức sẽ trở thành tùy chọn bật sẵn vào luôn chế độ mặt định (default) ở thời điểm phát hành cho bản Go 1.27.

4. Những Tính Năng Đáng Chú Ý Khác Nằm Trong Phiên Bản Go 1.26

Tính Năng (Feature)Chức Năng Của NóTác Động Sức Ảnh Hưởng (Impact)
Ký hiệu cú pháp mới new(expr)Hàm new giờ đây tiếp nhận lấy biểu thức (expression) ngay bên trong coi như tham số khởi tạoSạch sẽ sáng sửa dễ đọc hơn thay vì cái kiểu khai báo rườm rà (optional field initialization) khi làm việc với protobuf, JSON
Self-referential type constraints (Tự ràng buộc nội quy định danh)type Adder[A Adder[A]] interface{}Nâng tầm Generics mạnh tay khét lẹt hơn
Mở rộng năng lực đại tu của go fixThêm một chục dòng modernizers đi đánh tráo cập nhật đống code lên tới chuẩn ngôn ngữ thành ngữ (idioms) hiện đại bậc nhấtTiện ích gói gọn lại quy về chỉ cần xài một câu lệnh là đủ di dời nhảy qua dùng chung đống API láng cóng
crypto/hpkeHybrid Public Key Encryption (Mã Hoá Key Khai Công Kết Hợp Mới RFC 9180)Ứng dụng luôn KEMs vào giai đoạn thời kỳ hậu lượng tử học
simd/archsimd (thể nghiệm)Các phép toán liên quan tính SIMD cho tuỳ dòng chuẩn kiến trúc (amd64)128/256/512-bit thông qua kiểu vector
runtime/secret (thể nghiệm)Nền tảng Secure erasure chuyên lo đi thanh lý mớ thông tin cryptographic temporariesTrợ sức Forward secrecy trên nền của Go
errors.AsType[T]Chuẩn Generic, bảo đảm an toàn về kiểu dữ liệu khi tháo lớp error unwrappingThao tác gỡ rối xử lý errors trông mạch lạc trơn tru lại làm rất mau lẹ
io.ReadAll optimizationChạy lẹ tăng cường thêm tới 2× tốc độ, dẹp sạch đi mức độ hao hụt chừng ~50% của memoryAi đang xài Go cũng hưởng xái lợi lộc này
Chế độ trộn địa chỉ gốc bộ nhớ ngẫu nhiên (Heap base address randomization)Căn chuẩn trộn xào ngẫu nhiên thứ tự lúc Heap Start trên bộ nền 64-bitKhóa cứng thêm tính an toàn Security hardening dành khi CGO
Cơ chế gọi cấp phát Compiler stack cho phần tử slicesHàng lô lốc các phần tử thuộc slices bây giờ nghiễm nhiên nằm yên trong phần stackHao tốn cấp phát bên bãi đất heap (Fewer heap allocations) giảm rõ

5. Cẩm Nang Hướng Dẫn Di Dời (Migration Guide): Chuyển Lên Từ Bản Go 1.25

Các Món Cần Chuẩn Bị (Pre-Upgrade Checklist)

# 1. Soi phiên bản Go hiện đang chạy ở nhà
go version

# 2. Tuốt lại cấu trúc của file go.mod (Bản Go 1.26 sẽ đẩy cái giá trị mặc định cho module xuống go 1.25.0)
go get go@1.26

# 3. Kích hoạt nguyên dàn xe go fix modernizers làm mới hệ thống
go fix ./...

# 4. Kiểm định test lại cặn kẽ cùng phiên bản Garbage Collector Green Tea GC đích danh
GOEXPERIMENT=greenteagc go test ./...

# 5. Khởi động bài chạy benchmark lấy mức vạch xuất phát cho các chỉ số GC
go test -bench=. -benchmem -count=5 ./... > bench-1.25.txt
# Sau đó ngay khi đã up lên xong xuôi:
go test -bench=. -benchmem -count=5 ./... > bench-1.26.txt
benchstat bench-1.25.txt bench-1.26.txt

Mấy Lời Răn Đe Chú Tâm (Things to Watch)

  1. Các thư viện đóng gói tính năng chuyên về tinh chỉnh mảng Ảnh chụp (Image processing libraries): nguyên phần image/jpeg encoder/decoder chính thức thay máu lột xác triệt để trọn bộ. Trong mọi trường hợp nếu phía người xài mà có dính chặt thiết yếu về chuẩn kết xuất bắt phải hệt từng hạt bit một bit-for-bit output, ráng nán xíu vác đi dò kĩ lại (validate).
  2. Khâu bóc tác rã chuỗi bị hư URL parsing: API lệnh net/url.Parse từ rày chối từ dội lại mấy anh URLs mang có cái dấu dính 2 chấm (colons) lấp lửng trong khúc tên miền host (Ví dụ điển hình, http://::1/). Cứ mạnh dạn đưa vô cái ngoặc móc (brackets) nếu đang đụng chạm với hàng gốc gác từ IPv6.
  3. Luật cấm cản Bootstrap requirement: Bảng xuất Go 1.26 kì này khẩn thiết kêu réo cho một chiếc nền gạch cơ sở có lót của Go 1.24.6+ mồi móng cho tiến độ của thao tác cấu hình lúc đầu (bootstrap).
  4. Hệ sinh thái bên macOS: Phát đạn Go 1.26 là phát súng tuyên án là phiên bản khép lại dứt điểm có châm chước tiếp ứng mang (supporting) cho hệ OS macOS 12 Monterey.
  5. Mái nhà của Windows/arm (Nền tảng của cấu trúc 32-bit): Khai tử sạch banh từ A kéo đến Z dọn gọn gàng trơn láng.

Chiến Thuật Chuyển Chế Độ Cuốn Chiếu Nối Gót Bên Trong Kubernetes (Kubernetes Rolling Upgrade Strategy)

Đứng trên cái vai người gánh trọng trách đối mặt vào Kho quản nhiệm cài cắm từ ArgoCD (ArgoCD-managed deployments):

# Can thiệp sửa lại hệ thông số file cấu trúc Dockerfile base image
FROM golang:1.26-alpine AS builder

Thả rông bung từ từ theo cách bủa vây (canary deployment) — chớ rời mắt khỏi cái đồng hồ đo của đống thông số (metrics) của hệ GC (/sched/pauses/total/gc:seconds, chốt sổ thêm luôn mấy hàng hệ đo đoạt mới tinh bên nhánh /sched/goroutines metrics) gắm dành trên tay con máy của canary trước thời điểm mạnh dạn hô thúc còi ấn lệnh đưa tất đi (promoting). Trong cái trường hợp rủi đâu mà cái cụm mạng máy của đội hỗ trợ (supports) chức năng dán tiếp nóng cho Pod là In-Place Pod Resizing, thì mọi thứ còn tuyệt cú mèo khi người chủ quản thao tác trực tiếp luân chuyển qua lại biên độ phần chóp chịu đựng năng lượng (resource limits) của bản live chạy trong đúng tại giai đoạn làm phép trên canary phase mà chẳng làm nhọc thêm động thái đem nài bóp phải bắt tắt toàn mạng lưới vận hành để xoay xở đẩy lại (rolling the entire deployment).


Câu Hỏi Thường Gặp (FAQ)

Thực chất Garbage Collector Green Tea của bên Go 1.26 là món gì thế?
Bộ Green Tea GC đơn giản gọi cho dễ là một thứ phiên bản rác thu (mark-sweep garbage collector) cực hiện đại đã tự mang luôn vinh dự dính liền nằm vùng chọn sẵn về mặc định (default) nằm ngụ trong thân Go 1.26. Nó phá băng hoàn toàn thói quen gõ đi soi dò lấy cái đồ bỏ (objects individually) cứ đi vào mà bới theo truyền thống lâu nay (traditional graph flood), thế mà, đi một lối rất ư là khác biệt tiến lên rạch ròi bằng phân mảnh gom theo khung kích cỡ 8 KiB (page-oriented) rồi đưa đẩy thồn thẳng một dọc dính vào bộ hàng chờ để giải nén dọn cỏ (work queue) để rồi lôi tọt bao la hằng hà cơ man nào là object theo trong từng cái dải page đó đi bằng những lần càn quyét một dọc thẳng dài tuốt tụt ở đường xá chạy dọc (sequential memory passes). Và như vậy hiệu suất bòn rút ra được đó là CPU cache có điểm trúng đích cao (locality) cộng chung cùng tính hỗ trợ nạp pháo AVX-512 vector siêu thần tốc, rút xả được con số nằm trong khúc dải từ 10–40% tiêu phá lố từ phía GC CPU trên thực địa trận tiền làm việc thực tiễn (real workloads). Con đồ chơi này đã từng “đẻ” mang mác là chỉ đồ cho chơi thể nghiệm thử ở Go 1.25 giờ đã hóa trâu vượt vũ môn ra thành thứ quái vật chuẩn xịn mang đóng vô kho chuẩn hàng (production-proven) xài cỡ y xì như bên hàng tá mảng miếng to đùng của Google.
Đo sao để biết phần cgo calls rốt cục đã bức tốc kinh khủng thêm cỡ nào trong lõi Go 1.26?
Hãng cho ra Go 1.26 vặn tay siết rẽ nhánh trảm được mức thời gian hao mòn dư thừa nền lúc gọi lôi cgo calls hụt luôn xấp xỉ mức tới là 30%. Con số làm xiêu lòng kia diễn ra trên đà trơn láng mặc định (automatic) chả có làm phiền cực công đụng đến hàng code viết bằng tay thợ (no code changes). Riêng thứ đồ quý này lại đem hiệu lực vô vàn cho mớ con cưng Go mang nhiệm vụ phải ngoắc (calling) kéo bằng tay với mấy tên mảng lính lác bên khối C/C++ AI inference (llama.cpp, ONNX Runtime) dẫu rằng dĩ vãng thì cả ngàn nhát chọc cgo qua lại trên đà một giây lúc nào cũng bị kêu ca đẻ oặn thêm những cái mức độ nặng trĩu chậm chạp mòn hao tới cực kì thấy rõ đo trên con đo độ trễ (latency overhead).
Con hàng của bản Go 1.26 lấy cách nào để đi săn dò mấy dòng bị rò rỉ (detect goroutine leaks)?
Khoảng Go 1.26 trình bộ pprof chuyên thử nghiệm lận túi cái thẻ bài mang nhãn danh goroutineleak (được xới bật thông dụng bằng hàm biến cấu trúc lệnh GOEXPERIMENT=goroutineleakprofile). Tính ra kỹ xảo ngón nghề thì dùng bộ phán đoán do thám độ với (reachability analysis) mang mác hiệu Garbage Collector: chốt một con goroutine là xui xẻo đứng mắc kẹt lại chốt cứng trên vùng cái đập mương bị tắc (channel) hay cổng khóa chặt cấm cửa (mutex) thứ mà đã hoàn toàn trở qua vùng dập tịt không thấy tăm hơi bóng ma đâu cản bước mọi anh tài dân chúng chạy mỏi mòn runnable goroutines, thế thì sẽ ghi giấy tống trảm báo danh rò nước ngầm rỉ rã (leaked). Thằng ngốc này cũng biết cư xử điệu đà tốn 0 cái đồ phần hao công tốn phí sức lực lúc cắm chẳng lôi nó ra soi bắt bệnh (not actively profiled) hứa hẹn đồn râm ran một lời dự đắc suất có mặc định chễm chệ ngay lúc phát thông báo cập nhật đợt Go 1.27.
Liệu tôi có bị bắt buộc phải gồng để mà up ngay tắp lự lên cho kịp chuyến tàu đi cùng Go 1.26 tức thì?
Dĩ nhiên, ừ thì phần lớn trường hợp (most teams). Dàn Garbage Collector mang tên Green Tea và các món ngon cgo gọi vùn vụt sẽ ập xuống rót vào phần cải thiện siêu sức vóc chạy chẳng cần đụng thò tay cấu trấu sửa chữa lấy một con mã số nào cả (zero code changes). Khẽ đánh móng gõ câu gọi go fix ./... thò một tay vào đem ôm xài hết một nạm đồ thành ngữ xịn sò chớp lẹ, đo đếm trắc chuẩn xem sao với lại phần bung nhịp đài canh cho (canary). Nhưng cớ mà chỉ cần khẽ hẩy chút sự đề phòng rủi ro gánh lấy cớ (caution) xem có khi dính dáng chi mấy mớ hàm in chép bản cho cấu kết phần ruột từ loại hệ quả ngốn dữ liệu loại y xì lấy ra đúng (exact) từ phía thằng image/jpeg hoặc nhúng lệnh bóc chuỗi khét lẹt mấy dòng url không đúng khung (malformed URLs) đem dán lấy mấy anh có địa chỉ dính số khung rành IPv6 thì hẵng cố dò xét và (test those paths first) đi bước đó đầu đã.
Vậy tôi hoàn toàn muốn 'che cửa' tắt cái công cụ mang danh Green Tea GC do dính một mớ thứ nó khùng khùng lên (causes issues)?
Tất nhiên rồi bạn: mang ghép chuỗi biến dịch lệnh với GOEXPERIMENT=nogreenteagc. Tiếc xíu, cánh cửa để làm lối thoát tót hiểm này (opt-out) chực chờ một đao phế bỏ ngay nhịp vào lúc mà cập bến của bản Go 1.27 tới đây. Kể mà mắt thấy tay sờ bị phát hiện hiện tượng sụt lún ngầm (regressions), mang đưa tay lên gõ làm cái phiếu thưa dọn (file an issue) chỉ thẳng đích danh cái mục ở điểm đến go.dev/issue/new — rành mạch đội kỹ thuật phía sảnh Go khát khao nhận thỉnh thị từ chiến trường mang mác (production feedback) chớ đi vào lột dẹp cái lối cửa rút tọt vội vàng kia kìa (escape hatch).