问题说明 问题说明:为第二次故障分析第一次发生故障和在协议层上使用邻接分系统对udptcp 系统进行核分析的根本原因
我们可以看到原始的微型公用代码:Kubernetes“Avalanche”(qq.com)
注意我的公关号码
Kubenetes是云层生命的基本组成部分,它已经成为发送系统组织中一个事实上的标准,如果发生一些事情发生在Kubenetes身上,那将是灾难性的。 在集装箱化过程中,我们遇到了许多有趣的失败,今天我们将分析一个雪崩案例。
在黑色星期三,突然收到大量警报:5xx的大型服务;一台计算机网络主机,CPU, 几乎高达80%;记录和档案管理等。
发现有些服务很费时, 记忆在急剧增加, Gc 正在减速, CPU, Goroutines 等。
粗略分析没有显示是哪一种结果,因此启动了应急计划,机器上的POD被移到其他机器,服务在搬迁后正常运行,流动恢复。
最初的问题已经解决,对原因的详细分析已经开始,没有从监视中清楚地分析原因,没有内核日志,OOM杀人日志在故障四分钟后没有多大价值。
但从监控的角度来看 A 的POD服务问题 尤其严重
由于急于恢复交通,该站点没有被保留到假定服务有问题的地步(当时假定Linux的某部分没有适当隔离)。
服务失灵部分监测
图片图片
主 主 主 主 主 机 主
图片图片
OOM 内核日志
图片图片
三小时后,另一台机器发生故障,用穿梭器接通电话,然后继续进行差错行动,以转移POD,导致其他三个东道方、它们所依赖的服务以及它们所依赖的服务出现问题。
只有到那时,你才意识到什么已经达到了临界点,这会导致其他机器出现问题。 因此,迅速将一些服务转移到物理部署上,而主机将立即恢复正常。
主机CPU利用率
图片图片图片
虽然问题最初已经解决,但必须继续分析其根源。
从这个角度看,大多数过程都被叫来工作, 大部分是因为呼唤的结果, 所以谷歌搜索文章有类似的问题:
https://www.cnblogs.com/tencent-cloud-native/p/14481570.html
然而,还不可能得出这种仓促的结论,这仍需进一步分析。
线上机器的内核较老,版本为3.10.0-1160.36.el7.x86_64,由于有 tcp 和 udp 流量,对两项协议都进行了分析。
从系统呼叫开始分析
代码语言: txt 副本
代码语言: txt 副本
Inet_ sendmsg 调用不同的协议发送功能,
udp: udp_ sendmsg; tcp: tcp_ sendmsg
Udp 代码语言: txt 副本
对功能的最后呼叫
tcp 代码语言: txt 副本
代码语言: txt 副本
代码语言: txt 副本
最后被调用到函数
代码语言: txt 副本
这就是重点!
呼叫邻居的子系统
代码语言: txt 副本
下一跳到网关并返回网关地址。 下一跳到 POD IP 地址, 所以对于 Macvlan 的网络结构, 在同一主机的两个 POD 之间可以访问两个 ARP 列表 。
代码语言: txt 副本
查找 ARP 表格项目
ipv4_neigh_bookup_noref 根据出口设备“ 单项标记” 和目标 ip 计算灰值, 然后在 rp hash 表格中发现是否存在此正数条目, 所以存储在 rp hash 表格中的条目是全球性的?
dev: 能够到达邻居的装置是 dev 设备指针的值, 指针位于内部核状态, 因此它可以被视为设备的唯一识别特性 : pip: L3 级目标地址( 下一个跳跃地址) 代码语言: txt 副本
创建邻居的表格项
如果 ARP 缓存表不存在, 创建、 创建失败、 返回- ENVAL 。 这就是问题所在, 没有内核日志, 并返回误导错误代码, 导致无法快速找到原因 。
幸运的是,在Linux neneel 5.x内核代码中, 你打印错误的信息:
代码语言: txt 副本
分布邻居,如果 ARP 缓存超过 gc_thresh3, 强制使用 1 gc 。
如果 gc 不恢复任何过期的ARP 记录, 且条目数量超过 gc_threshsh3, 则返回 NULL, 邻居列表的标记失败
代码语言: txt 副本
ARP表格是再循环的,在回收过程中需要写入锁。
如果成功恢复,返回1,返回1,否则返回0
代码语言: txt 副本
代码语言: txt 副本
ARP
下文的源码分析已不再重要。
将邻里状态从NUD_none改为NUD_INCOMPLETTE
代码语言: txt 副本
处理对ARRP答复的处理
代码语言: txt 副本
旋转锁定
更改邻居的手表需要购买一个书写锁,这是一个旋转锁。
代码语言: txt 副本
根源。
原因已经很清楚,因为项目设计文件之间的沟通导致ARP表格中有两个ARP记录,如果东道飞机上有更多的PAD,将有许多ARP名单,Linux将限制ARP的规模。
内核参数
意意意意意意意 意思
默认值
/proc/sys/net/ipv4/neigh/default/base_reachable_time
可达状态基数
30秒 30秒 30 seconds.
/proc/sys/net/ipv4/neigh/default/gc_stale_time
Stale 状态过期失效时间
60秒,60秒,60秒,60秒,60秒,60秒,60秒,60秒,60秒,60秒,60秒,60秒,60秒,60秒,60秒,60秒,60秒,60秒,60秒,60秒,60秒,60秒,60秒,60秒,60秒,60秒,60秒,60秒,60秒,60秒,60秒,60秒,60秒,60秒,60秒,60秒,60秒,60秒,60秒,60秒,60秒,60秒,60秒,60秒,60秒,60秒,60秒,60秒,60秒,60秒,60秒,60秒,60秒,60秒,60秒,60秒,60秒,60秒,60秒,60秒,60秒,60秒,60秒,60秒,60秒,60秒,60秒,60秒,60秒。60秒,60秒,60秒,60秒,60秒,60秒,60秒,60秒,60秒。
/proc/sys/net/ipv4/neigh/default/delay_first_probe_time
延迟状态到期用于探测的时间
五秒钟
/proc/sys/net/ipv4/neigh/default/gc_interval
gc 启动周期时间
30秒 30秒 30 seconds.
/proc/sys/net/ipv4/neigh/default/gc_thresh1
可保留的最低时间表数目
128
/proc/sys/net/ipv4/neigh/default/gc_thresh2
最高记录最长记录的软限制
512
/proc/sys/net/ipv4/neigh/default/gc_thresh3
对最高记录限制的硬性限制
1024
ARP 废物回收处理机制
桌上的废物回收是同步和现成的:
同步: 当调用 gc_ interval 指定周期gc 时, naigh_ alloc 函数作为组执行 。
恢复战略?
表号 < gc_thresh1: 没有处理 gc_thresh1 = < ar 列表号 < gc_thresh2 > : 根据 gc_interval gc_thresh2 定期启动 ARP 计划废物回收时间表 < arp 表号 < gc_thresh3-5 * HZ (一般为5秒) 计划号废物回收项目 > gc_thresh3: 立即启动 ARP 表格废物回收
ARP 表格项目 状态转换
图片图片
来源来源:理解Linux网络内部
如图所示,只有两个州的ARP记录可以收回:
失效状态过期后失败
结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论结论
由于我们的千兆瓦网以马克夫兰网络为基础,每个POD将被指定一个马克地址,以便同一主机的POD之间的访问将产生两份ARP名单。
因此,当ARP名单超过时,即开始收回ARP表格,而当没有可收回的条目时,分发失败导致系统调用失败。
上层很可能会不断重新测试,还会有发送内核数据的其他交通电话。 归根结底,只要数据接收方的ARP记录不在ARP表上,它将导致废物回收,这需要锁住才能让ARP表穿行,尽管时间很短。 但通向写入锁的整个时间很长,导致大量锁竞争(轮换 ), 导致CPU激增,造成故障。
将 gc_thresh 更改为子代码语言: txt 副本
其他项目设计品达到ARP表格阈值代码语言的打印件: txt 副本
Ping不在ARP桌上 Ping的命令被卡住了
代码语言: txt 副本
大代码语言将被更改: txt 副本
Ping 命令立即恢复代码语言: txt 复制
当ARP参数在线上计算机主机的参数被更改时,不存在此类问题。
代码语言: txt 副本
虽然这个问题发生在宽网上,但本质上是由于对底部操作系统控制不足。
注册有任何问题请添加 微信:MVIP619 拉你进入群
打开微信扫一扫
添加客服
进入交流群
发表评论