- Pager kêu 3h sáng, service flapping, dashboard không thấy gì lạ.
- Đây là 6 lệnh bcc-tools kernel-native giúp bạn tìm ra thủ phạm trong vài phút — mà Grafana không bao giờ thấy.
TL;DR
Khi service flapping lúc 3h sáng và ps, top, Grafana đều không hé lộ gì, 6 tool bcc-tools dưới đây — chạy trực tiếp trên kernel qua eBPF — sẽ cho bạn thấy đúng thứ monitoring stack truyền thống bỏ sót: process lóe sáng rồi tắt, file bị mở nhầm, kết nối TCP lén lút, retransmit mạng, disk I/O p99 bùng nổ, và thread đang chờ CPU. Zero code change, an toàn cho prod, cài một phát trên Debian/Ubuntu bằng apt install bpfcc-tools.

Vì sao bcc-tools đáng có trong toolbox on-call
eBPF (Extended Berkeley Packet Filter) cho phép nạp chương trình tracing vào kernel Linux — có verifier kiểm tra trước để chặn code không an toàn (không vòng lặp, không nhánh lùi) nên không crash máy prod. Data được tổng hợp ngay trong kernel space, không copy sự kiện thô ra userspace, nên overhead rất thấp.
BCC (BPF Compiler Collection) là bộ tool CLI dựng trên eBPF của project iovisor/bcc. Trên Debian/Ubuntu, package tên là bpfcc-tools và các binary có hậu tố -bpfcc (ví dụ execsnoop-bpfcc) để tránh trùng tên. Cài đặt:
sudo apt install bpfcc-tools linux-headers-$(uname -r)Tại sao on-call cần chúng
Monitoring stack truyền thống (ps, top, iostat, netstat) làm việc bằng cách sampling định kỳ — nghĩa là một process sống 50ms rồi chết gần như chắc chắn biến mất khỏi radar. Grafana CPU% không cho bạn biết thread của bạn chờ trong run-queue bao lâu. iostat trả về trung bình, che đi outlier p99 đang giết latency. eBPF nhìn từng event tại điểm kernel — đó là phần dashboard không thể thấy.
6 one-liner cần thuộc lòng
1. execsnoop-bpfcc — bắt process đoản mệnh
In một dòng mỗi khi syscall exec() được gọi. Cronjob nào đang fork 400 python worker mỗi phút? Tool này tóm ngay khoảnh khắc process spawn — ps không bao giờ kịp thấy.
2. opensnoop-bpfcc -n nginx — theo dõi syscall open()
Hiện mọi file mà app đang mở, kèm PID, command, file descriptor và error code. Flag -n nginx filter theo tên process. Hữu ích vô đối cho tình huống "sao config reload không ăn" — bạn sẽ thấy đúng đường dẫn nginx cố mở, và vì sao nó fail (ENOENT? EACCES?).
3. tcpconnect-bpfcc — mọi TCP connect ra ngoài, gắn PID
Trả lời câu hỏi kinh điển: thằng nào đang gọi cái IP lạ kia? Output gồm PID, process name, IPv4/6, src/dst, dst port. Gắn trực tiếp kết nối outbound với process tạo ra nó.

4. tcpretrans-bpfcc — live TCP retransmit
Hiện từng gói retransmit ngay khi xảy ra, kèm PID, src:port, dst:port, trạng thái socket. Nếu cột này đang đổ dồn, lỗi ở tầng mạng, không phải app — đừng đổ cho backend team nữa.
5. biolatency-bpfcc 1 10 — histogram disk I/O latency
Đếm độ trễ block I/O theo khoảng thời gian, vẽ histogram mỗi giây trong 10 giây. Khi p99 của bạn tăng vọt, tool này trả lời ngay: SSD đang rên, hay app đang chậm. Histogram còn lộ multi-mode distribution (hai cục latency) — thứ mà giá trị trung bình iostat che mất.
6. runqlat-bpfcc — CPU run-queue latency
Đo thời gian thread chờ trong run-queue trước khi được schedule lên CPU. Đây là metric noisy-neighbor kinh điển: CPU% dashboard bảo "còn khỏe" nhưng app của bạn vẫn lag vì phải xếp hàng chờ scheduler. Không Grafana nào show cái này ra được.
So với monitoring stack truyền thống
| Vấn đề | Tool truyền thống | bcc-tools (eBPF) |
|---|---|---|
| Process đoản mệnh | Miss (sampling chậm) | Bắt tại exec() |
| Outbound conn theo PID | Không liên kết | PID + comm mỗi connect |
| Disk I/O latency | Trung bình / sampled | Histogram đầy đủ |
| Scheduler delay | Vô hình | Histogram run-queue |
| Cần sửa code | Có (instrument) | Không |
| Overhead | Thấp nhưng nông | Thấp + sâu (kernel-native) |
Các deployment quy mô lớn năm 2025 được eBPF Foundation tổng kết: Meta triển khai Strobelight tiết kiệm tới 20% CPU; Datadog giảm 35% CPU cho network observability; Polar Signals cắt 50% chi phí traffic nội bộ Kubernetes; Canopus thu nhỏ footprint server 3 lần.
Kịch bản 3h sáng thường gặp
- "Service flapping,
pskhông thấy gì" →execsnoop-bpfcctóm cronjob đang fork hàng loạt worker. - "Nginx reload config không ăn" →
opensnoop-bpfcc -n nginxchỉ rõ file nào đang bị mở, error code gì. - "Có traffic lạ đi ra ngoài" →
tcpconnect-bpfccgắn ngay PID vào từng kết nối. - "Latency tăng, mạng hay app?" →
tcpretrans-bpfcc; retransmit dồn dập = mạng. - "p99 nổ tung" →
biolatency-bpfcc 1 10cho thấy disk stall màiostatgiấu. - "CPU% bình thường, app vẫn chậm" →
runqlat-bpfcclộ contention scheduler.
Hạn chế & chi phí
- Miễn phí, mã nguồn mở — BCC dưới Apache-2.0.
- Cần quyền root / CAP_BPF để load eBPF program.
- Phụ thuộc kernel version — tối thiểu ~4.1, khuyến nghị 4.9+.
- Footprint nặng — bcc-tools kéo theo LLVM/clang để compile kprobe lúc chạy. Production hiện đại đang chuyển dần sang
libbpf + CO-RE(compile-once, run-everywhere) vàbpftraceDSL cho image nhẹ hơn. - Trong container cần privileged + hostPID + quyền đọc kernel symbol từ host.
Đi xa hơn
Khi thuộc 6 one-liner trên, bước tiếp là:
- bpftrace — DSL kiểu awk trên eBPF, viết tracer ad-hoc trong 1 dòng.
- Cilium Tetragon — security observability + runtime enforcement cho Kubernetes.
- Parca Agent — continuous profiling zero-instrumentation.
- pktz — TUI nhỏ gọn viết bằng Go (v0.1.0, MIT) theo dõi traffic mạng theo từng process: live RX/TX, GeoIP flag, chế độ NDJSON để
pipesangjq. Yêu cầu kernel ≥ 5.8. Hơi còn thô nhưng dùng được.
Dashboard không nói dối, nhưng nó chỉ thấy được những gì người ta gắn metric vào. eBPF nhìn xuống một tầng thấp hơn — và khi ca trực 3h sáng gõ cửa, đó chính là tầng bạn cần.
Nguồn: iovisor/bcc tutorial, Brendan Gregg — Linux eBPF Tracing Tools, eBPF Foundation 2025 Year in Review, tweet gốc của @immanuel_vibe.
