最新要闻
- moto X40宣布搭载骁龙8 Gen2!会抢下“真首发”吗?
- 天天热消息:NASA今天下午发射阿尔忒弥斯1号登月火箭:这次燃料还没泄漏
- 每日资讯:9499元你还抢不到?RTX 4080今日首卖 性能不俗:买它还是RX7900
- 环球聚焦:童年回忆杀!Netflix新版《天线宝宝》剧集正式上线
- 谁说谎将揭晓!特斯拉“失控”新进展:上海鉴定机构已到潮州 今天现场鉴定
- 当前视点!2.5万越南盾1只!越南顶级美食却是生态杀手 严重威胁我国
- 拿员工工资做文章的国美 差不多是要输光了
- 读写300MB/s!索尼发布新款SD卡:256GB售价3299元
- AMD Zen4超级APU首次现身:16核心32线程有戏!
- 全球实时:一上线就被夸爆!卖寿司的《捕鱼达人》 我彻底上头了
- 地球上最深的洞是怎么挖出来的?
- 卫健委权威解答:国家未调整成人高血压诊断标准
- 真是高射炮打蚊子!RTX 4080公版卡官方美图赏
- 每日关注!还有想买的吗?特斯拉中国加快产品交付:缩短至1-5周 速度提车节奏
- 环球今头条!世界人口正式达到80亿:幸运儿是一名女婴 诞生于亚美尼亚
- 环球热资讯!不用关键词 新AI搜索引擎火了 网友:刚用5分钟就设为默认
手机
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
票房这么火爆,如何请视障人士“看”一场电影?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
- 票房这么火爆,如何请视障人士“看”一场电影?
家电
全球热议:7行代码让B站崩溃3小时 竟因“一个诡计多端的0”
一个小小字符“0”,竟引得B站全面崩溃。
(资料图片)
不知你是否还记得那一夜,B站“大楼停电”、“服务器爆炸”、“程序员删库跑路”的彻夜狂欢。(手动狗头)
时隔一年,背后“真凶”现在终于被阿B披露出来——
没想到吧,就是这么简单几行代码,直接干趴B站两三个小时,搞得B站程序员彻夜无眠头发狂掉。
你可能会问,这不就是个普普通通用来求最大公约数的函数吗,怎么就有如此大的威力?
背后一桩桩一件件,归根结底其实就一句话:0,它真的不兴除啊。
具体详情,咱们还是一起来看看“事故报告”。
字符串“0”引发的“血案”
先来说道说道引发惨案的根本原因,也就是开头贴出的这个gcd函数。
学过一点编程知识的小伙伴应该都知道,这是一种用辗转相除法来计算最大公约数的递归函数。
跟我们手算最大公约数的方法不同,这个算法是酱婶的:
举个简单的例子,a=24,b=18,求a和b的最大公约数;
a除以b,得到的余数是6,那么就让a=18,b=6,然后接着往下算;
18除以6,这回余数是0,那么6也就是24和18的最大公约数了。
也就是说,a和b反复相除取余数,直到b=0,函数中:
if b==0 then return a end
这个判断语句生效,结果就算出来了。
基于这样的数学原理,我们再来看这段代码,似乎没什么问题:
但如果输入的b是个字符串“0”呢?
B站的技术解析文章中提到,这段出事的代码是用Lua写的。Lua具有这么几个特点:
这是一种动态类型语言,常用习惯里变量不需要定义类型,直接给变量赋值就行。
Lua在对一个数字字符串进行算术操作时,会尝试将这个数字字符串转成一个数字。
在Lua语言中,数学运算n%0的结果是nan(Not A Number)。
我们来模拟一下这个过程:
1、当b是一个字符串“0”时,由于这个gcd函数没有对其进行类型校验,因此在碰上判定语句时,“0”不等于0,代码中“return _gcd(b, a%b)”触发,返回_gcd(“0”, nan)。
2、_gcd(“0”, nan)再次被执行,于是返回值变成了_gcd(nan, nan)。
这下就完犊子了,判定语句中b=0的条件永远没法达到,于是,死循环出现了。
也就是说,这个程序开始疯狂地原地转圈,并且为了一个永远得不到的结果,把CPU占了个100%,别的用户请求自然就处理不了了。
那么问题来了,这个“0”它到底是怎么进去的呢?
官方说法是:
在某种发布模式中,应用的实例权重会短暂地调整为0,此时注册中心返回给SLB(负载均衡)的权重是字符串类型的“0”。此发布环境只有生产环境会用到,同时使用的频率极低,在SLB前期灰度过程中未触发此问题。
SLB在balance_by_lua阶段,会将共享内存中保存的服务IP、Port、Weight作为参数传给lua-resty-balancer模块用于选择upstream server,在节点weight=“0”时,balancer模块中的_gcd函数收到的入参b可能为“0”。
bug是如何定位的
以“事后诸葛亮”的视角来看,这个引发B站全面崩溃的根本原因多少有点让人直呼“就这”。
但从当事程序员的视角来看,事情确实没有辣么简单。
当天晚上22:52分——大部分程序员才刚下班或者还没下班的节骨眼(doge),B站运维收到服务不可用的报警,第一时间怀疑机房、网络、四层LB、七层SLB等基础设施出现问题。
然后立马和相关技术人员拉了个紧急语音会议开始处理。
5分钟后,运维发现承载全部在线业务的主机房七层SLB的CPU占用率达到了100%,无法处理用户请求,排除其他设施后,锁定故障为该层。
(七层SLB是指基于URL等应用层信息的负载均衡。负载均衡通过算法把客户请求分配到服务器集群,从而减少服务器压力。)
万般紧急之时,小插曲还现了:远程在家的程序员登上VPN却没法进入内网,只好又去call了一遍内网负责人,走了个绿色通道才全部上线(因为其中一个域名是由故障的SLB代理的)。
此时已经过去了25分钟,抢修正式开始。
首先,运维先热重启了一遍SLB,未恢复;然后尝试拒绝用户流量冷重启SLB,CPU依然100%,还是未恢复。
接着,运维发现多活机房SLB请求大量超时,但CPU未过载,正准备重启多活机房SLB时,内部群反应主站服务已恢复,视频播放、推荐、评论、动态等功能已基本正常。
此时是23点23分,距离事故发生31分钟。
值得一提的是,这些功能恢复其实是事发之时被网友们吐槽的“高可用容灾架构”发挥了作用。
至于这道防线为啥一开始没发挥作用,里头可能还有你我一点锅。
简单来说,就是大家伙点不开B站就开始疯狂刷新,CDN流量回源重试 + 用户重试,直接让B站流量突增4倍以上,连接数突增100倍到千万级别,多活SLB就给整过载了。
不过,并不是所有服务都搞了多活架构,至此事情并没完全解决。
接下来的半个小时里,大家做了很多操作,回滚了最近两周左右上线的Lua代码,都没把剩余的服务恢复。
时间来到了12点,没有办法了,“先不管bug是怎么出来的,把服务全恢复了再说”。
简单+粗暴:运维直接耗时一小时重建了一组全新的SLB集群。
凌晨1点,新集群终于建好:
一边,有人负责陆续将直播、电商、漫画、支付等核心业务流量切换到新集群,恢复全部服务(凌晨1点50分全部搞定,暂时结束了崩了逼近3个小时的事故);
另一边,继续分析bug原因。
在他们用分析工具跑出一份详细的火焰图数据后,那个搞事的“0”才终于露出了一点端倪:
CPU热点明显集中在一个对lua-resty-balancer模块的调用中。而该模块的_gcd函数在某次执行后返回了一个预期外的值:NaN。
同时,他们也发现了触发诱因的条件:某个容器IP的weight=0。
他们怀疑是该函数触发了jit编译器的某个bug,运行出错陷入死循环导致SLB CPU 100%。
于是就全局关闭了jit编译,暂时规避了风险。一切都解决完后,已经快4点,大家终于暂时睡了个好觉。
第二天大家也没闲着,马不停蹄地在线下环境复现了bug后,发现并不是jit编译器的问题,而是服务的某种特殊发布模式会出现容器实例权重为0的情况,而这个0是个字符串形式。
正如前面所说,这个字符串“0”在动态语言Lua中的算术操作中,被转成了数字,走到了不该走的分支,造成了死循环,引发了b站此次前所未见的大崩溃事件。
递归的锅还是弱类型语言的锅?
不少网友都还对这次事故记忆犹新,有回想起自己就是以为手机不行换电脑也不行的,也有人还记得当时5分钟后此事就上了热搜。
大家都很诧异,就这么一个简单的死循环就能造成如此大的网站崩服。
不过,有人指出,死循环不罕见,罕见的是在SLB层、在分发过程出问题,它还不像在后台出问题很快能重启解决。
为了避免这种情况发生, 有人认为要慎用递归,硬要用还是设置一个计数器,达到一个业务不太可能达到的值后直接return掉。
还有人认为这不怪递归,主要还是弱类型语言的锅。
以此还导致了“诡计多端的‘0’”这一打趣的说法。
另外,由于事故实在是耽误了太久、太多事儿,当时B站给所有用户补了一天大会员。
有人就在此算了一笔账,称就是这7行代码,让b站老板一下亏了大约1,5750,0000元。(手动狗头)
对于这个bug,你有什么想吐槽的?
参考链接:
[1]《2021.07.13 我们是这样崩的》by 哔哩哔哩技术
https://mp.weixin.qq.com/s/nGtC5lBX_Iaj57HIdXq3Qg
关键词: 7行代码让B站崩溃3小时 竟因一个诡计多
moto X40宣布搭载骁龙8 Gen2!会抢下“真首发”吗?
天天热消息:NASA今天下午发射阿尔忒弥斯1号登月火箭:这次燃料还没泄漏
每日资讯:9499元你还抢不到?RTX 4080今日首卖 性能不俗:买它还是RX7900
环球聚焦:童年回忆杀!Netflix新版《天线宝宝》剧集正式上线
谁说谎将揭晓!特斯拉“失控”新进展:上海鉴定机构已到潮州 今天现场鉴定
当前视点!2.5万越南盾1只!越南顶级美食却是生态杀手 严重威胁我国
拿员工工资做文章的国美 差不多是要输光了
读写300MB/s!索尼发布新款SD卡:256GB售价3299元
AMD Zen4超级APU首次现身:16核心32线程有戏!
全球实时:一上线就被夸爆!卖寿司的《捕鱼达人》 我彻底上头了
地球上最深的洞是怎么挖出来的?
卫健委权威解答:国家未调整成人高血压诊断标准
真是高射炮打蚊子!RTX 4080公版卡官方美图赏
每日关注!还有想买的吗?特斯拉中国加快产品交付:缩短至1-5周 速度提车节奏
环球今头条!世界人口正式达到80亿:幸运儿是一名女婴 诞生于亚美尼亚
环球热资讯!不用关键词 新AI搜索引擎火了 网友:刚用5分钟就设为默认
天天视讯!刘作虎:安卓现在很好用 应该不用争论了吧
当前消息!最高降价超20万元 奔驰EQ系列电动车国内大降价:16日生效
《战神:诸神黄昏》黑妹剧情被国外玩家吐槽:3小时又臭又长
地球上最干净的地方 脏兮兮的
焦点信息:神仙姐姐刘亦菲主演国产剧《梦华录》将登陆日本:岛国网友称很期待
热资讯!发射天舟五号3天后:长征七号火箭残骸已再入大气层烧毁
环球视点!居家好物 旦用难回:湿厕纸16.9元240抽狂促
编辑部吵起来了:玩手游到底有没有必要配游戏手柄?
播报:《暗黑》粉丝注意了!ROG官宣将推出《暗黑破坏神:不朽》联名手机
【新要闻】499元就能买iPhone 13同款设计!乐视Y1 Pro+发布
原是我不配!优酷诉B站UP主侵权《甄嬛传》获赔
环球观速讯丨米缸长满小虫淘米飘满盆 老人担心求助 专家:是谷盗、没有明显危害
环球快报:破我防是吧?网友列举苹果手机23大“罪状” 太真实了
环球滚动:Evo认证超高性能轻薄本!H3CBook Ultra 14T开箱图赏
天天视点!一键屏蔽陌生人评论!抖音上线“防打扰保护工具”
每日报道:饮品店推300元一杯天价柠檬茶:原料选用800元一斤鱼子酱
今日热议:9年前狂笑比亚迪没技术 造不出好产品的马斯克:如今对中国新能源服了
【全球独家】日产轩逸弯道高速超车后失控:一头扎进河沟
张雪峰称外卖员职业5-10年内可能消失:年轻人宁送外卖也不进厂根本没前途
690万元史上最贵:全球唯一红色Mac Pro顺利拍出
环球观热点:1699元 博主评Redmi Note 12:堆料调校都下了功夫了
天天关注:AI换脸好玩但很危险 Intel发布FakeCatcher检测软件:准确率96%
【天天报资讯】维修不再直接换新:苹果将为iPhone 14系列提供同机维修服务
网传小鹏汽车跟随特斯拉降价 官方回应:只是调整权益结构
天天滚动:造谣特斯拉刹车失灵的车主被判侵权:登报致歉 赔偿1万元
每日热闻!全球最大浮动式风电场投产 供电对象让人“属实没想到”
一个充电桩难倒电动车
最新消息:最后一辆纯燃油车 兰博基尼小牛Sterrato官图:超级跑车也能“越野”
动态焦点:离谱!乔布斯凉鞋拍卖顺利落幕:成交价达154万元
实时:诊断标准下调!专家:没症状不代表没患高血压 暴饮暴食很容易导致
TP-Link全球首发多款Wi-Fi 7路由:四频33Gbps、双万兆口
看热讯:B站播25年前电视剧《真命小和尚》被起诉侵权:要求下架并赔偿10万
天天亮点!全球人口今天达到80亿:印度明年将超我国人口第一 逼近17亿
通讯!谁说谎?潮州特斯拉连撞事件司机首发声:我刹车没?踩过油门吗?
90后女子上班坚持12年装50岁大妈:会网购的人几乎都认识她
每日时讯!单日市值蒸发7万亿!亚马逊启动公司最大规模裁员:计划裁掉1万人
资讯:坐拥8755亿!全球第二富豪贝索斯:会将财富捐出去做慈善 这只是数字
iPhone 14 Pro DXO电池成绩119分 高端第8:电池很小 续航很强
“突然不认识《西游记》了”登热搜:外语版让人直呼上头
世界实时: 索尼承诺玩家在今年玩到《战神5》 结果真的做到了
2024年巴黎奥运会吉祥物弗里吉公布 源自法国传统帽
世界热议:球迷表情可分析!卡塔尔世界杯将部署2.2万个摄像头
环球观察:马斯克回应火星殖民计划:生命不应只用来收拾地球烂摊子
最新:中国制造的特斯拉反向出口北美?马斯克回应了
3GHz本无压力 RX 7900系显卡频率“缩水":AMD想法大变
全球今热点:北斗立大功:新疆3000亩“超级棉田”以往需要30人管理 现在仅需2人
黑客重返《艾尔登法环》!致大量玩家被封号
RTX 4090频频烧毁:16针电源线竟有两种版本!其一很可疑
尺寸看齐宝马5系 疑似比亚迪高端品牌轿谍照曝光:配空气悬架
马斯克计划“省掉”推特免费午饭:一年能节约超9000万元
环球报道:RTX 4090 vs.3080游戏性能实测:帧数翻番一点不吹
环球要闻:小米13系列一大遗憾曝光:或取消Ultra 13S系列再上
当前观点:永恒经典!港剧《我和僵尸有个约会》电影版开拍
比亚迪全力冲刺高端市场 宝马却想做更便宜的电动汽车
世界热文:AMD Zen4不行与此有关?网友质疑Win11 22H2性能翻车
报道:女子网购电暖宝遭炸伤毁容:卖家只愿赔医药费
4K高色域高色准!雕塑家M27UA2智慧显示器评测:既是一台电视、也是一台电脑
全球热议:信息量大!特斯拉潮州失控事故家属视频回应:司机不刹车?脚垫背锅?
每日速读!电动两轮车车主注意!超威官方科普:一文看懂电池如何正确存放、安装
马斯克称自己一周工作7天:不建议学我!
全球资讯:最新全国入冬进程图:冬季覆盖一半国土 本周末南方迎来垮塌式降温
马斯克称不看好飞行汽车:没准哪天会掉下来
当前热门:每天480公里 跑了45万公里的蔚来ES6全车拆解:动力、能耗几乎无衰减
当前头条:撼迅预告第一款非公版RX 7900显卡:幽幽蓝灯 摄人心魄
全球新消息丨小米新专利公布:指纹解锁不用担心烧屏了
观天下!丰田、本田羡慕哭了:一汽-大众ID纯电车型销量达10万台
【全球聚看点】美军无人航天器X-37B在轨908天后返回地球:6次飞了3774天
潮州特斯拉狂飙2公里致2死3伤 律师:若无法鉴定刹车失灵车主或担刑责
世界上“最快的鞋”面世:时速11km/h 8430元买吗?
挑战千元级音质!真我Buds Air3S无线耳机官宣
恒大首款汽车 博主实测恒驰5续航:打了5.66折
【世界新要闻】PC要靠边站了 AMD强调EPYC将是头等大事:最大增长机会
永别了 天舟四号!明天受控再入大气层
【世界快播报】机械硬盘第二春 希捷首发二代MACH.2硬盘:性能直追SSD
【新要闻】球感无敌 无人机扔下35米高空球 内马尔两脚停下破纪录
关注:初中小伙为圆梦辞年薪20万工作造飞机 耗时7年花费70多万造了5架
当前简讯:开播一周年!《英雄联盟:双城之战》纪录片将于11月21日线上首播
环球观点:荣耀80外观首度公布:用上iPhone 14/小米Civi 2同款药丸挖孔
卖爆了!《GTA三部曲:最终版》销量或高达1400万
一女生入手Redmi Note 12潮流版:直呼“绝绝子”
环球通讯!CEO放言40万买燃油车很悲惨:车主曝智己L7中控全灭、只能蠕行
热头条丨小米11售后新政策发布:三年免费更换/维修主板
当前观点:山东黑猩猩一天一棵大葱三四瓣蒜 园方:它们很爱吃、还能消炎杀菌
司机家属逐一反驳特斯拉回应“全程无刹车动作”:有闪躲为何不会踩刹车