做夢也沒有想到:Windows 上的 .NET Core 版博客系統表現更糟糕


昨天晚上 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 系列博文:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM