Linux 01/09/2026 8 phút

4.997 zombie cạn sạch giới hạn PID của container trong 0,17 giây — chúng không tốn byte RAM nào, chỉ giữ đúng một thứ: số hiệu tiến trình

Zombie không phải lỗi của tiến trình con mà của cha không đọc mã thoát. Tôi đo: một vòng waitpid dọn sạch 200 con, còn fork không thu hồi thì cạn 5.000 PID trong 0,17 giây và mọi tiến trình trong container nhận EAGAIN — triệu chứng là 'không tạo được tiến trình' trong khi RAM và CPU vẫn bình thường, đúng chỗ người trực đi tìm sai hướng.

Linux 01/09/2026 8 phút

Bảng điều khiển báo CPU 62,6% — 'còn 37% dư địa' — trong khi p99 đã 113 ms và tiến trình bị ghim 60 lần: con số trung bình mù tịt với điều tiết

Tôi dựng lại đúng cảnh 'ứng dụng chậm mà CPU chỉ 60%' và đo: ở 62,6% CPU trung bình, tiến trình đã bị throttle 60 lần và p99 nhảy lên 113 ms. Lý do là quota tính theo từng chu kỳ 100 ms chứ không theo phút — nên p99 chênh tới 44 lần trong khi CPU y hệt nhau, và chữ ký của nó là các yêu cầu chậm dồn đúng bội số 100 ms.

Linux 01/09/2026 9 phút

nproc bên trong container báo 16 nhân trong khi quota chỉ cho chạy bằng 1 — và vì tin lời nó, runtime tạo 32 luồng, làm chậm 44% và giãn đuôi trễ gấp đôi

cgroup không giới hạn bạn thấy bao nhiêu nhân, nó giới hạn bạn được chạy bao nhiêu thời gian. Nhưng nginx, Go, Node, JVM cũ đều tự chọn số worker theo nproc — và với quota 1 nhân, chúng đẻ ra 16. Đo thật: 32 luồng cho 1 nhân làm p99 xấu gấp đôi. Cộng thêm cái bẫy bộ nhớ: bộ đệm trang bẩn khiến OOM dù anon gần bằng 0.

Linux 01/09/2026 10 phút

Đổi trình biên dịch, không đổi một ký tự mã nguồn, băng thông bộ nhớ đo được nhảy 1,68 lần — vì 'băng thông của máy này' không tồn tại

Bài chốt sê-ri Linux: mười con số nền của một máy đủ để ước lượng gần như mọi quyết định hiệu năng, một danh sách kiểm rút từ chính những lần tôi đo sai, và một phát hiện — chạy cùng một file nguồn bằng gcc rồi clang, con số đọc bộ nhớ tuần tự đi mất một phần ba, chứng minh rằng băng thông là của một *cặp* (máy + đoạn mã đọc nó), không phải của riêng cái máy.

Linux 01/09/2026 9 phút

Một lần tra tên mất 24 giây trong pod Kubernetes — thêm đúng một dấu chấm ở cuối tên, còn 1,2 mili giây; hai mươi nghìn lần nhanh hơn chỉ bằng một ký tự

getaddrinfo trên IP mất 2,2 µs; trên một tên không tồn tại mất 1.046 lần thế. Rồi cấu hình ndots:5 mặc định của Kubernetes biến một lần tra thành sáu câu hỏi, và trong môi trường tôi đo, năm câu đầu im lặng chờ hết hạn — cộng lại 24 giây. Dấu chấm cuối bảo trình phân giải 'đây là tên tuyệt đối, đừng đoán'. Cộng thêm cái bẫy JVM cache DNS vĩnh viễn.

Linux 01/09/2026 9 phút

Bốn loại không gian tên cộng lại chỉ tốn 93 µs — riêng cái mạng ngốn 540 µs, gấp gần sáu lần cả bốn cái kia; và tháo nó ra còn lâu hơn dựng nó lên

Không phải mọi vách ngăn trong container đều đắt ngang nhau. Đổi tên máy, đánh số lại bảng tiến trình gần như miễn phí; nhưng dựng riêng một ngăn xếp mạng — bảng định tuyến, netfilter, veth — tốn 540 µs mỗi lần tạo và 1,7 lần thông lượng mỗi gói tin. Nếu tác vụ không cần cách ly mạng, đừng trả cái giá đó.