2周 2.5k星的成长之路
2024 年 9 月份我开始了 kyanos 的构思与开发,在 11 月发布 1.4.0 版本之后短短两周获得了2.5k star,目前已经有 3.7k star,下面是 kyanos 的涨星趋势图:
下面介绍下这些 star 主要是从哪来的,也许可以给你一些启发
- 从 0 ~ 200 个 star:在v2ex + 掘金 + CSDN + ... 上发布 kyanos 介绍博客:《别再用tcpdump抓包了!用 kyanos 只需1秒一键排查网络问题》
- 从 200 ~ 1000 个 star:kyanos 被发表在 hackernews 上:Kyanos: eBPF-based network issue analysis tool, 这一波直接涨到了 1k,我还高兴的发了一个朋友圈。
- 从 1000 ~ 到 1200 个 star:在 hellogithub 上提 issue 自荐:【开源自荐】基于 eBPF 的网络问题排查命令行工具,这一波也涨了不少,而且是之后上github trending的重要前提。
- 从 1200 到 2500:不太了解GitHub 官方的算法,总之上了 Github trending 后star哗哗涨,待了三天左右涨了1k+ star。
- 从 2500 到 3700:持续缓慢增长。
kyanos 是什么
仓库地址:github.com/hengyoush/k...
Kyanos 是一个基于eBPF的网络问题分析工具,你可以用它来抓取业务请求,比如HTTP请求、Redis请求、MYSQL请求等,还可以帮你分析异常链路,快速排查业务故障,而不需要繁琐的抓包,下载,分析等步骤,并且拥有良好的兼容性,大多数情况下无需任何依赖一行命令即可开始分析。
五大亮点
- 可根据进程id/容器id/pod名称过滤流量。
- 内核耗时细节探测,可以知道请求数据从进程发送到网卡的耗时,也能知道响应从网卡读取到进程花费的耗时。
- 可聚合分析,比如一行命令就可以找到最慢的HTTP请求到了哪些服务端,找到哪些请求的占用的带宽最大。
- SSL 加密流量自动解密(目前支持 openssl 和 gotls)。
- 零依赖,无任何存储依赖,也无需安装其他分析软件如wireshark,就地分析。
下面让我们来看一下如果线上一个应用存在Redis缓存慢查询,该如何定位。
Case 1:一行命令找到慢请求并且搞清楚到底慢在哪
bash
# 找到超过100ms的redis请求
./kyanos watch redis --latency 100
输入命令后,会展示如下的表格,每个请求响应记录会记录在表格中的一行,每列记录这个请求的基本信息。你可以通过方向键或者j/k上下移动来选择记录:
按下enter
进入详情界面:
详情界面里第一部分是 耗时详情。
第二部分是 请求响应的具体内容,图中的示例是HTTP协议,分为 Request 和 Response 两部分,超过 1024 字节会截断展示。
内核耗时可视化详细解析
下面这张图片是一个容器内部进程发送HTTP请求到外部 www.baidu.com 的示例:
每一个方块代表数据包经过的节点,从上面依次看起,第一个是Process,代表请求从进程发出,到右边第二个节点eth0@if483,这是容器内部的网卡设备,后边有一个(used:0.02ms)代表从上一个节点process到容器内部网卡花费了0.02ms。
以此类推,再到右边的eth0即为宿主机网卡,并且可以知道从容器网卡到虚拟机网卡花费了0.02ms。
然后请求从网卡发出,到网卡接收到响应(即为图中所示的向下箭头),花费了13.37ms,之后就是响应接收的流程,从右往左。
接着容器接收响应花费0.06ms,再到响应数据复制到TCP缓存区花费了0.06ms,最后进程从缓冲区读取数据花费了0.11ms。
可以清楚的看到请求从进程发送到网卡,响应再从网卡复制到Socket缓冲区并且被进程读取的流程和每一个步骤的耗时。
Case 2: 分析客户端请求的数据大小并且找出最大的客户端ip
当我们维护一个服务时,如果有客户端请求的接口响应过大而且qps很高,那么很容易把网络带宽占满,在发生这种情况时如何能快速定位是哪些客户端在请求,并且搞清楚请求的具体内容是什么以便快速解决问题。
以往这种问题可能需要多种工具支持,比如先通过iftop找到哪些客户端流量最大,然后针对这些客户端ip抓包,而且抓包后还需要借助wireshark辅助分析,排查效率相对较低。
使用kyanos只需要一行命令即可查看哪些远程ip请求的数据最多:
bash
./kyanos stat --bigresp
如下所示:
这张表的每个记录代表一个远程ip的所有响应的聚合结果,可以看到第一个ip:172.17.43.77的最大响应(max列)是 18181,平均响应大小。还能按下数字键排序对应列。
我们看到第一行是平均响应大小最大的,可以按下enter,这样就可以选择到这个远程ip的每条请求响应了。如下所示:
和case1一样可以选择具体的记录,查看其请求到底是什么从而确定响应过大的原因。
未来展望
kyanos是一个很新的项目,自从正式版发布只有4个月,非常欢迎贡献者,我整理了一份适合新手上手的issue清单: 新手任务-issue列表,希望未来和社区一起沉淀一个强大好用的工具。
后续我计划从以下几个方面推进 kyanos 的建设:
- 支持更多的协议,例如:DNS、GRPC、Dubbo、Postgres等。
- 采集内核的丢包、重传输事件等,提供优化建议。
- 支持应用的持续性能分析,从更多视角分析网络性能问题的根因。
相关链接
github repo:github.com/hengyoush/k...
docs website: kyanos.io/