Linux 01/09/2026 7 phút

nice không làm gì cả cho tới khi tôi ghim hai tiến trình vào cùng một nhân — rồi tỉ lệ nhảy thành 98,7 trên 1,3; đây là điều kiện không tài liệu nào nhấn mạnh

CFS chia CPU đều 1/N như nó hứa. Nhưng nice 19 — mức ưu tiên thấp nhất — vẫn nhận đúng một nửa CPU, cho tới khi ép cả hai tiến trình vào cùng một nhân; lúc đó tỉ lệ khớp chính xác bảng trọng số của CFS. Lý do: nice là trọng số trong MỘT hàng đợi chạy, và hai tiến trình ở hai nhân khác nhau không có gì để cân. Trên máy nhiều nhân, nice chỉ có tác dụng khi số tiến trình vượt số nhân.

Linux 01/09/2026 9 phút

Đọc 512 byte tốn đúng bằng đọc 16 KB — ba mươi hai lần dữ liệu, cùng một cái giá; còn căn chỉnh sai với O_DIRECT thì không làm chậm, nó khiến lời gọi hỏng thẳng

Hai câu hỏi hay bị gộp làm một — đọc mỗi lần bao nhiêu byte, và có cần căn chỉnh không — hoá ra là hai câu chuyện khác hẳn. Cái giá của một thao tác I/O nằm ở chính thao tác đó (~35 µs cố định), không ở số byte, nên khối dưới 16 KB là tiền vứt đi. Còn O_DIRECT thì căn chỉnh sai không chậm mà trả EINVAL — và ngưỡng là 512 hay 4096 tuỳ phần cứng, một lớp lỗi chỉ lộ khi đổi ổ.

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ã.

Linux 01/09/2026 8 phút

Tiến trình làm tràn bộ nhớ sống sót và giữ trọn 300 MB nó vừa xin — kẻ bị giết là một tiến trình khác hoàn toàn vô can, và đây là lý do log OOM luôn trỏ nhầm thủ phạm

Container 700 MB, một tác vụ xin thêm 300 MB làm tràn giới hạn. Ai chết? Không phải nó — mà là tiến trình lớn nhất tại thời điểm đó. OOM killer không trừng phạt kẻ gây họa, nó ném thứ nặng nhất xuống để nổi thuyền. Cộng thêm: oom_score gần như vô dụng trong container, và đưa một tiến trình nhỏ lên đầu danh sách hy sinh chỉ làm mất hai tiến trình thay vì một.

Linux 01/09/2026 9 phút

Trang 2 MB làm chương trình nhanh 1,8 lần — và làm một chương trình chỉ dùng 256 byte chiếm 447 MB; cùng một tính năng, hai mặt đối nghịch tới 219 lần

Dùng trang 2 MB thay 4 KB cắt số lỗi trang và trượt TLB xuống 512 lần — nhưng đo thật cho thấy vùng càng lớn lợi càng nhỏ (ở 1 GB nhân chỉ gom được 47%), và chạm 1 byte trong mỗi vùng 2 MB làm 256 byte dữ liệu ngốn 447 MB. Đây là lý do Redis và MongoDB in cảnh báo khởi động đòi tắt trang lớn trong suốt.