[项目自荐] 基于 ebpf 的高性能无侵入网络观测项目 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
chenjiandongx
V2EX    程序员

[项目自荐] 基于 ebpf 的高性能无侵入网络观测项目

  •  1  
  •   chenjiandongx 110 天前 2359 次点击
    这是一个创建于 110 天前的主题,其中的信息可能已经有所发展或是发生改变。

    Repo: https://github.com/packetd/packetd

    项目概览

    tcpdump 是一款强大的网络抓包工具,可以结合 wireshark 工具对流量进行分析。但是 tcpdump 缺少了一些现代化观测方案联动的手段,比如生成 traces/metrics/logs ,同时也缺少实时以 7 层网络视角观测的能力。另外 tcpdump 更倾向于作为一种 cli 工具,而不是以 agent 模式持续运行。

    So, packetd is born.

    packetd 支持从数据流中解析出多种应用协议( HTTP/gRPC/MySQL/Redis/Kafka/...),使用请求的来回 roundtrip 作为其核心概念,进而衍生出 traces/metrics/roundtrips 数据。

    packetd 提供了更加现代化的可观测手段,可以无缝地对接现有的观测体系:

    • 支持 Prometheus /metrics 路由暴露指标。
    • 支持 Prometheus RemoteWrite 协议主动上报 Metrics 数据(如 VictoriaMetrics )。
    • 支持 OpenTelemetry 协议上报 traces 数据。

    快速上手

    packetd 支持 watchagent 两种运行模式。前者作为一种 cli 工具 debug 网络请求,后者使用 agent 模式持续监听网络包并上报可观测数据。

    watch mode

    watch-mode

    agent mode

    agent-mode

    jq 序列化 roundtrips 数据(以 HTTP 协议为例)

    { "Request": { "Host": "192.168.255.128", "Port": 36654, "Method": "GET", "Header": { "Accept": [ "*/*" ], "User-Agent": [ "curl/8.11.1" ] }, "Proto": "HTTP/1.1", "Path": "/get", "URL": "/get", "Scheme": "", "RemoteHost": "httpbin.org", "Close": false, "Size": 0, "Chunked": false, "Time": "2025-07-06T12:36:51.49809695-04:00" }, "Response": { "Host": "54.243.106.191", "Port": 80, "Header": { "Access-Control-Allow-Credentials": [ "true" ], "Access-Control-Allow-Origin": [ "*" ], "Connection": [ "keep-alive" ], "Content-Length": [ "255" ], "Content-Type": [ "application/json" ], "Date": [ "Sun, 06 Jul 2025 16:36:51 GMT" ], "Server": [ "gunicorn/19.9.0" ] }, "Status": "200 OK", "StatusCode": 200, "Proto": "HTTP/1.1", "Close": false, "Size": 255, "Chunked": false, "Time": "2025-07-06T12:36:52.044846786-04:00" }, "Duration": "546.749836ms" } 

    traces 数据(以 HTTP 协议为例)

    详见 docs/observability.md

    Span Name <http.request.method>

    Span Attributes:

    • http.request.size
    • http.response.size
    • http.request.method
    • http.response.status_code
    • url.full
    • url.scheme
    • server.address
    • server.port
    • client.remote.host
    • network.peer.address
    • network.peer.port
    • network.transport
    • network.protocol.name
    • network.protocol.version
    • http.request.header.<key>
    • http.response.header.<key>

    协议支持

    • amqp
    • dns
    • grpc
    • http
    • http2
    • kafka
    • mongodb
    • mysql
    • postgresql
    • redis

    可观测性

    packetd 可以结合社区的可观测方案将 packetd 产生的数据进行持久化及可视化。

    Prometheus + Grafana

    grafana-prometheus

    OpenTelemetry + Jaeger

    jaeger

    Elasticsearch + Kibana

    kibana

    性能压测

    packetd 做了大量的性能优化,有着优秀的性能表现,能在较低资源使用的同时保证数据准确率。

    Header 字段含义:

    Field Desc
    PROTO 协议类型
    REQUEST client 发起的总请求次数
    WORKERS client 并发数
    BODYSIZE client 请求 body 大小
    ELAPSED 单轮压测耗时
    QPS 单轮压测请求速率
    BPS 单轮压测流量速率 bit/s
    PROTO (REQUEST) 捕获的请求总数
    PROTO (PERCENT) 捕获的请求总数与实际总请求数的比例(达成率)
    CPU (CORE) 压测期间使用的平均 CPU 核心数
    MEMORY (MB) 压测结束时 RSS 内存

    HTTP 压测结果,0.2C/40MB 内存可以处理 10Gb/s 的网络请求数据。

    REQUEST WORKERS BODYSIZE ELAPSED QPS BPS PROTO (REQUEST) PROTO (PERCENT) CPU (CORE) MEMORY (MB)
    10000 1 10KB 0.755s 13249.506 1035Mib 10000 100.000% 0.093 38.348
    10000 1 100KB 0.761s 13138.960 10.02Gib 10000 100.000% 0.105 40.012
    10000 1 1MB 0.779s 12838.487 100.3Gib 10000 100.000% 0.103 37.754
    100000 10 10KB 2.094s 47765.909 3732Mib 100000 100.000% 0.367 41.258
    100000 10 100KB 2.156s 46373.435 35.38Gib 100000 100.000% 0.343 39.418
    100000 10 1MB 2.086s 47949.323 374.6Gib 100000 100.000% 0.359 39.699
    100000 100 10KB 1.545s 64715.898 5056Mib 100000 100.000% 0.478 41.906
    100000 100 100KB 1.560s 64095.780 48.9Gib 100000 100.000% 0.461 42.387
    100000 100 1MB 1.542s 64863.419 506.7Gib 100000 100.000% 0.467 39.383
    1000000 1000 10KB 13.950s 71684.121 5600Mib 996969 99.697% 0.636 49.406

    MySQL 压测结果:

    REQUEST WORKERS ELAPSED QPS SQL PROTO (REQUEST) PROTO (PERCENT) CPU (CORE) MEMORY (MB)
    10000 1 2.316s 4317.668 select * from stress_test limit 100 10001 100.010% 0.026 38.562
    10000 1 5.291s 1889.883 select * from stress_test limit 1000 10001 100.010% 0.066 46.715
    1000 1 3.030s 330.042 select * from stress_test limit 10000 1001 100.100% 0.096 46.895
    10000 10 0.544s 18368.043 select * from stress_test limit 100 10010 100.100% 0.128 38.180
    10000 10 1.949s 5130.091 select * from stress_test limit 1000 10010 100.100% 0.154 63.730
    1000 10 1.595s 627.029 select * from stress_test limit 10000 994 99.400% 0.125 78.801
    2000 20 3.182s 628.515 select * from stress_test limit 10000 1977 98.850% 0.126 78.863
    2000 30 3.066s 652.303 select * from stress_test limit 10000 1944 97.200% 0.124 79.227

    更多协议结果可参考 docs/performance.md

    13 条回复    2025-08-07 19:50:22 +08:00
    malingxin
        1
    malingxin  
       110 天前
    应用场景是?是不是可以容器化放集群内跑
    oudioppa
        2
    oudioppa  
       110 天前
    给你点个 star
    swananan
        3
    swananan  
       110 天前
    我只是快速的过了一遍 readme ,所以问的问题可能没那么精确。
    好奇这个项目是基于 libpcap 来实现的,没有基于 xdp ,所以为啥说是基于 ebpf 呢。是因为 libpcap 支持 cbpf filter 这种吗。
    感觉如果不支持对 tls 流量解析,就有点可惜啊。可以考虑像 ecapture 那样,对稳定的 tls 开源库做 hook ,直接抓取相关流量,这样感觉适用性是不是更广一些
    Gilfoyle26
        4
    Gilfoyle26  
       110 天前
    好像以前黑马的 c++有这个,不知道是不是一样的
    flamingooo
        5
    flamingooo  
       110 天前
    蛮好的, 正好最近要写个 agent : )
    lrh3321
        6
    lrh3321  
       110 天前
    给你点了个 star
    chenjiandongx
        7
    chenjiandongx  
    OP
       110 天前
    @malingxin 是的,后续版本打算直接集成到 k8s ,使用 operator + agent 的方式运行。
    chenjiandongx
        8
    chenjiandongx  
    OP
       110 天前   1
    @swananan libpcap 也算是 cbpf ,classic bpf 的一种,算是 bpf 的一种形态。
    chenjiandongx
        9
    chenjiandongx  
    OP
       110 天前
    @swananan 项目也保留可扩展其他 sniffer 的接口,后续会继续尝试引入 CO-RE 方式的 sniffer 。
    swananan
        10
    swananan  
       110 天前   3
    所以严格的说,目前这个项目并不是基于 ebpf 的探测项目哈,没有恶意,只是指出
    bumblebeek
        11
    bumblebeek  
       110 天前   1
    对比 cilium 的 pwru 有什么优势?
    mango88
        12
    mango88  
       110 天前   1
    对比 deepflow 的话,亮点能介绍一下吗
    tuchuanw
        13
    tuchuanw  
       110 天前
    牛逼,mark 一下,慢慢学习
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     899 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 23ms UTC 20:52 PVG 04:52 LAX 12:52 JFK 15:52
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86