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

Một kết nối Redis duy nhất nhảy từ 25.850 lên 1.136.364 lệnh/giây mà không đổi một dòng cấu hình — vì nút thắt chưa bao giờ là CPU, mà là lượt đi về

Redis xử lý lệnh bằng một luồng duy nhất, nghe như lãng phí trên máy 16 nhân. Đo thật cho thấy nút thắt nằm ở chỗ khác: một luồng vẫn tăng gần tuyến tính tới 8 kết nối, và một kết nối đơn dùng đường ống 64 đạt 1,1 triệu lệnh/giây — gấp 44 lần cùng kết nối đó không đường ống. Không đường ống, Redis không dùng hết nổi một nhân vì phần lớn thời gian nằm trong lời gọi đọc/ghi socket, mỗi lời gọi mang đúng một lệnh.

Linux 01/09/2026 8 phút

strace -c làm chương trình chậm 446 lần dù nó không in ra một dòng nào — cái giá không nằm ở việc ghi chép, mà ở chỗ mỗi lời gọi phải dừng lại bốn lần

Ai cũng nghĩ 'chỉ đếm thôi' thì nhẹ hơn 'in đầy đủ'. Đo thật: strace -c chậm 446 lần, bản in đầy đủ 501 lần — chênh vỏn vẹn 12%, vì tiền không đi vào chỗ bạn tưởng. Mà trên chương trình không gọi hệ thống thì strace lại miễn phí. Chi phí tính theo số lời gọi, không theo thời gian chạy.

Linux 01/09/2026 8 phút

Vượt giới hạn bộ nhớ đúng 17% làm giá mỗi trang nhảy từ 0,01 lên 4,82 µs — gần 500 lần, không có bậc trung gian; và cái bẫy thật của swap là nó giữ tiến trình sống thoi thóp thay vì cho chết hẳn

Có nên tắt swap không — câu này được tranh cãi nhiều hơn được đo. Đo thật: không swap thì vượt giới hạn là bị giết ngay; có swap thì tiến trình sống, health check vẫn 200, dashboard vẫn xanh, mà mỗi yêu cầu chậm 500 lần. Không cảnh báo nhị phân nào bắt được trạng thái đó. Đây là lý do Kubernetes mặc định đòi tắt swap — và vì sao vẫn nên giữ nó với swappiness thấp.

Linux 01/09/2026 8 phút

Tải đĩa thuần đẩy load average từ 8,8 lên 12,88 trong khi CPU người dùng chỉ 1% — và load vẫn hiện 12,65 khi máy đã rảnh hoàn toàn

Ba con số uptime trả về gần như ai cũng đọc sai theo hai kiểu. Thứ nhất: Linux đếm cả tiến trình đợi đĩa, nên load cao không có nghĩa CPU bận — đo được load tăng 4 đơn vị trong khi CPU rảnh 45%. Thứ hai: chúng là trung bình trượt 1/5/15 phút, nói vừa rồi thế nào chứ không nói bây giờ — load còn 12,65 trên máy đã tắt sạch tải. Load để thấy xu hướng, không để chẩn đoán tức thời.

Backend 01/09/2026 8 phút

Một lệnh GET khiến khách chờ 3.335,8 ms không hề xuất hiện trong slowlog của Redis — nó chỉ ghi thời gian chạy, không ghi thời gian nằm chờ trong hàng

SLOWLOG là công cụ chẩn đoán tốt nhất của Redis, nhưng nó đo thời gian một lệnh CHẠY, không đo thời gian nó xếp hàng. Đo thật: một EVAL chạy 3 giây làm một GET mất 3,3 giây từ phía khách — và slowlog chỉ ghi EVAL, GET biến mất. SLOWLOG cho biết ai gây nghẽn, không cho biết ai bị nghẽn; muốn thấy phía nạn nhân phải đo ở khách hàng.

Backend 01/09/2026 8 phút

Bật TLS cho Redis chậm hơn 11,5% khi gọi từng lệnh — nhưng gộp thành đường ống thì nhanh bằng bản không mã hoá; cái giá thật nằm ở chỗ khác: 40% CPU

Redis mặc định không mật khẩu, không mã hoá, ai cũng làm được mọi thứ. Đo hai lớp bảo vệ và cái giá thật của từng lớp: ACL gần như miễn phí và chặn được lớp lỗi lớn nhất; còn TLS thì bất ngờ — chi phí mã hoá tính trên bản ghi chứ không trên lệnh, nên đường ống 100 lệnh làm nó gần như biến mất (477.027 so với 461.274/giây), nhưng CPU máy chủ vẫn nhảy từ 38,71% lên 54,26% cho cùng một lượng việc.