Blog
Thoughts on engineering, design, and building great products.
Off-CPU và Độ Trễ Scheduler: Đo Thời Gian Tiến Trình KHÔNG Chạy
Profiling on-CPU (Bài 17) chỉ thấy lúc CPU bận. Nhưng phần lớn độ trễ một ứng dụng cảm nhận lại nằm ở lúc nó KHÔNG chạy: chờ đĩa, chờ khóa, chờ tới lượt CPU. eBPF đo được khoảng off-CPU đó qua tracepoint của scheduler. Bài này đo hai thứ trên node thật: run-queue latency — thời gian từ lúc một tác vụ được đánh thức tới lúc thật sự chạy, phơi ra cái đuôi 16-32ms khi CPU bị tranh; và off-CPU time — một tác vụ nằm ngoài CPU bao lâu mỗi lần, với đuôi tới vài giây cho tác vụ bị chặn.
CPU Profiling Bằng perf_event: Lấy Mẫu Stack, Nền Của Flame Graph
Muốn biết CPU đang bận làm gì, ta lấy mẫu: vài chục lần mỗi giây, đóng băng mỗi CPU và ghi lại stack đang chạy. eBPF làm việc này qua loại chương trình perf_event — gắn vào một bộ đếm lấy mẫu của nhân, mỗi lần nổ thì chụp stack rồi gộp ngay trong nhân. Bài này profile một node thật ở 99Hz, thấy dd ngốn CPU qua đường đọc /dev/zero còn lõi rảnh thì nằm trong vòng idle, gộp theo tiến trình ra dd 479 mẫu — và đây chính là dữ liệu mà flame graph vẽ lên.
bpftrace: Maps, Đếm và Histogram
In từng dòng ngập màn hình khi sự kiện dày. Sức mạnh thật của bpftrace là gộp dữ liệu ngay trong nhân: đếm theo khóa, lập biểu đồ phân phối, rồi chỉ trả về bản tóm tắt nhỏ. Bài này dùng map @ của bpftrace để đếm syscall theo tiến trình, rồi dựng một histogram độ trễ vfs_read thật bằng cặp kprobe/kretprobe — thấy phân phối với cột ASCII, gồm cả cái đuôi chậm mà số trung bình sẽ giấu mất.
Tối Ưu và Chiến Lược Thực Thi
Chạy Ansible nhanh và an toàn trên hàng trăm host: forks và strategy điều khiển song song, serial cho rolling update không gián đoạn, delegate_to/run_once, async cho task dài, fact caching và pipelining để tăng tốc, tags và check mode để kiểm soát.