Kyanos 网络诊断工具全景指南:eBPF 驱动的 watch / stat / overview 三大命令实战
2026/9/18 18:50:11 网站建设 项目流程

Kyanos 网络诊断工具全景指南:eBPF 驱动的 watch / stat / overview 三大命令实战

【免费下载链接】kyanosKyanos is a networking analysis tool using eBPF. It can visualize the time packets spend in the kernel, capture requests/responses, makes troubleshooting more efficient.项目地址: https://gitcode.com/GitHub_Trending/ky/kyanos

本文以 Kyanos 官方文档首页(docs/index.md)对项目的定位描述为主线,系统梳理 Kyanos 的核心能力矩阵——七层协议抓包、多维流量过滤、聚合统计分析、容器网络监控与内核级时延可视化,并结合仓库中cmd/命令实现与agent/分析模块源码,给出可直接落地的命令级实操指南。读完本文,你将掌握watch抓包、stat聚合分析与overview依赖洞察三大命令的完整用法,并能结合源码理解其底层原理。

认识 Kyanos:一句话定位与设计哲学

Kyanos 是一个基于 eBPF 的网络流量分析工具,官方文档首页将其定位为 "A Simple & Powerful Network Tracing Tool",核心价值在于:可视化数据包在内核中的耗时,并在命令行中完成抓包与分析(Visualize the time packets spend in the kernel, watch & analyze in command line)。

在 docs/index.md 首页的 hero 与 feature 卡片中,项目官方总结出六大核心特性,本文后续章节将逐一展开:

特性一句话说明对应文档章节
🚀 Easy-to-use聚焦七层协议,一条命令抓取并分析 HTTP/Redis/MySQL/Kafka/MongoDB/RocketMQ/DNSdocs/how-to.md
🎯 Advanced Traffic Filtering支持按协议字段(如 HTTP Path、Redis Command)、PID、容器 ID、K8s Pod 名过滤docs/watch.md
📈 Powerful Aggregation Analysis按远端 IP、协议等多维度自动聚合,快速得到特定信息docs/stat.md
💻 Container Network Monitoring容器化环境下可测量从容器网卡到宿主机网卡的时延docs/watch.md
📊 Intuitive TUI纯命令行可视化输出,无需 tcpdump 式的文件下载与分析步骤docs/how-to.md
🌐 Lightweight and Compatible零外部依赖,兼容内核 3.10 至最新版本docs/quickstart.md

注:本仓库docs/目录下同时提供英文与简体中文版本(见 README_CN.md),中文用户可直接阅读中文文档。

为什么需要 Kyanos:传统抓包工具的五重痛点

官方文档 docs/what-is-kyanos.md 开篇即对比了传统网络排查工具(tcpdump、iftop、netstat)的局限,这些痛点正是 Kyanos 的设计出发点:

  1. 难以按协议信息过滤:例如抓取 HTTP 协议中特定 Path 的包,tcpdump 无法直接实现,需要借助 Wireshark/tshark 二次过滤;
  2. 难以按进程/容器过滤:单机多进程或多容器部署时,无法只针对特定进程或容器的流量抓包;
  3. 排查效率低:典型流程是生产环境 tcpdump 抓包 → 下载 pcap → 本地 Wireshark 分析,耗时巨大;
  4. 分析能力有限:tcpdump 只提供基础抓包,iftop/netstat 只有粗粒度监控,难以定位根因;
  5. 无法解密加密流量:SSL 等协议请求无法以明文形式查看。

而 Kyanos 的应对方案是五件套:强大的流量过滤多维度聚合分析内核级时延详情零依赖轻量部署SSL 流量自动解密。其中 SSL 解密能力在源码中有完整的体系支撑——仓库bpf/目录下包含多个 OpenSSL 版本探针(如 openssl_3_4_0.bpf.c、openssl_1_1_1j.bpf.c),配合 agent/uprobe/ 模块实现函数级探针注入,从而在用户态将 TLS 密文还原为明文。

安装与运行环境要求

内核版本兼容性

根据 docs/quickstart.md 的说明,Kyanos 对内核版本的要求按架构区分:

  • amd64
    • 3.x:内核版本3.10.0-957 及以上
    • 4.x:内核版本4.14 及以上
    • 5.x、6.x:完全支持
  • arm64:5.5 及以上

仓库 README.md 补充说明:当前支持内核 3.10(自 3.10.0-957 起)与 4.14 以上版本,并计划未来支持 4.7 至 4.14 之间的版本。可通过uname -r查看当前内核版本。

这一兼容性设计的底气来自仓库中的bpf/custom-archive/目录:该目录内置了 CentOS 7/8、Ubuntu 18.04/20.04 各内核版本的 BTF 文件(如3.10.0-1160.el7.x86_64.btf5.4.0-91-generic.btf等),加上 bpf/btfgen.sh 生成的 btfgen 脚本,保证了在缺乏 BTF 的旧内核上也能加载 eBPF 程序。

安装步骤

从官方 release 页面下载静态链接的二进制(兼容 amd64 与 arm64):

tar xvf kyanos_vx.x.x_linux_amd64.tar.gz

然后以root 权限运行:

sudo ./kyanos watch

如果终端出现请求-响应记录表格,即表示 Kyanos 启动成功。如果启动失败,可参考 docs/faq.md 排查,或到 issue 中反馈。

核心命令之一:watch——抓取请求-响应并查看内核级时延

基本用法与界面

watch是 Kyanos 最基础的命令,负责按指定条件抓取网络流量,并自动解析为请求-响应记录(docs/how-to.md)。最简单的用法是抓取当前支持的所有协议:

./kyanos watch

当前支持解析的协议在 cmd/watch.go 中以supportedProtocols列表形式定义:httpredismysqlrocketmqkafkamongodbdns。也可用./kyanos watch --list直接查看(对应 cmd/watch.go 中的--list标志)。

执行后,每个请求-响应记录以表格行呈现,各列含义如下(源自 docs/watch.md):

列名说明示例
id表格序号
Connection该请求-响应所属连接10.0.4.9:44526 => 169.254.0.4:80
Proto请求-响应使用的协议HTTP
TotalTime该请求-响应总耗时(毫秒)
ReqSize请求大小(字节)
RespSize响应大小(字节)
Net/Internal作为客户端时为网络时延;作为服务端时为内部处理时间
ReadSocketTime客户端从 Socket 缓冲区读取响应耗时;服务端为从缓冲区读取请求耗时

界面操作方式:用/k/j键上下移动记录,按数字键排序,按Enter进入详情视图。默认抓取 100 条记录,可用--max-records调整(该默认值定义在 cmd/watch.go)。

详情视图:内核级时延可视化

详情视图包含三个部分:

  1. Latency Details(时延详情):每个块代表数据包经过的一个节点(进程、网卡、Socket 缓冲区等),块下方标注了从上一节点到该节点的耗时。你可以清晰看到请求从进程发出到网卡、响应从网卡复制到 Socket 缓冲区、再到进程读取的完整过程及各阶段耗时。
  2. 请求与响应的基本信息:包括请求/响应的开始结束时间、大小等。
  3. 请求与响应的具体内容:分为 Request 与 Response 两段,超过1024 字节的内容会被截断显示,可通过--max-print-bytes调整上限(cmd/watch.go)。

如果想进一步看到网卡到 TCP 缓冲区拷贝缓冲区到进程读取两个阶段的时延,可添加--trace-socket-event选项(默认关闭,定义于 cmd/watch.go),时延图中会额外出现 Socket 块。--trace-dev-event--trace-ssl-event默认开启,分别负责采集网卡设备层事件与 SSL 数据事件(cmd/watch.go)。

多维过滤体系

watch最强大的能力在于过滤。所有过滤选项可以自由组合,从网络层到协议层逐级收敛流量。

按 IP 与端口过滤(网络层 L3/L4)
过滤条件命令行标志示例
本地端口--local-ports--local-ports 6379,16379
远端端口--remote-ports--remote-ports 6379,16379
远端 IP--remote-ips--remote-ips 10.0.4.5,10.0.4.2
客户端/服务端--side--side client--side server

这些网络层过滤标志在 cmd/root.go 中作为根命令的持久化标志注册,即对所有子命令生效。

按进程/容器过滤
过滤条件命令行标志示例
进程 PID 列表--pids--pids 12345,12346(逗号分隔)
进程名--comm--comm 'curl'
容器 ID--container-id--container-id xx
容器名--container-name--container-name foobar
K8s Pod 名--pod-name--pod-name nginx-7bds23212-23s1s.default(格式 NAME.NAMESPACE)

容器过滤标志同样注册在 cmd/root.go。容器信息获取依赖容器运行时端点,支持 Docker、containerd 与 CRI 运行时,对应源码为 agent/metadata/container/docker/、agent/metadata/container/containerd/ 与 agent/metadata/k8s/cri.go。

值得一提的是,在容器化环境中,Kyanos 还会展示容器网卡到宿主机网卡之间的时延,这正是首页 feature 中 "Container Network Monitoring" 能力的体现。

按请求-响应通用信息过滤
过滤条件命令行标志示例
请求-响应时延--latency--latency 100(只观察超过 100ms 的记录)
请求大小--req-size--req-size 1024(大于 1024 字节)
响应大小--resp-size--resp-size 1024(大于 1024 字节)
按协议专属字段过滤

将协议名作为子命令即可只抓取该协议流量,再叠加该协议的专属过滤条件:

  • HTTP--path /foo/bar(路径精确匹配)、--path-prefix /foo/bar(路径前缀)、--path-regex "\/foo\/bar\/.*"(路径正则)、--host www.baidu.com(Host)、--method GET(方法)
  • Redis--command GET,SET(命令)、--keys foo,bar(键)、--key-prefix foo:bar(键前缀)
  • RocketMQ(preview):--request-codes 10,11(请求码)、--languages Java,Go(语言)
  • Kafka(preview):--topic quickstart-events(Topic)、--producer/--consumer(生产/消费方向,指定 topic 时默认均为 true)、--apikeys 10,11(API Key)
  • DNS(preview):--host example.com(域名)
  • MongoDB / MySQL:已支持协议抓取,条件过滤仍在开发中

例如,只抓取访问/foo/bar路径的 HTTP 请求:

kyanos watch http --path /foo/bar

组合使用示例(来自 docs/watch.md 官方文档):

./kyanos watch redis --keys foo,bar --remote-ports 6379 --pid 12345

JSON 输出(preview)

如果需要程序化处理抓取结果,可使用--json-output标志(cmd/watch.go):

# 输出到终端 kyanos watch --json-output=stdout # 输出到文件 kyanos watch --json-output=/path/to/custom.json

每条请求-响应记录包含:请求/响应时间戳、连接详情(地址与端口)、协议专属信息、详细时延指标、请求与响应内容。完整格式规范见 docs/json-output.md。

核心命令之二:stat——多维度聚合分析

设计动机与基本用法

watch的输出是逐条请求-响应的细粒度视图,适合底层分析;但当需要回答"所有服务器都慢还是只有某一台慢""哪个客户端 IP 占用了最大带宽"这类全局性问题时,就需要stat命令对大量请求-响应做聚合统计(docs/stat.md)。

使用stat的核心是明确两件事:关心的指标(--metric聚合维度(--group-by。例如要分析"HTTP 请求慢,是所有服务器都慢还是个别服务器慢",指标是响应时间、聚合维度是远端 IP:

./kyanos stat --metric total-time --group-by remote-ip

等价于短写形式:

./kyanos stat -m t -g remote-ip

其中-m--metric的简写、ttotal-time的简写、-g--group-by的简写。命令中--metric--group-by的解析与校验逻辑位于 cmd/stat.go,合法的指标与维度均在源码中有硬编码校验。

支持的指标与聚合维度

stat当前支持的指标(--metric,源码见 cmd/stat.go):

指标短标志长标志
总耗时ttotal-time
响应大小prespsize
请求大小qreqsize
网络时延nnetwork-time
内部处理时间iinternal-time
Socket 读取耗时ssocket-time

源码细节:network-timeinternal-time在 cmd/stat.go 中均映射到 BlackBoxDuration 指标,区别在于前者强制Side = ClientSide、后者强制Side = ServerSide——这正是 Net/Internal 列"客户端看网络、服务端看内部处理"语义的源码级来源。

stat支持的聚合维度(--group-by):

聚合维度取值
按连接conn
远端 IPremote-ip
远端端口remote-port
本地端口local-port
L7 协议protocol
HTTP 路径http-path
Redis 命令redis-command
全部聚合none

聚合时还支持二级分组:--group-by的值若包含/,则/前为主维度、后为子维度(cmd/stat.go)。另外,代码中还针对 HTTP 协议固定启用了HttpPath分类器、针对 Redis 固定启用了RedisCommand分类器(cmd/stat.go),因此http-pathredis-command维度才能成立。这些分类器(Classfier)的实现位于 agent/analysis/common/classfier.go 与 agent/analysis/classfier.go。

结果解读与下钻

stat结果表中,除序号外的第二列即为--group-by指定的维度(如remote-ip),后续列maxavgp50等表示该维度下聚合记录中指标(此处为 total-time)的最大值、平均值与 50 分位值。百分位计算实现在 agent/analysis/percentile.go。

对某一行按Enter可下钻查看该维度下的具体请求-响应列表(视图与watch相同),每个记录还可继续Enter查看时延与内容详情。

快速分析三件套:slow / bigreq / bigresp

如果记不住各种选项,stat提供了三个快捷模式(定义于 cmd/stat.go):

  • --slow:分析慢请求
  • --bigreq:分析大请求
  • --bigresp:分析大响应

例如快速定位哪个远端 IP 的 HTTP 请求最慢:

./kyanos stat http --slow

找出哪个远端 IP 的请求最大 / 响应最大:

./kyanos stat http --bigreq ./kyanos stat http --bigresp

--time 10可指定采集 10 秒(stat默认采集 10 秒,可按ctrl+c提前结束)。注意stat支持watch的全部过滤选项,例如:

./kyanos stat http --slow --path /abc

核心命令之三:overview——全局依赖洞察(beta)

当需要快速了解一台机器依赖了哪些外部资源及其时延时,overview命令一条命令即可完成(docs/what-is-kyanos.md 标记为 beta 功能)。

overview的实现非常简洁(cmd/overview.go):它本质上复用了stat的分析链路,只是强制将聚合维度设置为remote-ip/protocol-adaptive——即按远端 IP 分组、并按协议自适应子分组:

overview = true groupBy = "remote-ip/protocol-adaptive"

基本用法:

sudo kyanos overview

可选的--metric标志与stat相同(默认t/total-time),用于指定统计指标。

三大命令的协作关系与适用场景

综合 docs/how-to.md 的总结,三个子命令形成完整的排查闭环:

  1. watch:按条件抓取流量并解析为请求-响应记录,查看详细内容与内核各阶段时延;
  2. stat:在 watch 的基础上对请求-响应做聚合统计,回答"哪台服务器慢、哪个客户端占带宽"等全局问题;
  3. overview:快速盘点整机的外部依赖资源与其时延,适合服务治理与容量评估。

三者共用同一套过滤选项体系(网络层/进程容器层/协议层),且均以 TUI 表格呈现、支持数字键排序与 Enter 下钻,学习成本可平滑迁移。

进一步阅读

  • 五步快速上手: docs/how-to.md
  • watch 过滤与详情视图完整说明: docs/watch.md
  • stat 聚合分析完整说明: docs/stat.md
  • 安装环境要求与 FAQ: docs/quickstart.md、 docs/faq.md
  • 从源码编译: COMPILATION.md
  • 中文版项目说明: README_CN.md
  • 源码入口与命令定义: cmd/root.go、 cmd/watch.go、 cmd/stat.go、 cmd/overview.go

【免费下载链接】kyanosKyanos is a networking analysis tool using eBPF. It can visualize the time packets spend in the kernel, capture requests/responses, makes troubleshooting more efficient.项目地址: https://gitcode.com/GitHub_Trending/ky/kyanos

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询