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.

2300 bài viết · Website
Backend 01/09/2026 8 phút

Redis nhanh hơn PostgreSQL 4,1 lần khi ghi — không phải 100 lần như lời đồn; và phần lớn khoảng cách đó là độ bền bị bỏ, không phải kiến trúc

Mở đầu sê-ri bốn mươi phần về Redis, không bằng lời quảng cáo mà bằng cách đo nó cạnh PostgreSQL trên đúng cùng một bài toán. Redis nhanh hơn 4,1 lần khi ghi và 2,0 lần khi đọc — nhưng bật cờ UNLOGGED trên Postgres là khoảng cách co còn 1,4 lần, cho thấy Redis nhanh chủ yếu vì mặc định không hứa gì về độ bền. Bộ nhớ mỗi bản ghi gần bằng nhau (185 vs 178 byte), và có một câu hỏi Redis không trả lời được.

DevOps 01/09/2026 8 phút

Sửa tay trên cụm Kubernetes bị Argo CD hoàn tác sau 2 giây — nhưng một commit mới trong Git phải chờ 159 giây, vì Argo theo dõi cụm còn Git thì nó chỉ quét

Helm không chống được trôi cấu hình. Bài này cài Argo CD lên cụm thật rồi đo hai độ trễ chênh nhau gần trăm lần: sửa trực tiếp trên cụm bị kéo về sau 2,1 giây (Argo watch cụm), còn commit mới phải chờ tới 159 giây (Argo poll Git, mặc định 180s). selfHeal nhanh nhưng có giải lui khi tranh với controller khác, và quyền ghi Git giờ chính là quyền ghi cụm.

Backend 01/09/2026 9 phút

Gom nhóm bốn trạng thái đơn hàng mất 203,8 ms trong Redis và 8,9 ms trong PostgreSQL — và 203,8 ms đó đóng băng toàn bộ máy chủ Redis

Dựng thử một ứng dụng thật trên Redis rồi đo. Tra một khoá đã biết: Redis thắng, 0,145 ms so với 0,334. Nhưng gom nhóm, lọc, sắp xếp thì nó thua 5–23 lần hoặc không làm được — và mỗi báo cáo chạy trong Lua khiến mọi khách khác chờ một phần năm giây. Redis giỏi tra theo nhãn, dở tra theo thuộc tính; ép nó làm việc thứ hai là tự dựng chỉ mục mà không ai giữ đồng bộ.

Linux 01/09/2026 9 phút

Đọc 64 byte từ một tệp đã nằm sẵn trong RAM: pread mất 1.019 ns, mmap mất 19 ns — 53 lần, mà không bên nào chạm đĩa; toàn bộ khác biệt là cái giá đi vào nhân

mmap cho phép đọc một tệp như đọc một mảng trong bộ nhớ. Đo thật: với nhiều lần đọc nhỏ ngẫu nhiên trên tệp nóng, mmap nhanh 53 lần vì đọc một byte là đúng một lệnh máy, không lời gọi hệ thống nào. Nhưng nó không phải mặc định — lỗi I/O đến dưới dạng SIGBUS giữa một lệnh truy cập trông vô hại, và đó là lý do SQLite lẫn PostgreSQL từ chối dùng nó cho tệp dữ liệu chính.

Linux 01/09/2026 9 phút

Chương trình giải phóng sạch 400.000 khối, hệ điều hành vẫn thấy nó ôm 410 MB — một lời gọi malloc_trim trả lại 95 lần, và chênh 1 KB kích thước khối quyết định 200 MB có về hay không

Phần lớn 'rò rỉ bộ nhớ' được báo trong dịch vụ chạy lâu ngày thực ra không rò rỉ gì: bộ nhớ đã được free đúng cách, chỉ nằm lại trong bộ cấp phát của tiến trình thay vì quay về nhân. Đo thật cho thấy một ngưỡng 128 KB khiến chênh đúng 1 KB kích thước khối tạo khác biệt 175 lần, và cách phân biệt rò rỉ thật với phân mảnh trong vài dòng mã.

Backend 01/09/2026 8 phút

50 bản tin Redis Pub/Sub gửi trong lúc thuê bao mất kết nối: nhận lại được đúng 0 — nó là đài phát thanh, không phải hộp thư, và người ta cứ nhầm hai thứ đó

Pub/Sub là tính năng hay bị dùng sai nhất của Redis vì nó trông giống một hàng đợi. Đo ba tình huống chứng minh nó không phải: bản tin gửi khi chưa ai nghe mất sạch, gửi trong lúc thuê bao ngắt kết nối cũng mất sạch (0/50), và thuê bao đọc chậm bị Redis đóng kết nối sau khi bộ đệm chạm 32 MB. PUBLISH cũng chậm 6 lần khi lên 10 thuê bao vì phải ghi vào bộ đệm từng người trên luồng duy nhất.