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

Chuyển ngữ cảnh '15 micro giây' — con số tôi suýt tin, hóa ra đo nhầm sang một thứ hoàn toàn khác

Chuyển ngữ cảnh giữa hai tiến trình trên cùng một lõi tốn ~691 ns (đã gồm syscall pipe ~300 ns). Nhưng lần đầu không ghim lõi tôi đo ra 15.000 ns — vì hai tiến trình rơi vào hai lõi khác, chẳng có chuyển ngữ cảnh nào, tôi đo nhầm sang đánh thức xuyên lõi. Biến ẩn 'lõi nào chạy' đổi cả đại lượng.

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

fork một tiến trình 512MB chỉ tốn 28 micro giây — nhưng cái giá không mất, nó chỉ nấp ở lần ghi đầu tiên

fork một tiến trình 512MB chỉ tốn 28µs — nó không sao chép dữ liệu, chỉ chép bảng trang (nhanh hơn nghìn lần). Nhưng chi phí sao chép không mất, nó bị hoãn: ghi vào 64MB heap chung sau fork tốn 20,2ms với 16.419 COW fault, chậm ~200 lần ghi thường. Khi cái gì 'gần như miễn phí', hỏi tiếp chi phí đi đâu.

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

printf trước và sau execve — cả hai dòng đều biến mất: syscall duy nhất mà 'dòng lệnh kế tiếp' nghĩa là đã lỗi

execve thay ảnh tiến trình tại chỗ: cùng PID, chương trình khác, và nạp lười nên exec file 64MB (354µs) nhanh ngang file 70KB (392µs). Tôi bọc nó bằng printf trước và sau để đo — cả hai đều mất, vì execve vứt bộ đệm chưa xả và không trở về khi thành công. Phải fflush trước và đo từ tiến trình cha.

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

Tôi chờ 16.384 lỗi trang, getrusage ra 32: kích thước trang là biến ẩn làm con số lệch 500 lần

Chạm 64MB bộ nhớ mới tôi tưởng gây 16.384 lỗi trang; getrusage ra 32 — vì trang lớn trong suốt (THP) 2MB, một lỗi lo trọn 2MB. Tắt THP ra đúng 16.384 (lệch 512 lần). Và đọc file đã nằm trong cache gần như không gây lỗi trang nặng nào. Kích thước trang và page cache là biến ẩn — phải đo, đừng nhẩm.

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

mmap 4GB, VSZ nhảy lên 4098MB nhưng RAM đứng yên ở 1MB: tôi suýt báo một chương trình 1MB là quái vật 4GB

mmap 4GB làm VSZ nhảy lên 4098MB nhưng RSS đứng yên ở 1MB — tôi suýt nhìn nhầm cột và phóng đại mức dùng RAM 4000 lần. RSS mới là RAM thật, VSZ chỉ là địa chỉ ảo đã đặt chỗ. Và mmap 64GB trên máy 8GB vẫn thành công. 'Bộ nhớ' không phải một con số — hỏi rõ cột nào trước khi tin.

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

2000 lần malloc, chỉ 4 lần chạm kernel: vì sao cấp phát bộ nhớ rẻ — và cú strace trống rỗng suýt lừa tôi

malloc không phải syscall: 2000 khối nhỏ chỉ sinh 4 lần brk (gom lô ở user space), mỗi malloc+free 64B tốn 9,4 ns; khối lớn 256KB+ mới mmap riêng. Nhưng khi tôi đo malloc 1MB bằng bản -O2, strace trống trơn — optimizer đã xóa mất cặp malloc/free không dùng. Mức -O là biến ẩn cả trong phép đo strace.