Memcached 的惹祸,.NET 5.0 的背锅
抱歉,拖到现在才写这篇为 .NET 5.0 洗白的博文(之前的博文),不好意思,又错了,不是洗白,是还 .NET 5.0 的清白。
抱歉,就在今天上午写这篇博客的过程中,由于一个bug被迫在访问高峰发布,在10:30~11:10再次引发上次遇到的同样故障,由此给您带来麻烦,请您谅解。
2020年10月14日晚上我们发布了升级至 .NET 5.0 RC 2 的博客系统,在正式版发布之前进行升级不是我们想追求前卫,而是因为:
- 微软官博已经说明可以用于生产环境
RC2 is a “go live” release; you are supported using it in production.
- 正则表达式性能大幅提升(Regular expression performance improvements)
On many of the expressions we’ve tried, these improvements routinely result in throughput improvements of 3-6x, and in some cases, much more.
- Json 序列化性能提升
JsonSerializer performance is significantly improved in .NET 5.0.
- 想使用 EF Core 5.0 的新特性(What's New in EF Core 5.0)
最吸引我们的是第2点,博客系统的代码中用了很多正则表达式,是耗CPU大户。
而且升级很简单:
- TargetFramework 由
netcoreapp3.1改为net5.0 - 更新 nuget 包
- 容器镜像
mcr.microsoft.com/dotnet/core/sdk:3.1改为mcr.microsoft.com/dotnet/sdk:5.0,mcr.microsoft.com/dotnet/core/aspnet:3.1改为mcr.microsoft.com/dotnet/aspnet:5.0
发布后从第2天上午访问高峰的监控数据看,CPU消耗降了10%,效果不错。
轻松升级,提前享受 .NET 5.0 的性能提升,印象中这是我们在 .NET Core 大版本升级历史中最惬意的一次。
下午我们带着升级后的喜悦心情欢迎新人的加入,现在能够遇到有兴趣学习 .NET 的新人也是不容易的,好了,现在可以直接学 .NET 5.0 了。就在新人欢迎会期间,网站出现了故障,昨晚升级到 .NET 5.0,今天下午就出故障,最大的嫌疑对象显然是 .NET 5.0,当机立断地进行回退操作,如果回退到升级之前的版本能恢复正常,那 .NET 5.0 就罪责难逃。
用下面的脚本在k8s集群上将部署回退到升级之前的容器镜像
./deploy-blog.sh 2.3.73
回退完成之后,很快恢复正常,铁证如山,随后我们立即发博宣判——博客系统升级到 .NET 5.0 引发的故障,让还未正式出茅庐的 .NET 5.0 就背上一口沉重的锅。
幸好有开发同事没有这么片面地看待问题,对故障进行了进一步分析,发现故障与 memcached 服务器的 tcp 连接数异常高有关,大量的数据库连接超时是因为连不上 memcached (达到了1万的最大连接数限制)造成大量请求直接访问数据库引起的。更进一步地,还找到了重现问题的方法,多次点击某些博客,就能让 memcached tcp 连接数飙升,排查后发现这些博客需要被缓存的数据超过了1M,超出了 memcached 单个缓存项的大小限制(默认就是1M),造成数据永远无法被缓存,但每次都要徒劳地读写 memcached 服务器。我们针对这个问题进行了修复,修复后重新发布了 .NET 5.0 版,观察几天后没有再次出现故障。
我们错怪了 .NET 5.0,我们的一时武断让 .NET 5.0 在即将出道之前先背锅,我们向 .NET 5.0 说抱歉,向被误导的 .NET 开发者说抱歉,我们会吸取教训,在故障发生后不要急于发博文,先全面分析问题,不能因为我们的一时误判产生误导。
虽然修复了问题,用上了 .NET 5.0,但问题背后的真正原因至今没有弄明白——仅仅几次鼠标点击,缓存数据超过1M,就能让 memcached 服务器的 tcp 连接数飙升?可能与我们使用的 memcached 客户端 EnyimMemcachedCore,待以后再找时间研究。
今天在写这篇博文的期间,再次遇到这个故障,看来有缘分,想躲也躲不过去了。今天发生故障与访问高峰发布有关,但之前我们评估过访问高峰发布的影响,也就5-10分钟左右访问速度变慢,不会产生如此大的重创。这次故障与上次是同样的表现,memcached tcp 连接数异常高,频频达到1万的最大连接数限制,打开网页速度慢就是因为在等待与 memcached 服务器建立 tcp 连接,重启 memcaced 于事无补,很快就会再次飙升至1万,平时访问高峰也就5000左右的连接。
从 memcached 服务器的其他指标看,虽然上万的 tcp 连接,但并没有不堪重负,难道仅仅是车多路窄造成的堵车引起大家都通行缓慢?那把路拓宽不就行了,于是将 memcached 服务器的 tcp 最大连接数限制由1万拓宽到2万,本担心连接数会飙升到2万,但没想到竟然恢复正常了。可能是某种特殊情况造成需要稍过万的 tcp 连接,但最大连接数限制把大家都堵住了,看来代码世界也最怕堵车。

今天集中3个多小时的时间才完成这篇粗糙的博文,在故障后分享一篇博文也不是一件容易的事。
Memcached 的惹祸,.NET 5.0 的背锅的更多相关文章
- 《.NET 5.0 背锅案》第3集-剧情反转:EnyimMemcachedCore 无罪,.NET 5.0 继续背锅
今天晚上基于第2集中改进版的 EnyimMemcachedCore 进行了发布,发布过程中故障重现,最大的嫌犯 EnyimMemcachedCore 被证明无罪,暂时委屈 .NET 5.0 继续背锅. ...
- 《.NET 5.0 背锅案》第7集-大结局:捉拿真凶 StackExchange.Redis.Extensions 归案
第1集:验证 .NET 5.0 正式版 docker 镜像问题 第2集:码中的小窟窿,背后的大坑,发现重要嫌犯 EnyimMemcachedCore 第3集-剧情反转:EnyimMemcachedCo ...
- 《.NET 5.0 背锅案》第4集:一个.NET,两手准备,一个issue,加倍关注
第1集:验证 .NET 5.0 正式版 docker 镜像问题 第2集:码中的小窟窿,背后的大坑,发现重要嫌犯 EnyimMemcachedCore 第3集-剧情反转:EnyimMemcachedCo ...
- 《.NET 5.0 背锅案》第5集-案情大转弯:都是我们的错,让 .NET 5.0 背锅
第1集:验证 .NET 5.0 正式版 docker 镜像问题 第2集:码中的小窟窿,背后的大坑,发现重要嫌犯 EnyimMemcachedCore 第3集-剧情反转:EnyimMemcachedCo ...
- 《.NET 5.0 背锅案》第6集-案发现场回顾:故障情况下 Kubernetes 的部署表现
第1集:验证 .NET 5.0 正式版 docker 镜像问题 第2集:码中的小窟窿,背后的大坑,发现重要嫌犯 EnyimMemcachedCore 第3集-剧情反转:EnyimMemcachedCo ...
- 【故障公告】Memcached 的“惹祸”,不知在为谁背锅
在 .NET 5.0 背锅 . Memcached 的惹祸 .缓存雪崩之后,我们没有找到问题的真正原因,我们知道没有找到根源的故障总是会再次光临的,不是在这周就是在下周,也许就在双11前后. 就在今天 ...
- 《.NET 5.0 背锅案》第2集:码中的小窟窿,背后的大坑,发现重要嫌犯 EnyimMemcachedCore
在第1集的剧情中,主角是".NET 5.0 正式版 docker 镜像",它有幸入选第1位嫌疑对象,不是因为它的嫌疑最大,而是它的验证方法最简单,只需要再进行一次发布即可.我们在周 ...
- C++ 是 编程界 的 背锅侠
C++ 是 编程界 的 背锅侠, C++ 背的包袱 之 庞大复杂, 举世瞩目, 令人感动 . C++ 标准 委员会 俨然 已成了一个 职业 . C++ 把 静态编译 体系 发展到 庞大复杂, C ...
- 大公司病,为什么要PPT背锅?
新东方年会上,一曲吐槽式的<释放自我>火遍网络,据说这六位员工,是冒着被解雇的风险完成演出的,歌词内容涉及到非常敏感的大企业病,如机构臃肿.效率低下.内耗甩锅.拍领导马屁等等,而最高潮的部 ...
随机推荐
- Flutter中如何方便的获取音视频的长度
此次主要是flutter集成im,在发送视频时需要加上时长,但是用视频controller只能在初始化时具备路径才可以可以使用:just_audio插件中的方法进行获取 详情看官方文档:https:/ ...
- 有关图的连通性的Tarjan算法
割点与桥 在一个无向连通图中,若将某个点及其相连的边删除后,图就不连通了,则这样的点被称为割点. 在一个无向连通图中,若将某条边删除后,图就不连通了,则这样的边被称为割边,即桥. 在一张图中求出割点或 ...
- python中浅拷贝和深拷贝的区别
浅拷贝 可变类型浅拷贝copy函数就是浅拷贝,只对可变类型的第一层对象进行拷贝,对拷贝的对象开辟新的内存空间进行存储,不会拷贝对象内部的子对象可变类型:a = [1, 2, 3] b = [11, 2 ...
- JS进阶系列-JS执行期上下文(一)
❝ 点赞再看,年薪百万 本文已收录至https://github.com/likekk/-Blog欢迎大家star,共同进步.如果文章有出现错误的地方,欢迎大家指出.后期将在将GitHub上规划前端学 ...
- 音频数据增强及python实现
博客作者:凌逆战 博客地址:https://www.cnblogs.com/LXP-Never/p/13404523.html 音频时域波形具有以下特征:音调,响度,质量.我们在进行数据增强时,最好只 ...
- Django新手图文入门教程
版权所有,转载需注明来源! 本文是广受大家欢迎的<Django1.10新手图文入门教程>的2.1版本升级篇,原1.10版本传送门点击我 本文面向有一些的Python基础,但刚接触web框架 ...
- 谈谈数据库的事务ACID
在数据库中新建一个字段并且设置为索引列,还有删除整张表的数据,类似这些操作都是一系列操作的组合,执行后不能出现中间状态,也就是不会出现新建了字段却不是索引的情况,也不会出现只有一部分数据被删除的情况. ...
- c++中CreateEvent函数
参考:https://blog.csdn.net/u011642774/article/details/52789969 函数原型: HANDLE CreateEvent( LPSECURITY_AT ...
- Noip 2013 真题练习
Day1 T1 转圈游戏 Link 一句话题意: 让你求 \({x + m \times 10^k} \bmod n\) 的结果. 直接套上快速幂的板子. code #include<iostr ...
- 2017-01-26--编译Linux内核2.6.30版本报错解决
错误一: LD .tmp_vmlinux1 init/built-in.o: In function `run_init_process': /home/ox/tq2440/opt/EmbedSky/ ...