当前位置:首页>Linux>Linux内核观测黑科技:eBPF到底强在哪里?

Linux内核观测黑科技:eBPF到底强在哪里?

  • 2026-06-29 21:45:19
Linux内核观测黑科技:eBPF到底强在哪里?

关注「Raymond运维」公众号,并设为「星标」,也可以扫描底部二维码加入群聊,第一时间获取最新内容,不再错过精彩内容。

Linux内核观测黑科技:eBPF到底强在哪里?

一、概述

1.1 背景介绍

eBPF(extended Berkeley Packet Filter)是Linux内核3.18引入的革命性技术,它允许在内核空间运行用户定义的沙盒程序,无需修改内核代码或加载内核模块。传统的内核观测手段(如SystemTap、kprobe)需要编译内核模块,存在系统崩溃风险且灵活性差。eBPF通过JIT编译和验证器机制,在保证安全性的前提下,实现了动态、高性能的内核可编程能力。从网络包过滤到性能分析,从安全审计到容器网络,eBPF正在重新定义系统可观测性的边界。

1.2 技术特点

  • • 安全性:验证器确保eBPF程序不会导致内核崩溃,程序运行在沙盒环境,访问受限
  • • 高性能:JIT编译为本机代码,避免上下文切换,性能开销接近原生内核函数
  • • 动态性:无需重启系统或重新编译内核,程序可动态加载和卸载
  • • 可编程性:使用C语言编写内核逻辑,通过BPF Maps在内核态和用户态之间高效传递数据

1.3 适用场景

  • • 场景一:生产环境性能分析,需要零侵入地追踪内核函数调用、系统调用延迟、CPU调度事件
  • • 场景二:容器网络可观测性,Cilium等CNI插件基于eBPF实现网络策略和负载均衡
  • • 场景三:安全审计与入侵检测,监控异常系统调用(如execve、connect)、文件访问模式
  • • 场景四:分布式追踪,通过eBPF自动注入Trace信息,无需修改应用代码

1.4 环境要求

组件
版本要求
说明
Linux内核
4.9+ (推荐5.10+)
5.10+支持完整的CO-RE(一次编译到处运行)
LLVM/Clang
10+
编译eBPF程序为字节码
libbpf
0.4+
eBPF加载库,推荐使用libbpf-bootstrap
BCC或libbpf
根据开发方式
BCC高层封装,libbpf更轻量
内核调试符号
安装kernel-debuginfo
用于追踪内核函数

二、详细步骤

2.1 准备工作

◆ 2.1.1 系统检查

# 检查内核版本uname -r# 检查eBPF支持grep CONFIG_BPF /boot/config-$(uname -r)# 应输出: CONFIG_BPF=y, CONFIG_BPF_SYSCALL=y, CONFIG_BPF_JIT=y# 检查BTF支持(CO-RE需要)ls /sys/kernel/btf/vmlinux

◆ 2.1.2 安装依赖

Ubuntu/Debian:

# 更新系统sudo apt update && sudo apt upgrade -y# 安装编译工具链sudo apt install -y \  build-essential \  clang \  llvm \  libelf-dev \  linux-headers-$(uname -r) \  linux-tools-$(uname -r) \  linux-tools-common# 安装BCC工具集(快速上手)sudo apt install -y bpfcc-tools python3-bpfcc# 或安装libbpf开发库(生产环境推荐)sudo apt install -y libbpf-dev

CentOS/RHEL:

# 安装依赖sudo yum install -y \  clang \  llvm \  elfutils-libelf-devel \  kernel-devel-$(uname -r) \  bcc-tools# 安装内核调试符号sudo debuginfo-install kernel-$(uname -r)

2.2 核心配置

◆ 2.2.1 验证eBPF环境

# 测试bpftoolsudo bpftool prog list# 测试BCC工具sudo /usr/share/bcc/tools/execsnoop# 检查map类型支持bpftool feature probe | grep "map_type"

说明:如果bpftool prog list返回空,说明当前没有加载eBPF程序,这是正常的。execsnoop应能实时显示系统中执行的命令。

◆ 2.2.2 第一个eBPF程序(BCC方式)

hello_world.py:

#!/usr/bin/env python3# hello_world.py - BCC入门示例from bcc import BPF# eBPF程序(C代码)bpf_program = """#include <uapi/linux/ptrace.h>int hello(struct pt_regs *ctx) {    bpf_trace_printk("Hello, eBPF!\\n");    return 0;}"""# 加载eBPF程序b = BPF(text=bpf_program)# 将hello函数attach到sys_clone系统调用b.attach_kprobe(event=b.get_syscall_fnname("clone"), fn_name="hello")print("eBPF程序已加载,按Ctrl+C退出...")try:    b.trace_print()except KeyboardInterrupt:print("\n程序退出")

运行示例:

sudo python3 hello_world.py# 在另一个终端执行命令触发clone系统调用ls /tmp# 输出:# <...>-12345 [001] .... 123456.789012: 0: Hello, eBPF!

◆ 2.2.3 使用libbpf实现(生产推荐)

trace_execve.bpf.c(内核态代码):

// trace_execve.bpf.c#include<linux/bpf.h>#include<bpf/bpf_helpers.h>#include<bpf/bpf_tracing.h>char LICENSE[] SEC("license") = "GPL";struct {    __uint(type, BPF_MAP_TYPE_RINGBUF);    __uint(max_entries, 256 * 1024);} events SEC(".maps");structevent {int pid;char comm[16];};SEC("tracepoint/syscalls/sys_enter_execve")inttrace_execve(struct trace_event_raw_sys_enter* ctx){structevent *e;    e = bpf_ringbuf_reserve(&events, sizeof(*e), 0);if (!e)return0;    e->pid = bpf_get_current_pid_tgid() >> 32;    bpf_get_current_comm(&e->comm, sizeof(e->comm));    bpf_ringbuf_submit(e, 0);return0;}

trace_execve.c(用户态代码):

// trace_execve.c#include<stdio.h>#include<unistd.h>#include<signal.h>#include<bpf/libbpf.h>#include"trace_execve.skel.h"structevent {int pid;char comm[16];};staticvolatilebool exiting = false;staticvoidsig_handler(int sig){    exiting = true;}staticinthandle_event(void *ctx, void *data, size_t data_sz){conststructevent *e = data;printf("PID %-6d COMM %-16s\n", e->pid, e->comm);return0;}intmain(int argc, char **argv){structring_buffer *rb =NULL;structtrace_execve_bpf *skel;int err;    signal(SIGINT, sig_handler);    signal(SIGTERM, sig_handler);// 打开并加载eBPF程序    skel = trace_execve_bpf__open_and_load();if (!skel) {fprintf(stderr"Failed to open and load BPF skeleton\n");return1;    }// 附加tracepoint    err = trace_execve_bpf__attach(skel);if (err) {fprintf(stderr"Failed to attach BPF skeleton\n");goto cleanup;    }// 创建ring buffer    rb = ring_buffer__new(bpf_map__fd(skel->maps.events), handle_event, NULLNULL);if (!rb) {        err = -1;fprintf(stderr"Failed to create ring buffer\n");goto cleanup;    }printf("%-10s %-16s\n""PID""COMM");while (!exiting) {        err = ring_buffer__poll(rb, 100);if (err == -EINTR) {            err = 0;break;        }if (err < 0) {fprintf(stderr"Error polling ring buffer: %d\n", err);break;        }    }cleanup:    ring_buffer__free(rb);    trace_execve_bpf__destroy(skel);return err < 0 ? -err : 0;}

编译和运行:

# 编译eBPF程序clang -O2 -g -target bpf -D__TARGET_ARCH_x86_64 \  -c trace_execve.bpf.c -o trace_execve.bpf.o# 生成skeleton头文件bpftool gen skeleton trace_execve.bpf.o > trace_execve.skel.h# 编译用户态程序clang -O2 -g trace_execve.c -o trace_execve -lbpf -lelf -lz# 运行sudo ./trace_execve

2.3 启动和验证

◆ 2.3.1 使用BCC内置工具

# 追踪所有execve调用sudo execsnoop-bpfcc# 追踪TCP连接sudo tcpconnect-bpfcc# 分析系统调用延迟sudo funclatency-bpfcc sys_read# 统计VFS操作sudo vfsstat-bpfcc 1

◆ 2.3.2 功能验证

# 查看加载的eBPF程序sudo bpftool prog show# 查看eBPF Mapssudo bpftool map show# 导出Map内容sudo bpftool map dump id <MAP_ID># 查看程序性能统计sudo bpftool prog profile

预期输出:

# bpftool prog show12: tracepoint  name trace_execve  tag abc123def456    loaded_at 2025-01-15T10:30:00+0800    uid 0    xlated 256B  jited 180B  memlock 4096B

三、示例代码和配置

3.1 完整配置示例

◆ 3.1.1 网络包过滤(XDP)

xdp_drop_tcp.bpf.c:

// XDP程序: 丢弃目标端口为4040的TCP包#include<linux/bpf.h>#include<linux/if_ether.h>#include<linux/ip.h>#include<linux/tcp.h>#include<bpf/bpf_helpers.h>SEC("xdp")intxdp_drop_tcp_4040(struct xdp_md *ctx){void *data_end = (void *)(long)ctx->data_end;void *data = (void *)(long)ctx->data;// 解析以太网头structethhdr *eth = data;if ((void *)(eth + 1) > data_end)return XDP_PASS;// 只处理IP包if (eth->h_proto != __constant_htons(ETH_P_IP))return XDP_PASS;// 解析IP头structiphdr *ip = (void *)(eth + 1);if ((void *)(ip + 1) > data_end)return XDP_PASS;// 只处理TCP协议if (ip->protocol != IPPROTO_TCP)return XDP_PASS;// 解析TCP头structtcphdr *tcp = (void *)ip + (ip->ihl * 4);if ((void *)(tcp + 1) > data_end)return XDP_PASS;// 丢弃目标端口4040的包if (tcp->dest == __constant_htons(4040)) {        bpf_printk("Dropped TCP packet to port 4040\n");return XDP_DROP;    }return XDP_PASS;}char LICENSE[] SEC("license") = "GPL";

加载XDP程序:

# 编译clang -O2 -g -target bpf -c xdp_drop_tcp.bpf.c -o xdp_drop_tcp.bpf.o# 加载到网卡eth0sudo ip linkset dev eth0 xdp obj xdp_drop_tcp.bpf.o sec xdp# 测试(在另一台机器)nc -zv <目标IP> 4040  # 应该超时# 卸载sudo ip linkset dev eth0 xdp off

◆ 3.1.2 系统调用审计

syscall_audit.bpf.c:

// 审计危险系统调用(execve, unlink, rmdir)#include<linux/bpf.h>#include<bpf/bpf_helpers.h>#include<bpf/bpf_tracing.h>char LICENSE[] SEC("license") = "GPL";structsyscall_event {    __u32 pid;    __u32 uid;char comm[16];char syscall[16];};struct {    __uint(type, BPF_MAP_TYPE_PERF_EVENT_ARRAY);    __uint(key_size, sizeof(__u32));    __uint(value_size, sizeof(__u32));} events SEC(".maps");static __always_inline inttrace_syscall(void *ctx, constchar *name){structsyscall_eventevent = {};    __u64 pid_tgid = bpf_get_current_pid_tgid();    __u64 uid_gid = bpf_get_current_uid_gid();    event.pid = pid_tgid >> 32;    event.uid = uid_gid & 0xFFFFFFFF;    bpf_get_current_comm(&event.comm, sizeof(event.comm));    bpf_probe_read_kernel_str(&event.syscall, sizeof(event.syscall), name);    bpf_perf_event_output(ctx, &events, BPF_F_CURRENT_CPU, &event, sizeof(event));return0;}SEC("tracepoint/syscalls/sys_enter_execve")inttrace_execve(struct trace_event_raw_sys_enter* ctx){return trace_syscall(ctx, "execve");}SEC("tracepoint/syscalls/sys_enter_unlink")inttrace_unlink(struct trace_event_raw_sys_enter* ctx){return trace_syscall(ctx, "unlink");}SEC("tracepoint/syscalls/sys_enter_rmdir")inttrace_rmdir(struct trace_event_raw_sys_enter* ctx){return trace_syscall(ctx, "rmdir");}

用户态程序(Python + BCC):

#!/usr/bin/env python3from bcc import BPFimport ctypes as ct# 定义事件结构classSyscallEvent(ct.Structure):    _fields_ = [        ("pid", ct.c_uint32),        ("uid", ct.c_uint32),        ("comm", ct.c_char * 16),        ("syscall", ct.c_char * 16),    ]# 加载eBPF程序b = BPF(src_file="syscall_audit.bpf.c")# 附加tracepointsb.attach_tracepoint(tp="syscalls:sys_enter_execve", fn_name="trace_execve")b.attach_tracepoint(tp="syscalls:sys_enter_unlink", fn_name="trace_unlink")b.attach_tracepoint(tp="syscalls:sys_enter_rmdir", fn_name="trace_rmdir")# 回调函数defprint_event(cpu, data, size):    event = ct.cast(data, ct.POINTER(SyscallEvent)).contentsprint(f"[AUDIT] PID={event.pid} UID={event.uid} COMM={event.comm.decode()} SYSCALL={event.syscall.decode()}")# 打开perf bufferb["events"].open_perf_buffer(print_event)print("监控危险系统调用中,按Ctrl+C退出...")whileTrue:try:        b.perf_buffer_poll()except KeyboardInterrupt:break

◆ 3.1.3 性能分析工具

profile_oncpu.bpf.c(CPU火焰图数据采集):

// 采集on-CPU时间,用于生成火焰图#include<linux/bpf.h>#include<bpf/bpf_helpers.h>#include<bpf/bpf_tracing.h>char LICENSE[] SEC("license") = "GPL";#define MAX_STACK_DEPTH 50struct {    __uint(type, BPF_MAP_TYPE_STACK_TRACE);    __uint(key_size, sizeof(__u32));    __uint(value_size, MAX_STACK_DEPTH * sizeof(__u64));    __uint(max_entries, 10000);} stack_traces SEC(".maps");struct {    __uint(type, BPF_MAP_TYPE_HASH);    __uint(key_size, sizeof(__u32));    __uint(value_size, sizeof(__u64));    __uint(max_entries, 10000);} counts SEC(".maps");SEC("perf_event")intdo_sample(struct bpf_perf_event_data *ctx){    __u32 key = 0;    __u64 *val, one = 1;// 获取内核栈    key = bpf_get_stackid(ctx, &stack_traces, 0);if ((int)key < 0)return0;    val = bpf_map_lookup_elem(&counts, &key);if (val)        __sync_fetch_and_add(val, 1);else        bpf_map_update_elem(&counts, &key, &one, BPF_NOEXIST);return0;}

用户态采集脚本(使用bcc):

#!/usr/bin/env python3from bcc import BPFimport signalimport sysbpf_program = """#include <uapi/linux/ptrace.h>BPF_STACK_TRACE(stack_traces, 10000);BPF_HASH(counts, u32, u64);int do_sample(struct bpf_perf_event_data *ctx) {    u32 key = 0;    u64 *val, one = 1;    key = stack_traces.get_stackid(&ctx->regs, 0);    if ((int)key < 0)        return 0;    val = counts.lookup(&key);    if (val)        (*val)++;    else        counts.update(&key, &one);    return 0;}"""b = BPF(text=bpf_program)b.attach_perf_event(ev_type=PerfType.SOFTWARE, ev_config=PerfSWConfig.CPU_CLOCK, fn_name="do_sample", sample_freq=49)print("采集CPU profile,按Ctrl+C结束...")try:whileTrue:        sleep(1)except KeyboardInterrupt:passcounts = b["counts"]stack_traces = b["stack_traces"]# 输出folded格式(供flamegraph.pl使用)for k, v insorted(counts.items(), key=lambda x: x[1].value, reverse=True):    stack = list(stack_traces.walk(k.value))    symbols = []for addr in stack:        sym = b.sym(addr, -1)        symbols.append(sym.decode('utf-8''replace'))print(f"{';'.join(reversed(symbols))}{v.value}")

3.2 实际应用案例

◆ 案例一:容器网络延迟分析

场景描述:Kubernetes集群中某服务响应慢,需要分析容器网络栈延迟。

实现代码:

# 使用BCC工具tcplife追踪TCP连接生命周期sudo tcplife-bpfcc -p $(pgrep -f "myapp")# 输出示例PID   COMM       LADDR           LPORT RADDR           RPORT TX_KB RX_KB MS12345 myapp      10.244.1.5      8080  10.244.2.10     34567  0.5   2.3   125

深度分析:

#!/usr/bin/env python3# tcp_latency.py - 分析TCP connect延迟from bcc import BPFbpf_text = """#include <uapi/linux/ptrace.h>#include <net/sock.h>#include <bcc/proto.h>BPF_HASH(start, u32);int trace_connect_entry(struct pt_regs *ctx, struct sock *sk){    u32 pid = bpf_get_current_pid_tgid() >> 32;    u64 ts = bpf_ktime_get_ns();    start.update(&pid, &ts);    return 0;}int trace_connect_return(struct pt_regs *ctx){    u32 pid = bpf_get_current_pid_tgid() >> 32;    u64 *tsp, delta_us;    tsp = start.lookup(&pid);    if (tsp == 0)        return 0;    delta_us = (bpf_ktime_get_ns() - *tsp) / 1000;    bpf_trace_printk("PID %d connect latency: %lld us\\n", pid, delta_us);    start.delete(&pid);    return 0;}"""b = BPF(text=bpf_text)b.attach_kprobe(event="tcp_v4_connect", fn_name="trace_connect_entry")b.attach_kretprobe(event="tcp_v4_connect", fn_name="trace_connect_return")print("追踪TCP connect延迟...")b.trace_print()

运行结果:

myapp-12345 [001] .... 123456.789012: PID 12345 connect latency: 1234 us

◆ 案例二:文件系统热点分析

场景描述:数据库服务器IOPS高,需要定位频繁读写的文件。

实现方案:

# 使用filetop实时统计文件读写sudo filetop-bpfcc -C# 输出示例Tracing... Output every 1 secs. Hit Ctrl-C to endTID     COMM             READS  WRITES R_Kb    W_Kb    T FILE1234    mysqld           1205   523    96400   41840   R data/ibdata11234    mysqld           523    0      41840   0       R data/ib_logfile05678    redis-server     89     156    712     1248    R dump.rdb

详细追踪:

#!/usr/bin/env python3# vfs_trace.py - 追踪VFS层读写from bcc import BPFbpf_program = """#include <uapi/linux/ptrace.h>#include <linux/fs.h>BPF_HASH(counts, struct dentry *);int trace_vfs_read(struct pt_regs *ctx, struct file *file){    struct dentry *dentry = file->f_path.dentry;    u64 *val, one = 1;    val = counts.lookup(&dentry);    if (val)        (*val)++;    else        counts.update(&dentry, &one);    return 0;}"""b = BPF(text=bpf_program)b.attach_kprobe(event="vfs_read", fn_name="trace_vfs_read")print("统计VFS读操作,10秒后输出结果...")time.sleep(10)counts = b["counts"]for k, v insorted(counts.items(), key=lambda x: x[1].value, reverse=True)[:20]:# 解析dentry获取文件名    dentry_ptr = k.value    filename = b.get_dentry_name(dentry_ptr)print(f"{filename.decode('utf-8''replace')}{v.value} reads")

◆ 案例三:内存泄露定位

场景描述:应用进程内存持续增长,怀疑有内存泄露。

实现步骤:

# 使用memleak工具追踪内存分配sudo memleak-bpfcc -p $(pgrep myapp) -t# 输出示例(显示调用栈和分配次数)[10:30:00]addr = 0x7f8a4c0010 size = 4096    [unknown]    [unknown]    malloc+0x28    myapp_alloc+0x45 [myapp]    process_request+0x123 [myapp]    120 allocs, 0 frees

自定义内存追踪:

// memleak_trace.bpf.c#include<linux/bpf.h>#include<bpf/bpf_helpers.h>structalloc_info {    __u64 size;    __u64 timestamp;    __u32 stack_id;};struct {    __uint(type, BPF_MAP_TYPE_HASH);    __uint(max_entries, 10240);    __type(key, __u64);  // address    __type(value, struct alloc_info);} allocs SEC(".maps");struct {    __uint(type, BPF_MAP_TYPE_STACK_TRACE);    __uint(key_size, sizeof(__u32));    __uint(value_size, 127 * sizeof(__u64));    __uint(max_entries, 1024);} stack_traces SEC(".maps");SEC("uprobe/malloc")inttrace_malloc(struct pt_regs *ctx){    __u64 size = PT_REGS_PARM1(ctx);// 保存参数,在uretprobe中使用    __u64 pid_tgid = bpf_get_current_pid_tgid();    bpf_map_update_elem(&sizes, &pid_tgid, &size, BPF_ANY);return0;}SEC("uretprobe/malloc")inttrace_malloc_return(struct pt_regs *ctx){    __u64 addr = PT_REGS_RC(ctx);    __u64 pid_tgid = bpf_get_current_pid_tgid();    __u64 *size = bpf_map_lookup_elem(&sizes, &pid_tgid);if (!size || addr == 0)return0;structalloc_infoinfo = {        .size = *size,        .timestamp = bpf_ktime_get_ns(),        .stack_id = bpf_get_stackid(ctx, &stack_traces, BPF_F_USER_STACK),    };    bpf_map_update_elem(&allocs, &addr, &info, BPF_ANY);    bpf_map_delete_elem(&sizes, &pid_tgid);return0;}SEC("uprobe/free")inttrace_free(struct pt_regs *ctx){    __u64 addr = PT_REGS_PARM1(ctx);    bpf_map_delete_elem(&allocs, &addr);return0;}char LICENSE[] SEC("license") = "GPL";

四、最佳实践和注意事项

4.1 最佳实践

◆ 4.1.1 性能优化

  • • 避免过度使用bpf_trace_printk:printk会竞争全局锁,高频调用影响性能,生产环境使用perf_event或ring_buffer
    // 不推荐(高频场景)bpf_trace_printk("count: %d\n", count);// 推荐bpf_perf_event_output(ctx, &events, BPF_F_CURRENT_CPU, &data, sizeof(data));
  • • 使用per-CPU maps减少竞争:多核环境下,per-CPU map避免原子操作开销
    struct {    __uint(type, BPF_MAP_TYPE_PERCPU_ARRAY);    __uint(max_entries, 1);    __type(key, __u32);    __type(value, __u64);} stats SEC(".maps");
  • • 限制循环次数:eBPF验证器要求循环有界,使用#pragma unroll或bounded loops
    #pragma unrollfor (int i = 0; i < 10; i++) {// 循环体}

◆ 4.1.2 安全加固

  • • 限制eBPF程序权限:生产环境使用unprivileged eBPF,限制可访问的内核功能
    # 启用unprivileged eBPFsudo sysctl kernel.unprivileged_bpf_disabled=0# 限制map访问(需要内核5.13+)bpf_map__set_map_flags(map, BPF_F_RDONLY_PROG);
  • • 验证eBPF程序来源:使用签名机制防止加载恶意程序(内核5.11+支持)
  • • 资源限制:设置memlock限制,防止eBPF maps耗尽内存
    # 临时提升限制ulimit -l unlimited# 永久配置 /etc/security/limits.conf* hard memlock unlimited* soft memlock unlimited

◆ 4.1.3 生产环境监控

  • • 监控eBPF程序状态:定期检查程序是否正常运行
    # 检查程序是否被卸载if ! bpftool prog show id <PROG_ID>; thenecho"eBPF program lost, reloading..."    reload_ebpf_programfi
  • • 设置合理的map大小:避免map溢出导致数据丢失
    struct {    __uint(type, BPF_MAP_TYPE_HASH);    __uint(max_entries, 100000);  // 根据实际负载调整} my_map SEC(".maps");
  • • 日志告警集成:将eBPF事件发送到中心化日志系统
    # 发送到Elasticsearchfrom elasticsearch import Elasticsearches = Elasticsearch(['http://localhost:9200'])defhandle_event(cpu, data, size):    event = parse_event(data)    es.index(index="ebpf-events", document=event)

4.2 注意事项

◆ 4.2.1 配置注意事项

  • • eBPF程序必须在有限时间内完成,不能有无限循环或睡眠操作
  • • 内核4.x和5.x在eBPF特性支持上差异较大,开发前查阅内核版本对应的能力矩阵
  • • XDP程序只能在驱动支持的网卡上运行,检查网卡驱动是否支持:ethtool -i <interface>
  • • CO-RE(Compile Once Run Everywhere)需要内核5.2+且编译时开启BTF支持

◆ 4.2.2 常见错误

错误现象
原因分析
解决方案
libbpf: failed to load program
验证器拒绝程序(栈越界/无界循环)
检查verifier日志:`dmesg
Cannot allocate memory
memlock限制不足
提升ulimit -l限制
map creation failed
map类型不支持或max_entries过大
降低max_entries或更换map类型
BTF is required
内核或程序未开启BTF
使用BTF内核或不使用CO-RE特性
Invalid argument (attach)
tracepoint/kprobe名称错误
检查/sys/kernel/debug/tracing/events

◆ 4.2.3 兼容性问题

  • • 内核版本:eBPF特性快速演进,建议生产环境使用LTS内核(5.10或5.15)
  • • 编译工具链:LLVM 10+才完整支持BTF,11+支持CO-RE
  • • CO-RE移植性:使用libbpf + CO-RE编写的程序可在不同内核版本运行,但BCC程序需重新编译

五、故障排查和监控

5.1 故障排查

◆ 5.1.1 日志查看

# 查看eBPF程序加载日志sudo dmesg | grep -i bpf# 查看verifier拒绝原因sudo bpftool prog load program.o /sys/fs/bpf/myprog 2>&1# 查看trace_pipe输出(bpf_trace_printk)sudocat /sys/kernel/debug/tracing/trace_pipe# 查看perf eventssudo perf record -e 'bpf:*' -a sleep 10sudo perf script

◆ 5.1.2 常见问题排查

问题一:程序加载失败,提示"back-edge from insn X to Y"

# 查看详细错误sudo bpftool prog load program.o /sys/fs/bpf/test 2>&1 | less

解决方案:

  1. 1. 检查是否有无界循环,添加循环边界
  2. 2. 使用#pragma unroll展开循环
  3. 3. 简化程序逻辑,减少指令数量

问题二:XDP程序无法附加到网卡

# 检查驱动支持ethtool -i eth0 | grep driver# 检查XDP模式ip link show eth0 | grep xdp

解决方案:

  1. 1. 确认网卡驱动支持XDP(如i40e, ixgbe, mlx5)
  2. 2. 尝试使用generic XDP模式:ip link set dev eth0 xdpgeneric obj program.o
  3. 3. 更新网卡固件和驱动

问题三:性能开销过高

  • • 症状:eBPF程序运行后系统CPU使用率显著升高
  • • 排查:
    • • 检查程序是否attach到高频事件(如调度器事件)
    • • 使用bpftool prog profile查看程序执行开销
    • • 检查是否过度使用bpf_trace_printk
  • • 解决:
    • • 降低采样频率:sample_period = 1000
    • • 使用过滤条件减少事件量
    • • 优化map查找,使用per-CPU maps

◆ 5.1.3 调试模式

# 开启eBPF JIT调试echo 2 | sudotee /proc/sys/net/core/bpf_jit_enablesudo dmesg | tail -100  # 查看JIT编译的汇编代码# 使用llvm-objdump查看字节码llvm-objdump -S program.bpf.o# 使用bpftool查看已加载程序的字节码sudo bpftool prog dump xlated id <PROG_ID># 查看JIT后的汇编sudo bpftool prog dump jited id <PROG_ID>

5.2 性能监控

◆ 5.2.1 关键指标监控

# 监控eBPF程序执行时间sudo bpftool prog profile id <PROG_ID># 监控map内存使用sudo bpftool map show# 计算内存占用: max_entries * (key_size + value_size)# 监控系统整体eBPF开销perf stat -e 'bpf:*' -a sleep 10

使用Prometheus导出指标:

#!/usr/bin/env python3from prometheus_client import start_http_server, Gaugeimport subprocessimport time# 定义指标ebpf_prog_count = Gauge('ebpf_programs_total''Total eBPF programs loaded')ebpf_map_memory = Gauge('ebpf_map_memory_bytes''Memory used by eBPF maps')defcollect_metrics():# 统计程序数量    prog_count = subprocess.check_output(['sudo''bpftool''prog''list']).decode().count('\n')    ebpf_prog_count.set(prog_count)# 统计map内存(简化计算)# 实际应解析bpftool map show输出    ebpf_map_memory.set(1024 * 1024)  # 示例值if __name__ == '__main__':    start_http_server(9101)whileTrue:        collect_metrics()        time.sleep(15)

◆ 5.2.2 监控指标说明

指标名称
正常范围
告警阈值
说明
程序执行时间
<100us
>1ms
单次eBPF程序执行时间
CPU开销
<5%
>15%
eBPF程序占用的总CPU时间
Map内存占用
<512MB
>2GB
所有eBPF maps的内存总和
程序数量
<50
>100
过多程序可能影响性能
Verifier日志错误数
0
>0
程序加载失败次数

◆ 5.2.3 监控告警配置

# Prometheus告警规则groups:-name:ebpf_alertsinterval:30srules:-alert:eBPFProgramMissingexpr:ebpf_programs_total{job="critical"}==0for:5mlabels:severity:criticalannotations:summary:"关键eBPF程序丢失"description:"检查程序是否被卸载或崩溃"-alert:eBPFMapMemoryHighexpr:ebpf_map_memory_bytes>2*1024*1024*1024for:10mlabels:severity:warningannotations:summary:"eBPF Maps内存占用过高"description:"当前占用 {{ $value | humanize }}B"-alert:eBPFHighCPUexpr:rate(bpf_prog_run_time_ns[5m])>0.15for:5mlabels:severity:warningannotations:summary:"eBPF程序CPU开销过高"

5.3 备份与恢复

◆ 5.3.1 备份策略

#!/bin/bash# ebpf_backup.sh - 备份eBPF程序配置BACKUP_DIR="/data/backups/ebpf"DATE=$(date +%Y%m%d)mkdir -p $BACKUP_DIR# 导出已加载的程序列表sudo bpftool prog show > $BACKUP_DIR/programs_$DATE.txt# 导出map内容(示例)for map_id in $(sudo bpftool map list | grep -oP '^\d+'); dosudo bpftool map dump id$map_id > $BACKUP_DIR/map_${map_id}_$DATE.jsondone# 备份源代码和编译产物tar -czf $BACKUP_DIR/ebpf_src_$DATE.tar.gz /opt/ebpf_programs/# 清理30天前备份find $BACKUP_DIR -name "*.tar.gz" -mtime +30 -delete

◆ 5.3.2 恢复流程

  1. 1. 停止相关服务:
    # 卸载所有eBPF程序for prog_id in $(sudo bpftool prog list | grep -oP '^\d+'); dosudo bpftool prog detach id$prog_iddone
  2. 2. 恢复程序:
    # 解压源代码tar -xzf /data/backups/ebpf/ebpf_src_20250115.tar.gz -C /opt/# 重新编译和加载cd /opt/ebpf_programsmake clean && make./load_programs.sh
  3. 3. 验证:
    # 检查程序是否加载sudo bpftool prog list# 检查map是否创建sudo bpftool map list# 测试功能sudocat /sys/kernel/debug/tracing/trace_pipe

六、总结

6.1 技术要点回顾

  • • eBPF是内核可编程的革命性技术,实现了安全、高性能、动态的内核扩展能力
  • • 从网络包过滤(XDP)到性能分析(perf events),从安全审计(LSM hooks)到容器网络(Cilium),eBPF应用场景广泛
  • • 生产环境推荐使用libbpf + CO-RE方案,实现一次编译多内核版本运行,降低维护成本
  • • eBPF程序必须遵守验证器规则,理解这些限制是高效开发的关键

6.2 进阶学习方向

  1. 1. LSM eBPF安全策略:使用eBPF实现MAC(强制访问控制),替代传统SELinux
    • • 学习资源:Kernel LSM BPF文档
    • • 实践建议:实现容器逃逸检测、进程沙箱隔离
  2. 2. eBPF与Kubernetes集成:使用Cilium/Calico替代iptables,提升容器网络性能
    • • 学习资源:Cilium官方文档
    • • 实践建议:部署Cilium CNI,对比iptables和eBPF性能差异
  3. 3. 分布式追踪增强:结合OpenTelemetry和eBPF实现零侵入APM
    • • 学习资源:eBPF for Observability
    • • 实践建议:使用Pixie/Parca等基于eBPF的可观测性平台

6.3 参考资料

  • • eBPF官方网站 - 完整的eBPF学习路线和案例
  • • BCC工具集 - 丰富的eBPF示例和工具
  • • libbpf-bootstrap - libbpf开发脚手架
  • • Kernel BPF文档 - 内核官方eBPF文档
  • • Cilium eBPF库 - Go语言eBPF开发库

附录

A. 命令速查表

# eBPF程序管理sudo bpftool prog list  # 列出所有程序sudo bpftool prog show id <ID>  # 查看程序详情sudo bpftool prog dump xlated id <ID>  # 导出字节码sudo bpftool prog dump jited id <ID>  # 导出JIT汇编sudo bpftool prog pin id <ID> /sys/fs/bpf/myprog  # 固定程序# Map管理sudo bpftool map list  # 列出所有mapssudo bpftool map dump id <ID>  # 导出map内容sudo bpftool map update id <ID> key 0x01 value 0x02  # 更新mapsudo bpftool map delete id <ID> key 0x01  # 删除entry# 编译和加载clang -O2 -g -target bpf -c program.bpf.c -o program.bpf.osudo ip linkset dev eth0 xdp obj program.bpf.o sec xdp  # XDPsudo tc filter add dev eth0 egress bpf obj program.bpf.o  # TC# 调试sudocat /sys/kernel/debug/tracing/trace_pipe  # 查看printk输出echo 1 | sudotee /sys/kernel/debug/tracing/tracing_on  # 开启tracing

B. 配置参数详解

Map类型选择:

  • • BPF_MAP_TYPE_HASH:哈希表,适合kv存储,查找O(1)
  • • BPF_MAP_TYPE_ARRAY:数组,索引访问,性能最优
  • • BPF_MAP_TYPE_PERCPU_HASH/ARRAY:per-CPU版本,避免竞争
  • • BPF_MAP_TYPE_RINGBUF:环形缓冲区,替代perf_event,内核5.8+
  • • BPF_MAP_TYPE_LRU_HASH:LRU哈希表,自动淘汰旧数据
  • • BPF_MAP_TYPE_STACK_TRACE:存储内核/用户栈,用于火焰图

XDP返回值:

  • • XDP_PASS:继续内核协议栈处理
  • • XDP_DROP:丢弃数据包(DDoS防护)
  • • XDP_TX:从相同网卡发送回去(负载均衡)
  • • XDP_REDIRECT:重定向到其他网卡(路由)
  • • XDP_ABORTED:异常,丢弃并记录

C. 术语表

术语
英文
解释
eBPF
extended BPF
扩展的Berkeley包过滤器,内核可编程框架
JIT
Just-In-Time
即时编译,将eBPF字节码编译为机器码
Verifier
Verifier
eBPF验证器,确保程序安全性
BTF
BPF Type Format
eBPF类型格式,支持CO-RE
CO-RE
Compile Once Run Everywhere
一次编译到处运行,解决内核版本兼容问题
XDP
eXpress Data Path
在驱动层处理数据包的高性能机制
TC
Traffic Control
Linux流量控制子系统,支持eBPF
kprobe
Kernel Probe
内核探针,动态追踪内核函数
uprobe
User Probe
用户空间探针,追踪应用函数
Tracepoint
Tracepoint
内核静态追踪点,稳定的ABI
LSM
Linux Security Module
Linux安全模块,支持eBPF实现MAC
BPF Maps
BPF Maps
eBPF程序与用户空间通信的数据结构
Ring Buffer
Ring Buffer
环形缓冲区,高效的事件传递机制(5.8+)
Perf Event
Perf Event
性能事件,用于采样和统计

WeChat group

为了方便大家更好的交流运维等相关技术问题,创建了微信交流群,需要加群的小伙伴们可以扫一扫下面的二维码加我为好友拉您进群(备注:加群)。

代码仓库网址
Githubhttps://github.com/raymond999999
Giteehttps://gitee.com/raymond9

Blog

博客网址
CSDN
https://blog.csdn.net/qq_25599925
稀土掘金https://juejin.cn/user/4262187909781751
知识星球https://wx.zsxq.com/group/15555885545422
阿里云社区https://developer.aliyun.com/profile/snzh3xpxaf6sg
腾讯云社区https://cloud.tencent.com/developer/user/11823619
华为云社区https://developer.huaweicloud.com/usercenter/mycommunity/dynamics

访问博客网站,查看更多优质原创内容。

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-07-03 22:55:41 HTTP/2.0 GET : https://f.mffb.com.cn/a/487248.html
  2. 运行时间 : 0.290629s [ 吞吐率:3.44req/s ] 内存消耗:4,784.97kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=c9ebfd2244d4c7973526a046a9971484
  1. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/public/index.php ( 0.79 KB )
  2. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/autoload.php ( 0.17 KB )
  3. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/autoload_real.php ( 2.49 KB )
  4. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/platform_check.php ( 0.90 KB )
  5. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/ClassLoader.php ( 14.03 KB )
  6. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/autoload_static.php ( 4.90 KB )
  7. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper.php ( 8.34 KB )
  8. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-validate/src/helper.php ( 2.19 KB )
  9. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/helper.php ( 1.47 KB )
  10. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/stubs/load_stubs.php ( 0.16 KB )
  11. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Exception.php ( 1.69 KB )
  12. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-container/src/Facade.php ( 2.71 KB )
  13. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/deprecation-contracts/function.php ( 0.99 KB )
  14. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap.php ( 8.26 KB )
  15. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap80.php ( 9.78 KB )
  16. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/var-dumper/Resources/functions/dump.php ( 1.49 KB )
  17. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-dumper/src/helper.php ( 0.18 KB )
  18. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/var-dumper/VarDumper.php ( 4.30 KB )
  19. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/App.php ( 15.30 KB )
  20. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-container/src/Container.php ( 15.76 KB )
  21. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/container/src/ContainerInterface.php ( 1.02 KB )
  22. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/provider.php ( 0.19 KB )
  23. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Http.php ( 6.04 KB )
  24. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper/Str.php ( 7.29 KB )
  25. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Env.php ( 4.68 KB )
  26. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/common.php ( 0.03 KB )
  27. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/helper.php ( 18.78 KB )
  28. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Config.php ( 5.54 KB )
  29. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/app.php ( 0.95 KB )
  30. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/cache.php ( 0.78 KB )
  31. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/console.php ( 0.23 KB )
  32. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/cookie.php ( 0.56 KB )
  33. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/database.php ( 2.48 KB )
  34. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/Env.php ( 1.67 KB )
  35. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/filesystem.php ( 0.61 KB )
  36. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/lang.php ( 0.91 KB )
  37. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/log.php ( 1.35 KB )
  38. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/middleware.php ( 0.19 KB )
  39. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/route.php ( 1.89 KB )
  40. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/session.php ( 0.57 KB )
  41. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/trace.php ( 0.34 KB )
  42. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/view.php ( 0.82 KB )
  43. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/event.php ( 0.25 KB )
  44. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Event.php ( 7.67 KB )
  45. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/service.php ( 0.13 KB )
  46. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/AppService.php ( 0.26 KB )
  47. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Service.php ( 1.64 KB )
  48. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Lang.php ( 7.35 KB )
  49. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/lang/zh-cn.php ( 13.70 KB )
  50. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/Error.php ( 3.31 KB )
  51. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/RegisterService.php ( 1.33 KB )
  52. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/services.php ( 0.14 KB )
  53. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/PaginatorService.php ( 1.52 KB )
  54. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/ValidateService.php ( 0.99 KB )
  55. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/ModelService.php ( 2.04 KB )
  56. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/Service.php ( 0.77 KB )
  57. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Middleware.php ( 6.72 KB )
  58. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/BootService.php ( 0.77 KB )
  59. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/Paginator.php ( 11.86 KB )
  60. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-validate/src/Validate.php ( 63.20 KB )
  61. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/Model.php ( 23.55 KB )
  62. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Attribute.php ( 21.05 KB )
  63. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/AutoWriteData.php ( 4.21 KB )
  64. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Conversion.php ( 6.44 KB )
  65. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/DbConnect.php ( 5.16 KB )
  66. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/ModelEvent.php ( 2.33 KB )
  67. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/RelationShip.php ( 28.29 KB )
  68. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/contract/Arrayable.php ( 0.09 KB )
  69. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/contract/Jsonable.php ( 0.13 KB )
  70. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/contract/Modelable.php ( 0.09 KB )
  71. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Db.php ( 2.88 KB )
  72. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/DbManager.php ( 8.52 KB )
  73. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Log.php ( 6.28 KB )
  74. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Manager.php ( 3.92 KB )
  75. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/log/src/LoggerTrait.php ( 2.69 KB )
  76. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/log/src/LoggerInterface.php ( 2.71 KB )
  77. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Cache.php ( 4.92 KB )
  78. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/simple-cache/src/CacheInterface.php ( 4.71 KB )
  79. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper/Arr.php ( 16.63 KB )
  80. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/cache/driver/File.php ( 7.84 KB )
  81. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/cache/Driver.php ( 9.03 KB )
  82. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/CacheHandlerInterface.php ( 1.99 KB )
  83. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/Request.php ( 0.09 KB )
  84. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Request.php ( 55.78 KB )
  85. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/middleware.php ( 0.25 KB )
  86. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Pipeline.php ( 2.61 KB )
  87. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/TraceDebug.php ( 3.40 KB )
  88. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/middleware/SessionInit.php ( 1.94 KB )
  89. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Session.php ( 1.80 KB )
  90. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/session/driver/File.php ( 6.27 KB )
  91. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/SessionHandlerInterface.php ( 0.87 KB )
  92. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/session/Store.php ( 7.12 KB )
  93. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Route.php ( 23.73 KB )
  94. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleName.php ( 5.75 KB )
  95. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Domain.php ( 2.53 KB )
  96. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleGroup.php ( 22.43 KB )
  97. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Rule.php ( 26.95 KB )
  98. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleItem.php ( 9.78 KB )
  99. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/route/app.php ( 1.72 KB )
  100. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/Route.php ( 4.70 KB )
  101. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/dispatch/Controller.php ( 4.74 KB )
  102. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Dispatch.php ( 10.44 KB )
  103. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/controller/Index.php ( 4.81 KB )
  104. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/BaseController.php ( 2.05 KB )
  105. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/facade/Db.php ( 0.93 KB )
  106. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/connector/Mysql.php ( 5.44 KB )
  107. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/PDOConnection.php ( 52.47 KB )
  108. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Connection.php ( 8.39 KB )
  109. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/ConnectionInterface.php ( 4.57 KB )
  110. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/builder/Mysql.php ( 16.58 KB )
  111. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Builder.php ( 24.06 KB )
  112. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseBuilder.php ( 27.50 KB )
  113. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Query.php ( 15.71 KB )
  114. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseQuery.php ( 45.13 KB )
  115. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TimeFieldQuery.php ( 7.43 KB )
  116. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/AggregateQuery.php ( 3.26 KB )
  117. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ModelRelationQuery.php ( 20.07 KB )
  118. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ParamsBind.php ( 3.66 KB )
  119. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ResultOperation.php ( 7.01 KB )
  120. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/WhereQuery.php ( 19.37 KB )
  121. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/JoinAndViewQuery.php ( 7.11 KB )
  122. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TableFieldInfo.php ( 2.63 KB )
  123. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/Transaction.php ( 2.77 KB )
  124. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/log/driver/File.php ( 5.96 KB )
  125. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/LogHandlerInterface.php ( 0.86 KB )
  126. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/log/Channel.php ( 3.89 KB )
  127. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/event/LogRecord.php ( 1.02 KB )
  128. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/Collection.php ( 16.47 KB )
  129. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/View.php ( 1.70 KB )
  130. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/View.php ( 4.39 KB )
  131. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Response.php ( 8.81 KB )
  132. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/response/View.php ( 3.29 KB )
  133. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Cookie.php ( 6.06 KB )
  134. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-view/src/Think.php ( 8.38 KB )
  135. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/TemplateHandlerInterface.php ( 1.60 KB )
  136. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/Template.php ( 46.61 KB )
  137. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/template/driver/File.php ( 2.41 KB )
  138. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/template/contract/DriverInterface.php ( 0.86 KB )
  139. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/runtime/temp/067d451b9a0c665040f3f1bdd3293d68.php ( 11.98 KB )
  140. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/Html.php ( 4.42 KB )
  1. CONNECT:[ UseTime:0.000994s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.001844s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000726s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000863s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.001421s ]
  6. SELECT * FROM `set` [ RunTime:0.000603s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.001563s ]
  8. SELECT * FROM `article` WHERE `id` = 487248 LIMIT 1 [ RunTime:0.006690s ]
  9. UPDATE `article` SET `lasttime` = 1783090541 WHERE `id` = 487248 [ RunTime:0.016689s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 67 LIMIT 1 [ RunTime:0.019596s ]
  11. SELECT * FROM `article` WHERE `id` < 487248 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.001481s ]
  12. SELECT * FROM `article` WHERE `id` > 487248 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.027177s ]
  13. SELECT * FROM `article` WHERE `id` < 487248 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.021939s ]
  14. SELECT * FROM `article` WHERE `id` < 487248 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.008163s ]
  15. SELECT * FROM `article` WHERE `id` < 487248 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.039029s ]
0.294404s