昨天晚上 18:15 左右我們釋出了跑在 Windows 上 .NET Core 部落格系統,本想與 .NET Framework 版進行同“窗”的較量,結果剛釋出上線就發現 CPU 佔用異常高,釋出不到1小時就下線了,根本不是一個級別的較量,或者說 .NET Core 連較量的資格都沒有,剛上臺就趴下了。
如果與 Linux 上的 .NET Core 部落格系統(docker swarm 與 docker-compose 部署方式)相比,也是不是一個級別的較量,部署在 Linux 上時是訪問高峰撐不住,而部署在 Windows 上連訪問低峰都撐不住。
在昨天釋出失敗後,我們懷疑 CPU 異常高可能是因為 memcached 客戶端 EnyimMemcachedCore 使用非同步方法時的併發效能問題,於是我們把非同步改為同步。
今天我們在驗證是否是 EnyimMemcachedCore 的併發效能問題時,我們採用了新的方法,接入部分流量,讓單臺伺服器的 QPS 達到一定值,結果發現了另外一個做夢也沒有想到的問題。
在 QPS 不高時,跑在 Windows 上的 .NET Core 部落格站點表現非常出色,響應速度飛快;但是當 QPS 高於一定值(我們測試時接入的流量讓 QPS 在 300-500 左右),.NET Core 部落格站點像變了個人似的,大量請求響應速度變慢,而且隨著時間推移越來越慢(一種洩漏現象),先是很多請求響應時間5秒左右(我們是從5秒開始監控的),然後是10秒左右,然後是15秒左右。。。然後日誌中出現大量下面的錯誤
2019-08-14 13:13:16.290 [Error] Failed executing DbCommand ("30,022"ms)
System.Data.SqlClient.SqlException (0x80131904): Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding. ---> System.ComponentModel.Win32Exception (258): The wait operation timed out. at System.Data.SqlClient.SqlCommand.<>c.<ExecuteDbDataReaderAsync>b__126_0(Task`1 result) at System.Threading.Tasks.ContinuationResultTaskFromResultTask`2.InnerInvoke() at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state) --- End of stack trace from previous location where exception was thrown --- at System.Threading.Tasks.Task.ExecuteWithThreadLocal(Task& currentTaskSlot, Thread threadPoolThread)
EF Core 執行的很多 SQL 查詢超時(超過30秒),而 EF Core 生成的這些 SQL 語句沒有問題,我們都 review 過。
檢視資料庫服務庫的監控,讓人大吃一驚,就這點 QPS ,僅僅因為 .NET Core 在 Windows 上跑竟然造成資料庫伺服器 CPU 100% 。
而只要將 .NET Core 部落格站點一下線,資料庫伺服器 CPU 就立馬恢復正常,問題非常奇怪。
今天微軟也釋出了 .NET Core 3.0 Preview 8 ,我們將 System.Data.SqlClient 升級到 4.7.0-preview8.19405.3 也是同樣的問題。
我們的資料庫伺服器用的是阿里雲 RDS SQL Server 2008 R2 ,EF Core 用的是 3.0.0-preview5.19227.1 ,由於 EF Core 3.0 從 Preview 6 開始不支援 UseRowNumberForPaging ,所以暫時無法升級到 EF Core 3.0 Preview 8 ,不知道最新版的 EF Core 是否也有這個問題,但我們懷疑應該是 System.Data.SqlClient 的問題,至少是 System.Data.SqlClient 對 Windows 的支援問題,或者是對 SQL Server 2008 R2 的支援問題。
.NET Core 升級之路又遇新障礙。
接下來,我們會進一步排查這 2 個 CPU 高的問題(web伺服器與資料庫伺服器)。
EF Core 與 SqlClient 相關問題連結:
Powered by .NET Core 系列博文: