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

'fork nhờ COW nên gần như miễn phí' — nửa đúng nửa nguy: fork 1GB vẫn tốn gấp 50 lần fork 1MB

fork() không sao chép dữ liệu nhờ copy-on-write (fork 1GB 1,6ms so với memcpy 490ms, nhanh hơn 310 lần), nhưng nó vẫn tốn O(bộ nhớ) vì phải sao chép bảng trang ngay: 33us ở 1MB lên 1613us ở 1GB. Và trên đường đo, gcc -O2 lặng lẽ xóa mất phép memcpy cho ra 0 giây. Đo thật.

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

Con vừa fork xong đã hiện RSS 400 MB, tôi kêu 'COW hỏng rồi' — nhưng nó chưa ghi lấy một byte

Sau fork, con ghi 0% thì chiếm riêng 0MB, ghi 100% thì 400MB — bộ nhớ chia sẻ thật tới đúng lúc ghi. Nhưng RSS đứng yên 400MB ở mọi mức, làm tôi hoảng tưởng COW hỏng. Vì RSS đếm cả trang chung; thước đúng là Private_Dirty/Pss. Đây là gốc nỗi hoảng '50 worker ăn 20GB'. Đo thật bằng smaps.

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

1000 luồng làm VmSize vọt lên 8 GB, tôi hoảng 'luồng đắt kinh khủng' — rồi nhìn cột bên cạnh: RAM thật chỉ 8 MB

Tạo một luồng tốn 42us, tạo một tiến trình 96us — nhanh hơn ~2 lần, không phải 100 lần như folklore. Và 1000 luồng làm VmSize +8GB nhưng RAM thật chỉ +8MB: 8MB mỗi luồng chỉ là địa chỉ ảo đặt trước cho ngăn xếp, không phải RAM. Đo thật.

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

Cho hai luồng dùng hai nhân, tưởng nhanh hơn — hóa ra chậm gấp 16 lần, vì tôi đo nhầm hẳn một thứ khác

Ghim hai luồng vào một nhân, chuyển ngữ cảnh chỉ 0,5us. Bỏ ghim để chúng dùng hai nhân — chậm gấp 16 lần (8,7us). Trực giác 'nhiều nhân nhanh hơn' sai bét: hai nhân không chuyển ngữ cảnh, cái tôi đo là chi phí cross-core (cache nảy + IPI). Đo thật bằng ping-pong.

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

kill -9 mà tiến trình vẫn trơ ra: chữ 'D' trong ps giải thích tất cả — và load average không nhảy như tôi tưởng

Tôi dựng từng trạng thái R/S/D/Z/T rồi đọc /proc: một dd ghi đồng bộ nằm trong D (ngủ không-ngắt-được, kill -9 cũng phải chờ) tới 72% thời gian. Rồi liếc load average tưởng nó vọt lên, nhưng nó đứng im — vì là trung bình trượt 1/5/15 phút, phản ứng chậm. Đo thật.

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

Lỗi trang

Chạm 200MB anon chỉ sinh 102 lỗi trang, không phải 51200 — vì trang lớn THP. Và đọc file lạnh từ đĩa chỉ đếm 1 major fault dù chậm gấp 27 lần cache — vì readahead. Đo thật bằng getrusage.