1. 程式人生 > >【故障公告】資料庫伺服器 CPU 近 100% 引發的故障

【故障公告】資料庫伺服器 CPU 近 100% 引發的故障

非常抱歉,今天上午 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