Muốn biết tiến trình nào đang mở tệp gì, gói tin bị rớt ở khâu nào, hay hàm nào trong nhân đang ngốn thời gian — trước đây bạn phải sửa mã nhân, biên dịch lại, rồi khởi động lại máy. Trên một máy chủ đang phục vụ người dùng, "khởi động lại để xem chuyện gì đang xảy ra" gần như là điều không thể. eBPF xoá bỏ toàn bộ rào cản đó: nó cho bạn nhìn vào ruột nhân đang chạy mà không đụng một dòng nào của nhân.
Ý tưởng cốt lõi
eBPF cho phép nạp những chương trình rất nhỏ vào nhân và gắn chúng vào các điểm móc: một lời gọi hệ thống, một sự kiện mạng, một hàm nội bộ của nhân. Mỗi khi điểm đó được kích hoạt, chương trình nhỏ của bạn chạy. Điều làm eBPF an toàn — khác hẳn module nhân truyền thống, thứ có toàn quyền và một lỗi là sập cả máy — là chương trình chạy trong một máy ảo có kiểm soát, và trước khi được nạp nó phải qua một bộ verifier: bộ này kiểm tra không có vòng lặp vô hạn, không truy cập bộ nhớ tuỳ tiện, số lệnh có giới hạn. Một chương trình eBPF viết sai sẽ bị từ chối nạp chứ không làm sập máy. Đó là khác biệt biến việc soi nhân từ một hành động nguy hiểm thành một việc thường ngày.
Ba mảng đang dùng nhiều nhất
- Quan sát: đo độ trễ từng lời gọi hệ thống, dựng biểu đồ ngọn lửa cho thấy CPU đang cháy ở đâu, theo dõi mọi tiến trình con sinh ra — tất cả mà không sửa một dòng nào của ứng dụng đang chạy.
- Mạng: lọc và định tuyến gói tin ngay ở tầng driver, trước khi chúng đi hết ngăn xếp mạng dài dằng dặc của nhân. Đây là nền của nhiều hệ thống cân bằng tải và tường lửa hiệu năng cao hiện đại.
- Bảo mật: chặn lời gọi hệ thống theo chính sách, ghi nhật ký hành vi đáng ngờ ngay ở mức nhân — nơi mã độc khó che giấu hơn nhiều so với ở tầng ứng dụng.
Thử ngay trên máy
sudo apt install bpfcc-tools
sudo execsnoop-bpfcc # mọi tiến trình mới sinh ra, ngay khi sinh
sudo opensnoop-bpfcc # mọi tệp đang được mở, kèm tiến trình nào mở
sudo biolatency-bpfcc # phân bố độ trễ ổ đĩa, dạng biểu đồChạy execsnoop rồi mở một ứng dụng bất kỳ, bạn sẽ thấy nguyên cây tiến trình con nó sinh ra hiện lên tức thì — một cửa sổ nhìn vào hệ thống mà trước eBPF phải dựng công phu mới có.
Giới hạn cần biết
Verifier khá khó tính, và đó là cái giá của sự an toàn: một chương trình phức tạp thường bị từ chối với thông báo lỗi khó hiểu, và uốn mã cho verifier chấp nhận là một kỹ năng riêng. Điểm móc vào hàm nội bộ của nhân cũng không ổn định giữa các phiên bản — nhân đổi tên hay bỏ một hàm là chương trình eBPF bám vào đó gãy ngay. Với mã cần chạy lâu dài qua nhiều phiên bản nhân, nên bám vào các điểm móc ổn định được cam kết giữ nguyên, thay vì các hàm nội bộ có thể biến mất sau một lần nâng cấp.
Thảo luận