Linux·5 min read·

Linux 6.12 Kernel eBPF Observability and System Profiling

Master modern eBPF tracing on Linux 6.12+ kernels to profile syscall latency, block I/O, and CPU schedulers without overhead.

NB

Netbay Engineering

Netbay Engineering

On this page

Linux observability has shifted fundamentally from periodic polling tools to in-kernel event-driven instrumentation powered by extended Berkeley Packet Filters (eBPF). On modern Linux 6.12+ kernels, eBPF allows system engineers to dynamically attach sandboxed bytecode programs to kernel tracepoints, kprobes, and perf events without recompiling the kernel or attaching intrusive debuggers. This architecture allows deep profiling of production workloads with sub-microsecond overhead.

Understanding how the modern BPF subsystem operates is crucial for production troubleshooting. When user-space utilities such as bpftrace, BCC, or custom libbpf agents compile high-level tracing expressions, the generated bytecode passes through the in-kernel BPF Verifier. The verifier proves that the code cannot dereference null pointers, loop infinitely, or corrupt kernel memory spaces before the Just-In-Time (JIT) compiler emits native machine instructions.

Expand
Linux Kernel eBPF
Linux Kernel eBPF Tracing Subsystem
Linux 6.12 eBPF Tracing and JIT Execution Architecture User Space Tools bpftrace / BCC / libbpf bpf() Syscall BPF_PROG_LOAD BPF Verifier Safety Proof Check In-Kernel JIT Compiler Native x86_64 Machine Code Attached Kernel Probes Tracepoints, kprobes, fexit BPF Maps Ring Buffers Verified BPF bytecode emits stats to ring buffers for asynchronous, zero-copy user-space consumption.

Inspecting System Call Latency with bpftrace

High latency in backend applications often stems from blocked file descriptors, contention on database sockets, or slow synchronous writes. Traditional strace imposes prohibitive overhead by pausing target processes on every entry and exit. In contrast, bpftrace compiles BPF bytecode that measures delta timestamps directly inside the kernel context.

Here is a practical one-liner to inspect the 99th percentile latency of the sys_enter_read syscall grouped by process name:

bash
# Profile syscall read latency distribution in microseconds
sudo bpftrace -e 'tracepoint:syscalls:sys_enter_read { @start[tid] = nsecs; } tracepoint:syscalls:sys_exit_read /@start[tid]/ { @us[comm] = hist((nsecs - @start[tid]) / 1000); delete(@start[tid]); }'

This program records the nanosecond timestamp on entry into sys_enter_read keyed by thread ID, calculates the duration on exit, aggregates the results into a logarithmic histogram bucket keyed by process name, and automatically purges the scratch map entry to prevent memory exhaustion.

Tracing Block Device I/O and Queue Depths

Storage I/O bottlenecks frequently present as sudden thread pool exhaustion. By attaching eBPF probes to the block layer tracepoints, administrators can pinpoint whether latency originates from kernel submission queues or the underlying NVMe SSD storage controller.

bash
# Monitor block device request latency and physical sector sizes
sudo bpftrace -e 'tracepoint:block:block_rq_issue { @issue[args->dev, args->sector] = nsecs; } tracepoint:block:block_rq_complete /@issue[args->dev, args->sector]/ { @lat_us = hist((nsecs - @issue[args->dev, args->sector]) / 1000); delete(@issue[args->dev, args->sector]); }'

The output histogram isolates block device latency distributions, revealing whether NVMe storage requests complete within predictable 20-50 microsecond windows or suffer from outlier tail latency spikes.

Video Overview

For an architectural walkthrough of Linux kernel internals and execution profiling, explore this guide:

Linux Kernel Architecture and Fast Profiling
YouTube

Production Best Practices

When deploying eBPF tracers on high-throughput cloud servers, adhere to these production safety guidelines:

  • Always prefer static tracepoints (tracepoint:*) over dynamic kprobes (kprobe:*), because tracepoints guarantee stable ABI boundaries and smaller overhead.
  • Utilize BPF ring buffers rather than legacy perf event buffers to avoid dropping samples during traffic bursts.
  • Ensure your kernel has BPF Type Format (BTF) enabled under /sys/kernel/btf/vmlinux, enabling Compile Once - Run Everywhere (CO-RE) portability across distribution updates.

You can spin up an Ubuntu 24.04 or Debian 12 cloud VPS with modern 6.x kernels on Netbay in under 60 seconds and follow along at netbayhosts.in.

Keep reading

Follow along on a real VPS

Deploy Linux in under 60 seconds

These guides are written against Ubuntu, Debian, and RHEL-family images — the same ones on NetBay.

Deploy an instance