作品分享
问答交流
发现
任务
客服工单
2021 年 7 月 13 日 22:52,SRE 收到大量服务和域名的接入层不可用报警,客服侧开始收到大量用户反馈 B 站无法利用,同时内部同砚也反馈 B 站无法打开,乃至 App 首页也无法打开。
基于报警内容,SRE 第一时间猜疑机房、网络、四层 LB、七层 SLB 等底子办法出现题目,告急发起语音集会,拉各团队相干职员开始告急处理处罚(为了方便明白,下述变乱处理处罚过程做了部门简化)。
22:55 远程在家的相干同砚登岸 VPN 后,无法登岸内网鉴权体系(B 站内部体系有同一鉴权,须要先获取登录态后才可登岸其他内部体系),导致无法打开内部体系,无法实时查察监控、日志来定位题目。
22:57 在公司 Oncall 的 SRE 同砚(无需 VPN 和再次登录内网鉴权体系)发现在线业务主机房七层 SLB(基于 OpenResty 构建) CPU 100%,无法处理处罚用户哀求,其他底子办法反馈未出题目,此时已确认是接入层七层 SLB 故障,扫除 SLB 以下的业务层题目。
23:07 远程在家的同砚告急接洽负责 VPN 和内网鉴权体系的同砚后,相识可通过绿色通道登录到内网体系。
23:17 相干同砚通过绿色通道陆续登录到内网体系,开始帮助处理处罚题目,此时处理处罚变乱的焦点同砚(七层 SLB、四层 LB、CDN)全部到位。
23:20 SLB 运维分析发现在故障时流量有突发,猜疑 SLB 因流量过载不可用。因主机房 SLB 承载全部在线业务,先 Reload SLB未规复后实验拒绝用户流量冷重启 SLB,冷重启后 CPU 依然 100%,未规复。
23:22 从用户反馈来看,多活机房服务也不可用。SLB 运维分析发现多活机房 SLB 哀求大量超时,但 CPU 未过载,准备重启多活机房 SLB 先实验止损。
23:23 此时内部群里同砚反馈主站服务已规复,观察多活机房 SLB 监控,哀求超时数量大大低落,业务乐成率规复到 50% 以上。此时做了多活的业务焦点功能根本规复正常,如 App 保举、App 播放、批评&弹幕拉取、动态、追番、影视等。非多活服务暂未规复。
23:25 - 23:55 未规复的业务暂无其他立即有效的止损预案,此时实验规复主机房的 SLB。
我们通过 Perf 发现 SLB CPU 热门会合在 Lua 函数上,猜疑跟最近上线的 Lua 代码有关,开始实验回滚最近上线的 Lua 代码。
近期SLB共同安全同砚上线了自研 Lua 版本的 WAF,猜疑 CPU 热门跟此有关,实验去掉 WAF 后重启 SLB,SLB 未规复。
SLB 两周前优化了 Nginx 在 balance_by_lua 阶段的重试逻辑,避免哀求重试时哀求到上一次的不可用节点,此处有一个最多10次的循环逻辑,猜疑此处有性能热门,实验回滚后重启 SLB,未规复。
SLB 一周前上线灰度了对 HTTP2 协议的支持,实验去掉 H2 协议相干的设置并重启 SLB,未规复。
00:00 SLB 运维实验回滚相干设置仍旧无法规复 SLB 后,决定重修一组全新的 SLB 集群,让 CDN 把故障业务公网流量调治过来,通过流量隔离观察业务可否规复。
00:20 SLB 新集群初始化完成,开始设置四层 LB 和公网 IP。
01:00 SLB 新集群初始化和测试全部完成,CDN 开始切量。SLB运维继承排查 CPU 100% 的题目,切量由业务 SRE 同砚帮助。
01:18 直播业务流量切换到 SLB 新集群,直播业务规复正常。
01:40 主站、电商、漫画、付出等焦点业务陆续切换到 SLB 新集群,业务规复。
01:50 此时在线业务根本全部规复。
01:00 SLB新集群搭建完成后,在给业务切量止损的同时,SLB 运维开始继承分析 CPU 100% 的缘故原由。
01:10 - 01:27 利用 Lua 步伐分析工具跑出一份具体的火焰图数据并加以分析,发现 CPU 热门显着会合在对 lua-resty-balancer 模块的调用中,从 SLB 流量入口逻辑不绝分析到底层模块调用,发现该模块内有多个函数大概存在热门。
01:28 - 01:38 选择一台 SLB 节点,在大概存在热门的函数内添加 debug 日志,并重启观察这些热门函数的实行结果。
01:39 - 01:58 在分析 debug 日志后,发现 lua-resty-balancer 模块中的 _gcd 函数在某次实行后返回了一个预期外的值:nan,同时发现了触发诱因的条件:某个容器 IP 的 weight=0。
01:59 - 02:06 猜疑是该 _gcd 函数触发了 JIT 编译器的某个 bug,运行堕落陷入死循环导致 SLB CPU 100%,暂时办理方案:全局关闭 JIT 编译。
02:07 SLB 运维修改 SLB 集群的设置,关闭 JIT 编译并分批重启进程,SLB CPU 全部规复正常,可正常处理处罚哀求。同时保存了一份非常现场下的进程 core 文件,留作后续分析利用。
02:31 - 03:50 SLB 运维修改其他 SLB 集群的设置,暂时关闭 JIT 编译,规避风险。
11:40 在线下情况乐成复现出该 bug,同时发现 SLB 纵然关闭 JIT 编译也仍旧存在该题目。此时我们也进一步定位到此题目发生的诱因:在服务的某种特别发布模式中,会出现容器实例权重为 0 的情况。
12:30 颠末内部讨论,我们以为该题目并未彻底办理,SLB 仍旧存在极大风险,为了避免题目的再次产生,终极决定:平台克制此发布模式;SLB 先忽略注册中央返回的权重,逼迫指定权重。
13:24 发布平台克制此发布模式。
14:06 SLB 修改 Lua 代码忽略注册中央返回的权重。
14:30 SLB 在 UAT 情况发版升级,并多次验证节点权重符合预期,此题目不再产生。
15:00 - 20:00 生产所有 SLB 集群渐渐灰度并全量升级完成。
举报
Powered by CangBaoKu v1.0 小黑屋藏宝库It社区( 冀ICP备14008649号 )
GMT+8, 2025-2-6 07:46, Processed in 0.136372 second(s), 32 queries.© 2003-2025 cbk Team.