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.

pktz TUI — per-process eBPF network traffic monitor

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ó.

pktz drill-down per-connection view với GeoIP

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ốngbcc-tools (eBPF)
Process đoản mệnhMiss (sampling chậm)Bắt tại exec()
Outbound conn theo PIDKhông liên kếtPID + comm mỗi connect
Disk I/O latencyTrung bình / sampledHistogram đầy đủ
Scheduler delayVô hìnhHistogram run-queue
Cần sửa codeCó (instrument)Không
OverheadThấp nhưng nôngThấ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, ps không thấy gì"execsnoop-bpfcc tóm cronjob đang fork hàng loạt worker.
  • "Nginx reload config không ăn"opensnoop-bpfcc -n nginx chỉ rõ file nào đang bị mở, error code gì.
  • "Có traffic lạ đi ra ngoài"tcpconnect-bpfcc gắ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 10 cho thấy disk stall mà iostat giấu.
  • "CPU% bình thường, app vẫn chậm"runqlat-bpfcc lộ 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à bpftrace DSL 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 để pipe sang jq. 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.