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背锅?
新东方年会上,一曲吐槽式的<释放自我>火遍网络,据说这六位员工,是冒着被解雇的风险完成演出的,歌词内容涉及到非常敏感的大企业病,如机构臃肿.效率低下.内耗甩锅.拍领导马屁等等,而最高潮的部 ...
随机推荐
- Java高级开发必会的50个性能优化的细节(珍藏版)
在JAVA程序中,性能问题的大部分原因并不在于JAVA语言,而是程序本身.养成良好的编码习惯非常重要,能够显著地提升程序性能. ● 1. 尽量在合适的场合使用单例 使用单例可以减轻加载的负担,缩短 ...
- TP6 数据库管理工具,生成前后台CRUD页面
Tp6 数据库管理工具,数据库内容的搬运工 支持MySQL数据库,可视化配置直接生成前后台CRUD页面减少重复劳动,可以直接作为后台页面使用.前端页面技术基于 iszsw/surface 支持多表关联 ...
- 文档驱动 —— 表单组件(六):基于AntDV的Form表单的封装,目标还是不写代码
开源代码 https://github.com/naturefwvue/nf-vue3-ant 也不知道大家是怎么写代码的,这里全当抛砖引玉 为何封装? AntDV非常强大,效果也非常漂亮,功能强大, ...
- JavaEE的核心API与组件
JAVAEE Java ee 平台由一整套服务(Services).应用程序接口(APIs)和协议构成,它对开发基于Web的多层应用提供了功能支持,下面对JAVAEE中的13种技术规范进行简单的描述( ...
- 使用内置对象Math.random实现猜数字游戏
function getRandom(min,max){ return Math.floor(Math.random()*(max-min+1))+min; //得到两个数之间的随机整数,包含实 ...
- 【extern】【static】
C语言根据变量的生存周期来划分,可以分为静态存储方式和动态存储方式. 静态存储方式:是指在程序运行期间分配固定的存储空间的方式.静态存储区中存放了在整个程序执行过程中都存在的变量,如全局变量. 动态存 ...
- nessus 家庭版安装教程(windows)
1.根据系统选择安装包:https://www.tenable.com/products/nessus/select-your-operating-system 2.申请激活码,在我们安装的时候差不多 ...
- MySql 关闭 bin 和 log 日志
mysql 的 bin 和 .log 日志文件会非常占用磁盘空间和 IO,修改 mysql 配置文件可以关闭这两种日志的记录. 关闭 bin 日志,将下面三项配置注释掉: #log_bin = mys ...
- 如何免费安装正版Adobe
现在正版的Adobe都非常的贵,如果你想不花钱又想下载正版的Adobe,那么就请花几分钟时间学习以下本篇博客,告诉你如何免费下载正版Adobe! [一定要读完,不要看到一半就以为教您下载的是付费版] ...
- shell-字符串及整数操作符讲解与多实践
1. 字符串测试操作符 字符串测试操作符的作用:比较两个字符串是否相同.字符串长度是否为零,字符串是否为null(注:bash区分零长度字符串和空字符串)等. "="比较两个字符串 ...