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.
uprobe, USDT và Soi Pod Từ Host
Tới giờ ta gắn vào nhân. eBPF còn với được vào userspace: uprobe gắn vào hàm của một chương trình hay thư viện thường, USDT gắn vào điểm tracepoint mà ứng dụng cài sẵn. Bài này trace hàm getaddrinfo trong libc để thấy chương trình nào đang phân giải tên miền gì, rồi dùng đúng kỹ thuật đó soi một pod thật trên cụm từ phía host — thấy nó gọi syscall gì mà không cần đụng vào pod. Đây là lý do eBPF thành nền quan sát cho Kubernetes.
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.
bpftrace: Viết Tracing Trong Một Dòng
Part I tự viết chương trình eBPF bằng C, clang, bpftool — nhiều bước cho một câu hỏi đơn giản như 'tiến trình nào đang mở file nào'. bpftrace là đường tắt: một dòng lệnh trả lời ngay, không C không clang. Nhưng bên dưới vẫn là eBPF — bài này chứng minh điều đó (bpftool thấy chương trình bpftrace nạp vào rồi biến mất), rồi đi qua cú pháp probe/filter/action, kho 122 nghìn probe gắn được, và các biến dựng sẵn, qua các one-liner chạy thật trên cụm.