Chi phí một syscall
Một lời gọi hàm thường tốn 0,8ns; một syscall getpid bẫy vào nhân tốn ~113ns (gấp 140 lần). Nhưng clock_gettime chỉ 15ns — vì nó KHÔNG bẫy, nó chạy trong vDSO. Đo thật bằng C và strace.
Một lời gọi hàm thường tốn 0,8ns; một syscall getpid bẫy vào nhân tốn ~113ns (gấp 140 lần). Nhưng clock_gettime chỉ 15ns — vì nó KHÔNG bẫy, nó chạy trong vDSO. Đo thật bằng C và strace.
fork() không sao chép dữ liệu nhờ copy-on-write (fork 1GB 1,6ms so với memcpy 490ms), nhưng nó vẫn tốn O(bộ nhớ) vì phải sao chép bảng trang: 33us ở 1MB lên 1613us ở 1GB. Đo thật.
Sau fork, con ghi 0% thì chiếm riêng 0MB, ghi 100% thì 400MB — bộ nhớ được chia sẻ đúng tới khi ghi. Nhưng RSS đứng yên 400MB ở mọi mức: nó đếm cả trang chung. Đo thật bằng smaps.
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. Và 1000 luồng làm VmSize +8GB nhưng RAM thật chỉ +8MB: 8MB mỗi luồng là địa chỉ ảo. Đo thật.
Ghim hai luồng vào một nhân, đổi ngữ cảnh tốn 0,5us. Bỏ ghim để dùng hai nhân — chậm gấp 16 lần (8,7us), vì đó là cross-core chứ không phải đổi ngữ cảnh. Đo thật bằng ping-pong.
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.