Bài viết mới nhất

Tổng 2300 bài
Lập trình 22/09/2026 11 phút

Chứng chỉ và chuỗi tin cậy đo thật: tự dựng CA rồi làm hỏng từng thứ, Go và curl chặn đủ 5 biến thể nhưng Go gộp ba lỗi vào một câu, lệch giờ 2 ngày biến chứng chỉ chưa hiệu lực thành hợp lệ, chuỗi RSA nặng 1.908 byte và bắt tay chậm gấp 2,5 lần

Dựng CA gốc, CA trung gian và chứng chỉ leaf bằng crypto/x509, rồi phục vụ 7 biến thể trên 7 cổng: đúng, thiếu intermediate, sai SAN, hết hạn, chưa hiệu lực, tự ký, và chuỗi RSA. Client Go, curl và openssl s_client cùng chặn đủ 5 biến thể hỏng, nhưng Go báo thiếu intermediate, tự ký và sai root bằng cùng một câu unknown authority, còn OpenSSL cho mã 20, 18, 20. Đẩy đồng hồ client lên 2 ngày thì chứng chỉ chưa hiệu lực được chấp nhận. Chuỗi ECDSA P-256 server gửi 860 byte, bắt tay p50 0,54 ms; chuỗi RSA 1.908 byte, 1,34 ms. Kèm cách đọc lỗi và việc phải làm khi copy nhầm file.

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

Key exchange và cipher suite đo thật: P-521 tốn CPU gấp 4,6 lần X25519, chữ ký RSA-2048 gấp 4,3 lần, HelloRetryRequest cộng đúng một RTT, AES-GCM nhanh hơn ChaCha20 bảy lần khi có lệnh AES nhưng chậm hơn sáu lần khi không có

Chín server Go với từng key exchange, chứng chỉ và phiên bản, 1.000 bắt tay mỗi cấu hình: X25519 230 µs CPU server, P-256 200 µs, P-384 520 µs, P-521 1.060 µs, Kyber lai thêm 70 µs và 1.228 byte ClientHello, chữ ký RSA-2048 đẩy server lên 990 µs, TLS 1.2 ECDHE không đắt hơn 1.3. HRR tốn thêm một ClientHello và đúng 52 ms dưới netem 50 ms. Thông lượng 2 GiB qua tls.Conn: AES-128-GCM 4.523 MB/s, ChaCha20 993 MB/s; tắt lệnh AES bằng GODEBUG thì AES còn 168 MB/s với CPU gấp 26 lần, ChaCha gần như không đổi, và TLS 1.3 tự đổi sang ChaCha20. Có số primitive Go và OpenSSL.

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

GROUP BY đo thật: DuckDB gom nhóm bằng bảng băm một lượt O(N) thay vì sắp xếp, nên trên 20 triệu dòng gộp 10 nhóm mất 15 ms còn một triệu nhóm mất 363 ms vì chi phí tăng theo số nhóm, và hash aggregation nhanh hơn sắp xếp toàn bộ 8 lần

DuckDB thực hiện GROUP BY bằng hash aggregation một lượt O(N), không sắp xếp dữ liệu trước. Đo thật trên 20 triệu dòng: gộp theo cột 10 nhóm mất 15,1 ms, 1000 nhóm 27,1 ms, một triệu nhóm 362,7 ms, vì chi phí tăng theo số nhóm khác nhau chứ không chỉ số dòng. GROUP BY nhiều khoá làm số tổ hợp nhóm bùng lên, ba khoá cho gần một nhóm mỗi dòng và mất 3738 ms. Hash aggregation một triệu nhóm mất 309 ms so với sắp xếp toàn bộ 2491 ms, nhanh hơn 8 lần vì tránh chi phí O(N log N).

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

Xử lý lỗi trong gRPC: status code chuẩn và rich error details — để client xử lý đúng thay vì đoán chuỗi

Trả lỗi bằng một chuỗi text buộc client phải đoán và regex — mong manh và dễ vỡ. gRPC có bộ status code chuẩn hoá (NotFound, InvalidArgument, Unavailable...) để client rẽ nhánh đúng, và rich error details để gửi lỗi CÓ CẤU TRÚC. Bài này đo thật trong go-lab: Get id không tồn tại trả NotFound, id âm trả InvalidArgument; và Create với input xấu trả về danh sách field vi phạm (email, age) để client đọc type-safe thay vì parse câu lỗi.

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

cgroups v2 giới hạn CPU đo thật: --cpus=0.5 đặt cpu.max 50000/100000 chứ không giấu bớt lõi, một khối việc 6 giây phình thành 77 giây ở --cpus=0.2, nproc vẫn báo đủ 10 lõi host, cpu.stat cho thấy luồng bị ghìm 50 trên 51 chu kỳ

cgroups giới hạn cái container dùng, khác namespace cô lập cái nó thấy. --cpus=X đặt cpu.max = quota/period: --cpus=0.5 là 50 ms chạy mỗi 100 ms rồi bị ghìm. Nhưng nproc vẫn báo đủ 10 lõi host, nên Go đặt GOMAXPROCS=10 và Java tính pool theo 10 lõi. Một luồng busy 5 giây ở --cpus=0.5 chỉ chạy 2,55 giây, bị ghìm 50 trên 51 chu kỳ, chờ 2,5 giây dù host rảnh, đọc qua cpu.stat. Cùng khối việc 6 giây chạy như nhau ở 1, 2 hay unlimited CPU nhưng thành 12 giây ở 0.5 và 77 giây ở 0.2. Một request 1 giây CPU biến thành 12 giây.

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

Bắt tay TLS 1.3 đọc từng record: ClientHello 1.474 byte vì Kyber, 12 record và 1 RTT, TLS 1.2 tốn thêm đúng 50 ms một RTT dưới netem, session ticket cắt 539 byte và chữ ký nhưng không cắt RTT, còn 0-RTT đưa request tới server sớm hơn 50,7 ms

Client Go ghi từng record TLS: TLS 1.3 đầy đủ gửi 1.583 byte, nhận 2.075 byte, 12 record, ClientHello 1.474 byte vì Go 1.23 bật X25519 cộng Kyber768. Dưới netem 50 ms chiều server về client: TLS 1.3 có phản hồi sau 172 ms, TLS 1.2 sau 222 ms vì thêm một lượt chờ server, resumption bằng ticket vẫn 172 ms nhưng bớt Certificate và CertificateVerify, nhận 1.536 thay vì 2.075 byte. 0-RTT bằng openssl s_server với early_data: server nhận request sau 81,0 ms thay vì 131,7 ms, sớm hơn đúng một RTT, kèm Early data was accepted. Go crypto/tls không hỗ trợ 0-RTT trên TCP.