tcpdump 抓包! 但 tcpdump 最大的一个劣势就是排查:太 慢 了。
比如说你现在需要排查一个线上问题:
a. 首先你需要在生产环境安装一个 tcpdump 💤,
b. 然后找到出现问题的服务端的 ip 和 port👁👁
c. 然后自己写过滤表达式(可能你忘了怎么写,花了 5min 在搜索~😂)
d. 费了九牛二虎之力你终于从生产机器上下载下来一个数百 MB 的 pcap 文件💤
e. 然后安装 tcpdump 客户端(如果你还没安装的话)💤
f. 加载 pcap 文件让你的 CPU 风扇狂转 😡
g. 几分钟后你睁大双眼👁👁人肉确认你想要的那个接口在不在这这个 pcap 文件里,因为包含了太多无效信息,可不幸的是你发现根本没有🤡。。。
h. 然后你重新开始抓包,检查自己的 tcpdump 命令是否写对... 😔
我为什么要开发 Kyanos
所以要解决这个问题该怎么办呢?
tcpdump 抓包! 但 tcpdump 最大的一个劣势就是排查:太 慢 了。
比如说你现在需要排查一个线上问题:
a. 首先你需要在生产环境安装一个 tcpdump 💤,
b. 然后找到出现问题的服务端的 ip 和 port👁👁
c. 然后自己写过滤表达式(可能你忘了怎么写,花了 5min 在搜索~😂)
d. 费了九牛二虎之力你终于从生产机器上下载下来一个数百 MB 的 pcap 文件💤
e. 然后安装 tcpdump 客户端(如果你还没安装的话)💤
f. 加载 pcap 文件让你的 CPU 风扇狂转 😡
g. 几分钟后你睁大双眼👁👁人肉确认你想要的那个接口在不在这这个 pcap 文件里,因为包含了太多无效信息,可不幸的是你发现根本没有🤡。。。
h. 然后你重新开始抓包,检查自己的 tcpdump 命令是否写对... 😔
让运维装监控啊! 幸好现在出现了eBPF这一强大的技术,可以深入采集内核打点实现全栈的可观测性。 现在的 skywalking 、pixie 、deepflow 等都有着不错的产品。
但这可不容易!上述这些监控要么需要很高的内核版本(5.x),要么只能监控 K8s 的流量,要么会产生每小时 TB 级的监控数据需要很重的存储依赖。
那么有没有一款轻量级、兼容低版本内核、并且能高效率的排查 网络问题的工具呢?
what is kyanos
kyanos 是我开源的一个命令行工具👉kyanos 仓库地址👈,它支持最低 3.10 版本的内核,不需要安装任何依赖就可运行,你需要做的只是下载它的可执行文件(Release 下载地址)。
你不需要了解任何过滤语法,你只需要执行一行命令(
kyanos stat http ...
),kyanos 就能找到最慢的几个 HTTP 请求,并且发现它们耗时详情(想一想如果使用 tcpdump 会花费多少时间):这里一行命令就找到了几个最慢的请求。
如果你想打印请求响应的内容怎么办呢?,你可以这样:
可以看到请求响应内容直接打印出来了。
那么 kyanos 它具体能够做什么呢? kyanos 的主要功能包括两点:
1 、 抓取各种协议( HTTP 、MySQL 、Redis 等)的请求响应。
2 、 通过聚合 1 中抓取的流量进行更高维度的分析。
这里我不做过多介绍,直接上例子!🤞
细致入微--watch
watch 命令可以使用各种过滤条件抓取各种协议( HTTP 、MySQL 、Redis 等)的请求响应。你不需要了解任何过滤表达式的知识就能轻松抓取你想要的任何请求响应进行分析。
比如你有一个 Spring Cloud 应用,监控告警发现访问远程一个接口 /foo/bar 有时候有一些 p99 尖刺(比如超过了 1s 的请求),说明有一些长尾请求,这时你该如何确定问题的根因呢?
很简单,通过 kyanos 的 watch 命令查看那些超过 1s 耗时的请求具体耗时在哪:
它会输出类似下面的结果:
可以看到 kyanos 不仅支持请求响应的内容抓取,甚至把网络和内核的耗时都计算出来了,对排查问题是非常有帮助的!
目前 watch 支持 HTTP 、MySQL 和 Redis 协议流量的抓取(这当然不会是全部,后续会支持更多),并且支持各种过滤条件, 更多见 Github 文档:Kyanos 命令详解 Watch 部分
总览全局-stat
仅有 watch 命令只能提供一个细粒度分析的视角,Stat 则提供了更为灵活和高维度的分析能力,简单来说就是将请求响应的指标按照一些维度聚合起来,比如我想知道哪些远程 ip 的接口最慢,就通过聚合相同 ip 的请求响应来获取最慢的远程 ip 。
所以它能回答下面这些问题:
一行命令搞定:
./kyanos stat http --side client -i 5 -m n -l 10 -g conn
,每 5 秒输出请求响应在网络中的耗时最长的前 10 个 HTTP 连接,输出如下:结果输出找到了两个连接,还有耗时的 avg 、max 、pxx 等信息。
一行命令搞定:
./kyanos stat http --side client -i 5 -m p -s 10 -g none
, 每 5 秒按输出响应大小最大的前 10 个 HTTP 请求响应, 输出如下:可以看到结果中包含了响应的大小的 avg 、max 、pxx 等,还包含了 HTTP 请求的 path 信息。
--metrics
指定。kyanos 支持以下指标的聚合。--group-by
或者-g
指定 。比如我们关注不同远程服务提供的服务质量是否有差异,就可以指定-g remote-ip ,这样请求响应的统计信息就会按照不同的远程 ip 地址聚合,最终我们将会得到一个不同远程 ip 的耗时情况,更容易看出哪个远程服务存在问题。kyanos 支持以下聚合方式:更完整的使用说明见 Github: https://github.com/hengyoush/kyanos
stat 通过 watch 观察的结果,根据用户指定的聚合维度聚合(--group-by 参数),最后按照用户最关心的指标输出(--metrics 参数).
结语
啊其实有些标题党了~😄, kyanos 其实还不能真正取代 tcpdump ,比如 kyanos 目前支持的应用层协议比较有限,对于网络环境更加复杂的部署的支持还有待改进,但总的来说,其确实能提高咱们业务开发的排查效率👍。
我为什么这么自信呢?因为我是用 kyanos 真正解决过问题 的,看过我文章的朋友可能知道我是搞 Redis 的(专栏:Redis 疑难杂症 - 烈香的专栏,我的 Blog:烈香的 Blog),kyanos 帮我解决了一个非常诡异的 Redis 客户端超时但 Redis 服务端没有任何异常的问题(这个解决过程我近期会发一篇文章出来,感兴趣的朋友可以关注我哦~),这个问题在 30min 内排查出来定位到原因,kyanos 通过这一次真正验证了自身价值。所以我敢开源出来,我相信 kyanos 也能帮助到大家~