You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取所有已处理数据包的时间戳?是否需更换eBPF Map类型?

问题:如何用eBPF存储并获取所有已处理数据包的时间戳?

我在eBPF程序中定义了一个名为timestamp_map、类型为BPF_MAP_TYPE_PERCPU_ARRAY的Map,代码如下:

struct {
    __uint(type, BPF_MAP_TYPE_PERCPU_ARRAY);
    __uint(max_entries, 1);
    __type(key, int);
    __type(value, uint64_t);
} timestamp_map SEC(".maps");

处理部分数据包后,我用命令sudo bpftool map dump <map ID>导出数据,得到结果:

[{
        "key": 0,
        "values": [{
                "cpu": 0,
                "value": 287032432816
            },{
                "cpu": 1,
                "value": 0
            }
        ]
    }
]

现在只能获取到最后一个已处理数据包的时间戳,请问如何获取所有已处理数据包的时间戳?是否需要更换其他类型的eBPF数组Map?


解决方案

1. 为什么当前方案只能拿到最后一个时间戳

你用的BPF_MAP_TYPE_PERCPU_ARRAY每个key下,每个CPU仅分配一个存储位置。每次处理数据包时,新的时间戳会直接覆盖这个位置的旧值,所以最终只能保留每个CPU上处理的最后一个数据包的时间戳,无法存储所有历史记录。

2. 更换合适的Map类型

要存储所有数据包的时间戳,必须用支持动态追加、能保存多条记录的Map类型,推荐两种常用方案:

  • BPF_MAP_TYPE_RINGBUF:这是eBPF专为高效向用户态批量传输流式数据设计的环形缓冲区。每个数据包处理时,直接将时间戳(或包含时间戳的结构体)写入ringbuf,用户态可实时读取所有记录,不会覆盖旧数据,性能最优。
  • BPF_MAP_TYPE_PERCPU_HASH/BPF_MAP_TYPE_HASH:如果需要在eBPF内部持久化所有时间戳,可使用哈希表。把每个数据包的唯一标识(比如自定义递增ID、数据包seq等)作为key,时间戳作为value。注意要合理设置max_entries,避免内存溢出。

3. 示例代码(以RINGBUF为例)

eBPF侧代码:

// 定义传递到用户态的时间戳结构体
struct timestamp_event {
    uint64_t ts;
};

// 定义ringbuf map,大小可按需调整
struct {
    __uint(type, BPF_MAP_TYPE_RINGBUF);
    __uint(max_entries, 1 << 20); // 1MB缓冲区
} rb SEC(".maps");

SEC("xdp")
int xdp_timestamp(struct xdp_md *ctx) {
    struct timestamp_event *e;

    // 从ringbuf申请内存
    e = bpf_ringbuf_reserve(&rb, sizeof(*e), 0);
    if (!e) {
        return XDP_PASS;
    }

    // 获取当前时间戳(以纳秒级为例)
    e->ts = bpf_ktime_get_ns();
    // 提交数据到ringbuf,用户态即可读取
    bpf_ringbuf_submit(e, 0);

    return XDP_PASS;
}

用户态读取方式:

用bpftool直接读取ringbuf数据:

sudo bpftool ringbuf dump map <map ID>

这样就能拿到所有处理过的数据包的时间戳。

4. 其他注意事项

  • 如果选择哈希表方案,需要保证key的唯一性:可以用BPF_MAP_TYPE_PERCPU_ARRAY维护一个每个CPU独立递增的计数器,将计数器值作为哈希表的key,时间戳作为value,避免多CPU竞争。
  • Ringbuf更适合持续输出数据的场景,数据写完后直接传递到用户态,不会占用过多eBPF侧的内存资源。

内容的提问来源于stack exchange,提问作者Manideep G

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 03:16:15