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

做梦也没有想到:Windows 上的 .NET Core 表现更糟糕的更多相关文章

  1. 峰回路转:去掉 DbContextPool 后 Windows 上的 .NET Core 版博客表现出色

    今天早上,我们修改了博客程序中的1行代码,将 services.AddDbContextPool 改为 services.AddDbContext ,去掉 DbContextPool . 然后奇迹出现 ...

  2. 如何让 Windows 上的命令行工具更好用

    侯爵老师视频详解:如何让 Windows 上的命令行工具更好用 很多 Windows 用户在打开这个小黑窗时,都会情不自禁的感慨,「实在是太丑了--」 实际上如果你用的是 Windows 8 或 Wi ...

  3. 同“窗”的较量:部署在 Windows 上的 .NET Core 版博客站点发布上线

    为了验证 docker swarm 在高并发下的性能问题,周一我们发布了使用 docker-compose 部署的 .net core 版博客站点(博文链接),但由于有1行代码请求后端 web api ...

  4. .NET平台系列26:在 Windows 上安装 .NET Core/.NET5/.NET6

    系列目录     [已更新最新开发文章,点击查看详细] 本文介绍如何在 Windows 上安装 .NET. .NET 由运行时和 SDK 组成. 运行时用于运行 .NET 应用,应用可能包含也可能不包 ...

  5. ubuntu上部署windows开发的dotnet core程序

    目标:完成windows上开发的dotnet core程序部署至linux服务器上(Ubuntu 14.04) windows上开发dotnet core很简单,安装好VS2017,建立相关类型的项目 ...

  6. 在Windows系统搭建.NET Core环境并创建运行ASP.NET网站

    微软于6月27日在红帽DevNation峰会上 正式发布了.NET Core 1.0.ASP.NET 1.0和Entity Framework Core 1.0,其将全部支持Windows.OS X和 ...

  7. 写一个Windows上的守护进程(5)文件系统重定向

    写一个Windows上的守护进程(5)文件系统重定向 在Windows上经常操作文件或注册表的同学可能知道,有"文件系统/注册表重定向"这么一回事.大致来说就是32位程序在64位的 ...

  8. 写一个Windows上的守护进程(3)句柄的管理

    写一个Windows上的守护进程(3)句柄的管理 在Windows中编程,跟HANDLE打交道是家常便饭.为了防止忘记CloseHandle,我都是使用do-while-false手法: void f ...

  9. 写一个Windows上的守护进程(2)单例

    写一个Windows上的守护进程(2)单例 上一篇的日志类的实现里有个这: class Singleton<CLoggerImpl> 看名字便知其意--单例.这是一个单例模板类. 一个进程 ...

随机推荐

  1. c++学习书籍推荐《Visual C++2008入门经典》下载

    百度云及其他网盘下载地址:点我 <Visual C++2008入门经典>学习目标: 使用标准模板库(STL)来组织和操作本地C++程序中的数据 C++程序调试技术 构造Microsoft ...

  2. 详细记录登录过程的用户、IP地址、shell命令以及详细操作时间

    将下面的代码添加到/etc/profile #history USER_IP=`>/dev/null|awk '{print $NF}'|sed -e 's/[()]//g'` HISTDIR= ...

  3. Python 含小数的十、二进制相互转换

    ''' 二进制->十进制:bTod 整数部分:a乘以2的n次方(n:a后面的整数位数) 小数部分:a乘以2的-n次方(n:a是小数点后几位) 十进制->二进制dTob 整数部分:短除法(除 ...

  4. Java开发实例大全:3月14日练习

    import java.io.FileNotFoundException; import java.io.PrintStream; import java.math.BigDecimal; impor ...

  5. ADO.NET_包括DataReader和dataSet的使用

    今天总结了一下ADO.NET编程中DataReader和dataSet两个比较重要的对象的使用,完成了combobox,listbox,以及fpSpread动态添加数据的测试,对使用sqlComman ...

  6. java高并发系列 - 第14天:JUC中的LockSupport工具类,必备技能

    这是java高并发系列第14篇文章. 本文主要内容: 讲解3种让线程等待和唤醒的方法,每种方法配合具体的示例 介绍LockSupport主要用法 对比3种方式,了解他们之间的区别 LockSuppor ...

  7. UVA-10608 Friends 【并查集】

    There is a town with N citizens. It is known that some pairs of people are friends. According to the ...

  8. 【转载】 JAVA三层架构,持久层,业务层,表现层的理解

    JAVA三层架构,持久层,业务层,表现层的理解 转载:http://blog.csdn.net/ljf_study/article/details/64443653 SSH: Struts(表示层)+ ...

  9. [leetcode] 290. Word Pattern (easy)

    原题 思路: 建立两个哈希表,分别保存: 1 模式 :单词 2 单词 :是否出现过 水题 /** * @param {string} pattern * @param {string} str * @ ...

  10. python找质数对

    python找质数对 编写python脚本,输入一个正整数,输出有几对质数的和等于这个正整数. 例如输入一个正整数10,可以找出有“3+7=10”.“5+5=10”两个质数对的和为10. 要实现这个功 ...