- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章快速界定故障:Socket Tracer网络监控实践由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
。
开篇综述:Socket Tracer定位是传输层(Socket&TCP)的指标采集工具,通过补齐网络监控的这部分盲区,来达到快速界定网络问题的目标.
。
随着软件应用的集群化、容器化、微服务化,产品的稳定性越来越依赖网络。现有的专有云和一体机产品,部署在裸机,从硬件服务器、交换机到os都是不可靠的,且监控盲区较多,其中网络是重灾区。对于网络不稳定导致的中间件链接超时、设备掉线、视频推流卡顿等问题,缺乏有效的网络层监控指标定界问题。一旦现场不存在,由网络引发的问题很难定位。现有的网络监控方案,都集中在网卡维度做流量、错包等指标统计,粒度过粗,只有从Socket和TCP连接维度,监控socket缓存状态,采集TCP建连、断开、实时流量、延迟、重传等信息,才可以最直接的反映业务的网络状态.
。
现有的网络监控工具如 ss、netstat 等,可以显示服务器当前 Socket 状态快照,在问题现场可以有效的辅助我们排查问题。当现场不存在,我们希望能有工具能保存历史网络状态。然而单纯记录历史 Socket 五元组信息,在复杂拓扑场景是不够的,因为IP很可能是动态的,还须将当前时刻的 Socket 连接和业务属性(Pod Name、设备身份...)关联,才能达到还原问题现场,快速界定故障域的目的.
1.典型场景 。
2.能力综述 。
Socket维度信息采集 。
云原生监控方案适配 。
指标选取原理 。
TCP的指标有很多,为什么采集上述的指标信息,出发点是希望找到可以反映应用程序状态和网络连通状态指标,如果有其它指标采集建议也欢迎留言。下面展开分析下上述指标的采集原因:
1)TCP Retransmit 。
包重传的超时时间是RTO,通常是200ms左右,当我们观察到一段时间出现了TCP包重传,后续又恢复正常了,可以判断这个时间段出现了网络抖动, 就可以找网络的同学来帮忙排查问题了.
2)TCP SRTT 。
RTT(round-trip time)为数据完全发送完(完成最后一个比特推送到数据链路上)到收到确认信号的时间.
SRTT(smoothed round trip time)是平滑过的RTT.
通过srtt历史曲线图或柱状图,观察出来延迟的区间变化,就可以知道网络连接的srtt是否抖动。如果业务延迟发生了抖动,srtt很稳定,就可以说明大概率不是网络的问题,可能是业务的问题,或者调度的问题等等; 反之,如果srtt也发生了抖动,那么可以先检查一下网络连接.
3)TCP Tx/Rx 。
监控链接的流量,结合对现场业务的理解,在业务出现丢失数据场景,可以辅助定位时网络问题还是应用问题:
4)TCP reset reasons 。
Reset 包是导致TCP异常断开的常见原因之一,下面对可能触发 reset 事件的原因做一个汇总(如有错漏欢迎补充):
。
Socket Tracer 使用 eBPF+Tracepoint 捕捉 TCP 的 reset&new&close 等事件,使用 netlink + tcp_diag 周期抓取内核 Socket 信息快照.
1.eBPF 。
背后的思想是:“与其把数据包复制到用户空间执行用户态程序过滤,不如把过滤程序灌进内核去”.
eBPF 是一个在内核中运行的虚拟机,它可以去运行用户。在用户态实现的这种 eBPF 的代码,在内核以本地代码的形式和速度去执行,它可以跟内核的 Trace 系统相结合,给我们提供了几乎无限的可观测性.
eBPF 的基本原理:它所有的接口都是通过 BPF 系统调用来跟内核进行交互,eBPF 程序通过 LVM 和 Cline 进行编译,产生 eBPF 的字节码,通过 BPF 系统调用,加载到内核,验证代码的安全性,从而通过 JIT 实时的转化成 Native 的 X86 的指令。eBPF整体架构如下:
2.kprobe 。
当安装一个kprobes探测点时,kprobe首先备份被探测的指令,然后使用断点指令(即在i386和x86_64的int3指令)来取代被探测指令的头一个或几个字节.
当CPU执行到探测点时,将因运行断点指令而执行trap操作,那将导致保存CPU的寄存器,调用相应的trap处理函数,而trap处理函数将调用相应的notifier_call_chain(内核中一种异步工作机制)中注册的所有notifier函数,kprobe正是通过向trap对应的notifier_call_chain注册关联到探测点的处理函数来实现探测处理的.
当kprobe注册的notifier被执行时,它首先执行关联到探测点的pre_handler函数,并把相应的kprobe struct和保存的寄存器作为该函数的参数,接着,kprobe单步执行被探测指令的备份,最后,kprobe执行post_handler。等所有这些运行完毕后,紧跟在被探测指令后的指令流将被正常执行.
3.tracepoint 。
tracepoint和kprobe相比,tracepoint是一个静态的hook函数,是预先在内核里面编写好才使用。tracepoint实现是基于hooks的思想,在函数的入口就被放置一个probe点,这个probe点就会跟踪调用这个函数的各种信息,并将追踪的信息保存到一个环形队列中去,如果用户希望读取这些内核,就会通过debugfs形式来访问.
4.方案选型 。
eBPF 调用方案 。
对比调用eBPF能力的三种方案,bpftrace / bcc / libbpf,最终选择bcc:
Socket 信息采集方案 。
eBPF+kprobe在目标函数上动态挂载hook函数,在高频调用(收发包函数)的场景额外开销较大,因此在周期统计socket链接收发数据量、重传次数等场景,我们参考 ss 的实现,基于 linux netlink + tcp_diag 内核模块,该方案适合应用主动抓取某个时间点socket 统计信息快照,可以减少额外性能开销.
5.整体架构图 。
。
1.命令行参数定义 。
包含Socket采集过滤配置文件路径,socket信息采集周期,vm-insert的URL地址.
2.Socket采集过滤配置文件格式 。
一台服务器上的Socket连接数量非常多,数据量和比较大,我们往往只关心部分服务的相关连接,就像tcpdump我们也往往会对IP和端口做过滤一样。过滤配置文件使用yaml格式,定义如下:
。
1.Grafana Dashboard 。
下图中,连接到 redis server 的所有TCP连接(来自不同的Client+Port)都会被监控,展示总并发连接数和连接的 rtt(延迟) 等信息:
。
2.内核版本依赖(>=4.9) 。
Socket 信息采集依赖 tcp_diag 内核模块.
eBPF 还在快速发展期,内核中的功能也日趋增强,一般推荐基于Linux 4.4+ (4.9 以上会更好) 内核的来使用 eBPF。部分 Linux Event 和 BPF 版本支持见下图:
原文链接:https://zhuanlan.51cto.com/art/202108/675952.htm 。
最后此篇关于快速界定故障:Socket Tracer网络监控实践的文章就讲到这里了,如果你想了解更多关于快速界定故障:Socket Tracer网络监控实践的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
如何更改循环中变量的名称?比如 number1 、 number2 、 number3 、 number4 ? var array = [2,4,6,8] func ap ( number1: Int
我想设置 View 的背景颜色并在一定延迟后将其更改为另一种颜色。这是我的尝试方式: print("setting color 1") self.view.backgroundColor = UICo
我在使用 express-session 时遇到问题。 session 数据不会在请求之间持续存在。 正如您在下面的代码中看到的那样,/join 路由设置了一些 session 属性,但是当 /sur
我试图从叶渲染器获得一个非常简单的结果,用于快速 Steam 的 for 循环。 我正在上传叶文件 HTML,因为它不接受此处格式正确的代码 - 下面的pizza.swift代码- import
你们中有人有什么好的链接可以与我分享吗?我正在寻找一个 FAST 程序员编辑器,它可以非常快速地打开包含超过 100, 000 行代码的文件?我目前正在使用记事本自动取款机,打开一个 29000 行长
我现在正在处理眼动追踪数据,因此拥有一个巨大的数据集(想想数百万行),因此希望有一种快速的方法来完成此任务。这是它的简化版本。 数据告诉您眼睛在每个时间点正在查看的位置以及我们正在查看的每个文件。 X
我是新手,想为计时器或其他设备选择提示音。 如何打开此列表,以选择其中一种声音? Alert sound list 最佳答案 您将无法在应用中使用系统声音。 但是,您可以包括自己的声音文件,并将其显示
我编写了以下代码来构建具有顺序字符串的数组。 它的工作方式与我预期的一样,但我希望它能更快地运行。有没有更有效的方法在PowerShell中产生我想要的结果? 我是PowerShell的新手,非常感谢
我有一个包含一些非唯一行的矩阵,例如: x 尝试 y <- rle(apply(x, 1, paste, collapse = " ")) # y$lengths is the vector con
我的函数“keyboardWillShown”有问题。所以我想要的是菜单打开时,菜单正好出现在键盘上方。它可以在Iphone 8 plus,8、7、6上完美运行。但是,当我在模拟器上运行Iphone
我正在尝试通过Swift 5中的HTTP get方法从API提取数据。它在启动时成功加载了数据,但是当我刷新页面时,它说“索引超出范围”,这是因为数据是不再会在我的日志中读取,因此索引中没有任何内容。
我想做什么: 从我的数据库中获取时间戳并将其转换为用户的时区。 我的代码: let tryItNow = "\(model.timestampName)" let format = D
给定字体名称和字体大小,如何查找字符串的宽度(CGFloat)? (目标是将UIView的宽度设置为足以容纳字符串的宽度。) 我有两个字符串:一个重复“1”,重复36次,另一个重复“M”,重复36次。
我正在尝试解析此JSON ["Items": ( { AccountBalance = 0; AlphabetType = 3; Description = "\U0631\U
我在UINavigationBar内放置了一个UILabel。 我想根据navigationBar的高度增加该标签的字体大小。当navigationBar很大时,我希望字体大小更大;当滚动并缩小nav
我想将用户输入限制为仅有效数字并使用以下内容: func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, rep
目前我有一个包含超过 100.000 张图像的数据库,它们大小不一或类似,但我想为我的公司制作以下内容: 我插入/上传一张图片,系统返回最有可能相同的图片。我不知道使用什么算法,但它需要快速。我可以预
在我的 swift 项目中,我有一个按钮,我想在标签上打印按下该按钮的时间。 如何解决这个问题? 最佳答案 添加到DHEERAJ的答案中,您只需在func press(sender: UIButton
我必须发表评论,尝试在解析中导入数组。然而,有一个问题。 当我尝试从 Parse 加载数组时,我的输出是 ("Blah","Blah","Blah")这是一个元组...而不是一个数组 TT... 如何
我的应用程序有一个名为 MyDevice 的类,我用它来与硬件通信。该硬件是可选的,实例变量也是可选的: var theDevice:MyDevice = nil 然后,在应用程序中,我必须初始化设备
我是一名优秀的程序员,十分优秀!