【故障公告】資料庫伺服器 CPU 近 100% 引發的故障
阿新 • • 發佈:2019-11-28
非常抱歉,今天上午 10:48 ~ 11:33 期間,我們所使用的資料庫服務(阿里雲 RDS 例項 SQL Server 2016 標準版)又出現了 CPU 近 100% 問題,由此給您帶來麻煩,請您諒解。
這次剛開始出現 CPU 近 100% 問題時,沒有造成大的影響,後來有段時間 CPU 降了下來,由於是訪問高峰,我們沒有敢立即進行主備切換,但 11:20 之後出現的 CPU 近 100% 問題對網站的正常訪問影響越大越大,11:33 左右我們進行了主備切換後恢復了正常。
這次資料庫 CPU 近 100% 期間,從阿里雲 RDS CloudDBA 控制檯看執行最多的是 3 條 SQL 語句,前2條是 EF Core 3.0 生成的包含 "IS NOT NULL" 的 SQL 語句,第3條是一個儲存過程。
由於 .NET Core 3.1 正式版12月初即將釋出,所以在上次故障之後我們沒有立即將 EF Core 升級至 3.1 Preview 版,現在來看,不能等了,我們會盡快升級,消除 EF Core 生成的多餘 "IS NOT NULL" 。
另外,阿里雲資料庫專家會幫我進一步分析資料庫,看是否會發現更多線索。
【更新】
經過阿里雲資料庫專家的分析,這次 CPU 近 100% 問題依然是 EF Core 生成的 null checks SQL 語句引起的,這次的罪魁禍首是下面的 SQL
... WHERE [b].[BlogID] = @__blogId_0 AND @__blogId_0 IS NOT NULL AND [b].[IsExist] = CAST(? AS bit) AND ([b].[PostType] | @__type_1 = @__type_1 AND ([b].[PostType] | @__type_1 IS NOT NULL AND @__type_1 IS NOT NULL) OR [b].[PostType] | @__type_1 IS NULL AND @__type_1 IS NULL) AND ([b].[PostConfig] & @__config_2 = @__config_2 AND ([b].[PostConfig] & @__config_2 IS NOT NULL AND @__config_2 IS NOT NULL) OR [b].[PostConfig] & @__config_2 IS NULL AND @__config_2 IS NULL) AND [b0].[DiggCount] > ? ORDER BY COALESCE([b0].[DiggCount], ?) DESC