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
Linux 01/09/2026 8 phút

Bật io_uring lên mà không đổi gì khác thì chậm hơn pread 20% — bật đúng chế độ gom, nó nhanh gấp 10 lần; đây không phải công tắc, nó là một cơ chế bạn phải biết dùng

io_uring được giới thiệu như bước nhảy của I/O trên Linux, nhưng đo thật cho thấy ở cấu hình mặc định nó tốn đúng bằng pread, và ở độ sâu 1 còn chậm hơn. Số lời gọi hệ thống chỉ tụt 32 lần khi bạn bảo nó gom — cái vòng chung cho phép gom chứ không tự gom. Đổi một dòng cấu hình rồi báo 'đã nâng cấp lên io_uring' là làm hệ thống chậm đi 20%.

Backend 01/09/2026 8 phút

Nâng Redis 6.2 lên 7.4 không cần cửa sổ bảo trì: đúng một lệnh ghi thất bại trên 3.843 lần — nhưng vừa đổi vai trò xong là không còn đường lùi

Một quy trình nâng cấp không downtime, đo thật: dựng bản mới làm bản sao (đồng bộ 0,6 giây), đổi vai trò (0,12 giây), khách mất đúng một lệnh ghi và 0,03 giây gián đoạn. Nhưng khi thử đảo ngược — cho bản cũ làm bản sao của bản mới — bản 6.2 không đọc nổi định dạng RDB của 7.4, dbsize về 0. Đây là quyết định một chiều, và mọi kiểm tra phải xong trước bước không quay lại được.

DevOps 01/09/2026 8 phút

Cùng một ứng dụng: Compose khởi động 0,9 giây, Kubernetes 1,2 giây — và Kubernetes trần trụi vẫn mất yêu cầu khi cập nhật y hệt Compose

Câu hỏi 'Kubernetes hay chỉ Docker Compose' thường được trả lời bằng niềm tin. Dựng cùng một ứng dụng hai container bằng cả hai rồi đo song song: bốn chỉ số đầu gần hoà (K8s không chậm hơn, không tốn RAM container hơn), nhưng K8s mang 743 MB hạ tầng cố định. Khác biệt thật ở cập nhật: K8s một bản không probe mất yêu cầu y như Compose; chỉ nhiều bản + readinessProbe + preStop mới cho 0 lỗi. Kubernetes không tặng uptime, nó tặng cơ chế.

DevOps 31/08/2026 7 phút

HPA phóng từ 2 lên 8 bản trong 30 giây, nhưng thu về mất tới 258 giây — bốn phút rưỡi ôm 8 bản ở 0% CPU, và đó là cố ý

HPA tự tăng giảm số bản theo tải — đo cả hai chiều thì chúng chênh nhau 8,6 lần. Mở rộng 30 giây (HPA tính thẳng số bản cần bằng ceil(bản × CPU/mục tiêu), không nhích từng cái), thu gọn 258 giây vì stabilizationWindow mặc định của scaleDown là 300 giây còn scaleUp là 0. Bất đối xứng này có chủ ý: mở rộng chậm thì người dùng khổ, thu gọn chậm chỉ tốn ít tiền vài phút. Thêm hai cái bẫy: thiếu requests.cpu thì HPA im lặng không bao giờ chạy, và co giãn theo bộ nhớ hiếm khi đúng vì JVM/Go không trả RAM.

DevOps 31/08/2026 8 phút

Chỉ dời một lệnh echo từ trước ra sau, thời gian xoá pod nhảy từ 0,6 lên 31 giây — và câu 'dùng sh -c là mất tín hiệu' hoá ra sai

Cùng một chương trình Python bắt SIGTERM, bốn cách khai lệnh, thời gian dừng chênh nhau 50 lần. Bí mật nằm ở một tối ưu hoá vô hình của shell: nếu lệnh cuối không còn gì phía sau, shell tự exec thành chính nó nên ứng dụng thành PID 1 và nhận tín hiệu; thêm một echo phía sau là shell phải ở lại giữ PID 1, và kernel bỏ qua mọi tín hiệu PID 1 không đăng ký. Thêm phép đo thứ hai nghịch trực giác: ứng dụng đóng cổng càng NHANH càng mất nhiều yêu cầu, và preStop sleep 5 đưa 3 lỗi về 0.

DevOps 31/08/2026 9 phút

30 dòng YAML mua được kiểm tra dữ liệu và cột hiển thị riêng cho Kubernetes — nhưng nó tạo ra 0 pod, vì một CRD là danh từ còn Operator mới là động từ

Tự viết cả CRD lẫn Operator rồi đo. 30 dòng YAML cho validation, giá trị mặc định và cột hiển thị mà không viết dòng mã nào — nhưng tạo xong TrangWeb thì namespace vẫn 0 Deployment, 0 pod. 38 dòng Python biến nó thành Operator thật (soBan 2→4 sau ~5 giây, xoá là Deployment tự biến mất nhờ ownerReferences). Chi phí thật lộ ra ở chỗ khác: vòng lặp quét 20 đối tượng gọi 660 lệnh API trong 60 giây, 11 lệnh/giây kể cả khi không có gì đổi — và với 200 đối tượng là 110 lệnh/giây không bao giờ nghỉ.