Hệ điều hành 03/09/2026 8 phút

Đọc một file /proc tốn 1,5 micro giây, tôi định chốt 'rẻ' — file bên cạnh lại đắt gấp 8 lần và còn phình

Đọc /proc/self/stat tốn ~1,5 us, tôi suýt khái quát 'mọi file /proc đều rẻ vậy'. Nhưng smaps tốn 12 us và còn phình theo bộ nhớ tiến trình, vì nhân phải đi bộ toàn bộ bảng trang. Cái rẻ và cái đắt nằm chung một thư mục trông y hệt nhau. Đo thật.

Hệ điều hành 03/09/2026 8 phút

Load 8 mà CPU vẫn rảnh: con số ai cũng liếc để đoán 'máy bận' đang lừa bạn

Ai cũng tin 'load average = mức bận CPU'. Nhưng trên Linux nó đếm cả tiến trình kẹt chờ I/O — 4 tiến trình chờ đĩa đẩy load lên 4 dù CPU nhàn tênh. Cùng con số load 8, hai căn bệnh trái ngược. Và nó còn dâng chậm vì làm mượt. Đo thật hai lầm tưởng của chính tôi.

Hệ điều hành 03/09/2026 8 phút

Công cụ tôi tin nhất suốt cả sê-ri hóa ra là kẻ nói dối lớn nhất về thời gian

Mỗi syscall dưới strace tốn ~80 micro giây thay vì 126 nano giây — chậm 630 lần. Nghĩa là mọi con số thời gian đo được khi strace đang bám đều sai bét. Chính cái thước tin cậy nhất của tôi lại là hiệu ứng người quan sát ở dạng thuần khiết nhất. Đo thật, và một maxim của sê-ri bị lật ngược.

Hệ điều hành 03/09/2026 8 phút

Định dùng perf để soi vì sao code chậm, máy ảo trả <not supported> — và cả demo kinh điển cũng bốc hơi

PMU là cửa sổ duy nhất thấy 'chậm vì trượt cache hay đoán nhánh sai'. Nhưng máy ảo không lộ PMU nên perf trả <not supported>. Tôi phải quay về đồng hồ — nó vẫn lộ hiệu ứng cache chậm 200 lần. Rồi demo 'mảng sắp xếp nhanh hơn' lại không tái hiện, vì một lý do bất ngờ. Đo thật.

Hệ điều hành 03/09/2026 8 phút

Đổi mutex sang atomic được nhanh gấp 3 — rồi tôi phát hiện cú nhanh gấp 42 mình suýt bỏ lỡ

Ai cũng khuyên 'bộ đếm đa luồng thì dùng atomic thay mutex cho nhanh'. Đo ra atomic nhanh gấp 3 thật — nhưng thêm luồng vào thì cả atomic lẫn CAS đều TỤT, vì cùng nảy một dòng cache. Cách thật sự scale là không chia sẻ, và nó nhanh hơn atomic 42 lần. Đo thật.

Hệ điều hành 03/09/2026 10 phút

Cùng một cú ghi vào trang chỉ đọc: lần thì SIGSEGV chết tươi, lần thì kernel âm thầm sửa hộ

char *s="hello"; s[0]='H'; — biên dịch trót lọt, chạy thì chết. Tôi đo ba ca ghi vào trang chỉ đọc, cả ba SIGSEGV, suýt chốt 'ghi vào trang chỉ đọc thì chết'. Rồi ca thứ tư sau fork lật ngược: cùng cái bẫy phần cứng đó, kernel lại lặng lẽ copy trang chứ không giết. Đo thật trong container.