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

Đồng hồ khai độ phân giải 1 nano giây, nhưng xin ngủ 1 micro giây thì ngủ thật 84 micro giây

clock_getres báo 1 nano giây, tôi tin hệ thống định thời tới nano giây. Nhưng nanosleep(1µs) ngủ thật ~84 micro giây — gấp 84 lần. Có một sàn ~80us do độ trễ đánh thức của bộ lập lịch, không phải độ mịn timer. Độ phân giải tự khai khác độ chính xác thật. Đo thật.

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

Tín hiệu

Giao một tín hiệu tới handler tốn ~500 ns. Nhưng cú đắt hơn là EINTR: một tín hiệu tới giữa nanosleep(10 giây) làm nó trả về sau 0,055 giây — và nếu bỏ giá trị trả về, bạn không hề biết. Đo thật.

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

epoll nhanh hơn poll 1860 lần — nhưng cái 'O(1) thần kỳ' tôi định viết là sai, và tôi đã cố định nhầm một biến

Theo dõi 10.000 fd: poll tốn ~248 micro giây mỗi lần gọi, epoll chỉ ~130 nano giây. Tôi định chốt 'epoll là O(1)'. Rồi tôi tăng số fd sẵn sàng và nó lộ ra là O(số fd sẵn sàng), không phải hằng số. Ưu thế thật của epoll đến từ một giả định về tải. Đo thật.

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

fork một tiến trình 256MB chỉ tốn 133 micro giây — và tôi từng đổ oan cho nhầm con số

Sao chép cả một tiến trình 256MB nghe phải mất hàng chục mili giây. Đo ra 133 micro giây, nhanh gấp trăm lần — vì fork nhân bảng trang chứ không chép byte. Rồi tôi suýt kết luận sai thủ phạm, cho tới khi tách 'đã cấp phát' khỏi 'đã chạm'. Và hóa ra fork là phần rẻ nhất; exec mới đắt. Đo thật trong container.

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

O_DIRECT tưởng là 'I/O nhanh', đo ra đọc-lại thua page cache 5 lần — và một máy ảo suýt lừa cả phép đo

O_DIRECT bỏ qua page cache, nghe như tối ưu. Nhưng đọc lại từ cache buffered ấm nhanh gấp ~5 lần. O_DIRECT là I/O KHÔNG cache, không phải I/O nhanh. Và lần đo đầu trên bind-mount cho kết quả vô lý vì các tầng cache lồng nhau nuốt luôn cờ direct. Đo thật.

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

fsync 'chậm gấp 1312 lần write' — con số tôi suýt giật tít, hóa ra vì write() gần như chưa làm gì

write() một khối 512 byte tốn 0,39µs; thêm fdatasync thành 518µs — gấp 1312 lần trên overlayfs, nhưng chỉ 4,2 lần trên FUSE. Tỉ lệ khác nhau là vì write baseline khác nhau, không phải fsync bất thường. Và write() trả về thành công KHÔNG bảo đảm dữ liệu đã bền — chỉ fsync mới.