Q

Quản trị viên

Là một lập trình viên yêu công nghệ, thích viết blog để chia sẻ kiến thức, kinh nghiệm lập trình và những điều thú vị trong thế giới tech.

2312 bài viết · Website
Lập trình 22/09/2026 10 phút

Namespace đo thật: cùng một tiến trình sleep là PID 1 bên trong container nhưng PID 90064 trên host, hai container cô lập năm trục bằng năm inode kernel khác nhau, nhưng dùng chung user namespace nên root trong container là uid 0 thật

Container không phải máy ảo mà là nhóm tiến trình Linux bị cô lập cái nó nhìn thấy. Dựng hai container debian và đo: cùng một sleep là PID 1 bên trong nhưng 90064 trên host, mỗi container chỉ thấy tiến trình của mình. So inode namespace qua readlink /proc/1/ns: pid, net, mnt, uts, ipc đều khác giữa hai container; nhưng user namespace cùng inode 4026531837, nghĩa là Docker mặc định không bật user namespace và root trong container là uid 0 thật trên host. docker exec chui đúng vào namespace của container, và shared memory tạo ở container này container kia không thấy.

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

Capabilities đo thật: root trong container không phải root đầy đủ, Docker mặc định chỉ cấp 14 trong hơn 40 capability, nên chown và bind cổng thấp chạy được nhưng date -s, mount và ip addr add bị chặn, và --cap-drop ALL đưa CapEff về 0

Linux chia quyền root thành hơn 40 capability riêng. Docker mặc định chỉ cấp 14 cho root trong container, bỏ khoảng 26 cái nguy hiểm. Đo bằng CapEff trong /proc/self/status và test từng syscall bằng exit code: chown, tạo device node, raw socket, bind cổng dưới 1024 chạy được; date -s, mount tmpfs, ip addr add bị chặn vì thiếu SYS_TIME, SYS_ADMIN, NET_ADMIN. --cap-add NET_ADMIN đổi CapEff từ a80425fb thành a80435fb và bật ip addr add; --cap-drop CHOWN chặn chown; --cap-drop ALL đưa CapEff về 0 chặn tất cả, rồi --cap-add một cái cho CapEff chỉ bit đó.

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

Hàng đợi lock-free Michael-Scott trong Go: mổ xẻ, và vì sao channel vẫn thắng

Xây một hàng đợi lock-free chuẩn Michael-Scott với head/tail riêng, node giả và cơ chế giúp đỡ. Đo thật: nó đúng đắn (8000 phần tử, FIFO, -race sạch) nhưng dưới tranh chấp chậm hơn channel ~3 lần. Vì sao queue khó hơn stack, và khi nào channel là câu trả lời. Go 1.23.

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

Tổng kết Go chuyên sâu: bản đồ 132 bài và hai con số gói lại cả sê-ri

Kết thúc 132 bài đo thật về runtime, hiệu năng và hệ thống Go. Bài này vẽ bản đồ toàn sê-ri theo tám chủ đề, và đo một benchmark tổng hợp gói lại hai bài học lớn nhất: stack nhanh hơn heap 14,5 lần với 0 cấp phát, và thêm core giúp thật nhưng dưới tuyến tính (10 core chỉ nhanh 4,6x). Cùng cách tư duy đọng lại sau tất cả.

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

unsafe.Pointer trong Go: bốn mẫu chuyển đổi hợp lệ, và quy tắc uintptr sống còn

unsafe.Pointer cho phép gạt kiểu an toàn sang bên, nhưng chỉ vài mẫu chuyển đổi là hợp lệ và được runtime bảo đảm. Đo thật trong Go 1.23: các mẫu đúng chạy sạch, go vet bắt mẫu sai lưu uintptr vào biến, và chuyển []byte sang string không sao chép nhanh gấp 136 lần.

Cơ sở dữ liệu 22/09/2026 6 phút

TOAST trong PostgreSQL: lưu giá trị lớn ra sao và vì sao SELECT * đắt

TOAST tự nén giá trị lớn rồi đẩy phần còn lớn ra bảng phụ, giữ bảng chính gọn. Đo thật: bảng chính chỉ 15 MB dù tổng dữ liệu hơn 1 GB, và đọc không chạm cột lớn nhanh hơn 33 lần. Nén xảy ra trước, chiến lược lưu, và vì sao SELECT * tốn kém. PostgreSQL 16.