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

mmap và read đo ra bằng nhau y hệt — cho tới khi tôi phát hiện chính vòng đo của mình là nút thắt

Đọc file chạm mọi byte: mmap và read bằng nhau (~3700 MB/s), tôi suýt chốt 'zero-copy chỉ là huyền thoại'. Nhưng đó là vì vòng cộng byte của tôi mới là nút thắt. Đổi sang chạm thưa 1 byte/trang: mmap nhanh gấp 5 lần (190 vs 40 GB/s) — read bắt buộc chép cả file. Đo thật.

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

Định đo 'đọc đĩa lần đầu' mà hai lần đọc bằng nhau y hệt — vì file tôi vừa ghi đã ấm sẵn trong cache

Đọc lạnh từ đĩa 93ms, đọc ấm từ cache 18ms — nhanh gấp 5 lần. Nhưng lần đầu tôi đo, hai lần bằng nhau: hóa ra ghi file bằng dd đã nạp sẵn nó vào page cache, nên 'lần đầu' của tôi vốn đã ấm. Muốn đo đọc lạnh phải drop_caches. Đo thật, và cột Cached là đèn báo.

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

Ghi gần một triệu bản ghi mỗi giây — rồi thêm fsync và nó sụp còn 2.578, chậm 388 lần

write() không fsync đạt ~984.000 ghi/giây, tôi suýt reo 'ghi đĩa nhanh khủng khiếp'. Nhưng đó là tốc độ page cache, dữ liệu chưa bền. Thêm fsync ép xuống đĩa: sụp còn ~2.578 ghi/giây (388us mỗi lần). Gộp một fsync cho cả lô cứu lại tốc độ mà vẫn bền. Đo thật.

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

Ghi 300MB xong, dữ liệu nằm chơ vơ trong RAM đúng 30 giây rồi mới chạm đĩa — đó là cửa sổ mất trắng

write() không đưa dữ liệu xuống đĩa ngay. Tôi ghi 300MB không fsync và nhìn Dirty trong /proc/meminfo: nó ghim nguyên 300MB suốt 30 giây rồi mới về 0. Cửa sổ 30 giây đó — nếu mất điện là bay sạch — chính là lý do phải fsync. Đo thật, kèm một cái bẫy quan sát.

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

Đọc tuần tự nhanh hơn ngẫu nhiên 23 lần — nhưng 'vì đĩa không seek' là lời giải thích sai trên SSD

Đọc tuần tự 6701 MB/s, ngẫu nhiên 295 MB/s. Tôi định giải thích bằng 'seek' — rồi nhớ ra đây là SSD, không có đầu đọc để seek. Tách biến: đọc tuần tự y hệt mà TẮT readahead thì sụp còn 134 MB/s, chậm 50 lần. Thủ phạm thật là readahead, không phải seek. Đo thật.

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

Chạm hết 2GB vừa cấp phát mà RAM không nhích một byte — vì tôi 'chạm' bằng đọc, không phải ghi

Cấp phát 2GB tức thì: VmSize +2GB nhưng VmRSS +0. Tôi chạm hết 2GB đó để cấp RAM, mà RSS vẫn đứng im — vì đọc bộ nhớ mới chỉ trỏ vào một trang zero chung, không cấp RAM riêng. Chỉ GHI mới biến ảo thành thật. Đo thật bằng /proc/self/status.