最近云界发生了2件事,一件是大事,一件是小事,大事是阿里云与微软合做推出了开放应用模型 Open Application Model(OAM),小事是因为微软 SQL Server 在阿里云上水土不服(仅是咱们的猜想),阿里云 SQL Server RDS 患上了间隙性芯脏病,该病容易在夜间酣睡的时候发病,目前惟一的急救药是“主备切换”。html
对于大事,咱们拍手叫好,云厂商绑定的问题正在被逐步解决。对于小事,咱们提心吊胆,阿里云你可要保重龙体啊,你打个喷嚏,咱们都抖三抖,你要是生个小病,咱们怎么活。git
在此以前,最近咱们已经遭遇了3次阿里云 RDS 芯脏病发做,详见 云上的芯脏病:奇怪的阿里云 RDS 数据库突发 CPU 近 100% 问题。昨天 23:50 左右开始,RDS 芯脏病又发做了,又是发生在数据库服务器负载极低的时候,又是经过急救药“主备切换”恢复了正常。github
很是抱歉,阿里云 RDS 芯脏病问题引起的故障再次给您带来麻烦,请您谅解。数据库
对于这个问题,咱们会继续观察并考虑如下的应对方法:缓存
1)向阿里云提交工单,催促阿里云重视这个问题。服务器
2)用阿里云 ECS 自建 SQL Server 数据库服务器。app
3)评估其余云厂商的云数据库服务,若是在阿里云上实在没法解决,换一片云试试。post
请你们理解咱们的小题大作,云已经变得愈来愈重,已经成为不少企业的命脉,对于云上的问题“小题大作”总比“大题小作”好。阿里云
【更新】spa
11:40 更新:阿里云针对咱们遇到的数据库 CPU 100% 问题进行分析,分析出来的缘由是“出现了缓存的执⾏计划被替换,一样的⼀批SQL执⾏成本⼤幅提⾼(参数嗅探问题)致使的CPU 100%”,并且定位出了具体的嫌疑 SQL 语句,是 EF Core 3.0 生成的获取上一篇/下一篇博文的 SQL 语句。咱们会改进对应的 LINQ 代码,并进行验证。
17:02 更新:因为 EF Core 3.0 知名的 null checks 问题(详见 github 上的 Queries really slow due to null checks),EF Core 生成的嫌疑 SQL 语句超长,每一个查询条件都会加上 IS NOT NULL ,生成是 UNION 查询,整个 SQL 语句一共有 3895 个字符。
21:07 更新:将 EF Core 生成的嫌疑 SQL 语句改成 Dapper + 存储过程。另外,更新了 SQL Server 的统计信息。
11月23日 11:39 更新:咱们向微软 .NET 团队反馈 EF Core 的 null checks 问题后,微软很快发布一个部分修复问题的 fix 版 EF Core 3.1.0-preview2.19522.3 (flags枚举类型依然有这个问题),详见 github issue 中的回复,对应的 PR#18491 。
10月26日 9:14 更新:微软昨天进一步修复了 flags 枚举类型的 null checks 问题,详见 PR#18491 ,但包含这个修复的 nuget 包还没发布。
11月4日 21:56 更新:确认 EF Core to 3.1.0-preview3.19553.1 已修复了 null checks 问题。