从 .NET5 迁移到 .NET 6 后测量性能

本文是该系列的续篇(从 .NET Core 2.2 迁移到 .NET Core 3.1和如何将项目从 ASP.NET MVC 迁移到 ASP.NET Core) 关于升级 nopCommerce 项目 – 一个免费的 .net 电子商务 CMS,带有用于创建在线商店的开源代码。我们将讨论为什么我们不断努力升级我们的应用程序平台。在这里,我们将告诉您迁移到 .NET 6 在性能方面取得的成就,并尝试对我们的结果进行实际评估。

迁移的原因

监控 nopCommerce 升级的人都知道,我们尽最大努力尽快升级应用程序核心。.NET Core 平台中反映的不断发展的 Microsoft 技术促进了这一点。

主要目标之一是切换到长期支持 (LTS) 版本。这是因为当前的 .NET 5 版本将在其发布之日起 1.5 年内得到支持和调试。升级后的nopCommerce 4.50版本已经基于.NET 6平台,支持3年;对最终用户至关重要。反过来,它将为社区提供足够的时间来更新他们的商店和插件。话虽如此,对以下版本的期望将伴随着定期升级,包括安全升级。

随着 .NET 6 的发布,Microsoft 开发人员使 .NET 成为最接近于开发所有现有应用程序类型的单一平台,从桌面和 Web 应用程序开始,到移动应用程序开发结束。这样的统一允许我们在单个 C# 代码库中发布 nopCommerce 的移动应用程序。这无疑将使我们的开发者社区在沉浸和理解整个 nopCommerce 生态系统方面受益。

此外,我们计划通过切换到 .NET 6 来提高应用程序的性能标准。接下来,测量结果揭示了一些有关 nopCommerce 演变的有趣数据,我们愿意分享它们。

.NET 6 应用程序中的性能基准

为了衡量负载和可扩展性,我们选择了一个非常流行的 SaaS 服务,加载器.io,作为测试工具。一台用于开发的普通机器被用作部署应用程序的服务器:

  • CPU – Intel(R) Core(TM) i5-7400 CPU 3.00 GHz
  • 内存 – 16.0 GB

使用 Windows 10 (19044.1415) 和 IIS 10 (10.0.19041.1415) 管理测试。我们还使用了应用程序设置中提供的标准数据库。所有这些都使用 MS SQL Server 2019 (19.0.2000) 进行管理。

为了模拟负载,我们选择在一分钟内连接 250 个用户的测试配置。用户会访问一些随机的应用程序页面。这些足以提供平台响应的总体情况,并可视化与先前版本的差异。

此外,我将介绍 nopCommerce 应用程序和 .NET 平台版本的对应表。

nopCommerce4.304.40.44.50
.NET.NET Core 3.1.NET 5.NET 6

我们连续进行了 3 次负载测试,以深入了解服务器上的负载性质和内存消耗。下面给出了几次运行的平均结果。

响应时间测量(越少越好)。与 .NET 5 和 .NET Core 3.1 版本相比,性能提升有明显趋势:分别为 46.1% 和 65.3%。

测量应用程序的内存使用情况(越少越好)。在不重置应用程序池的情况下,针对每个平台连续运行测试。应该考虑到.NET平台的内存开销增加了;这显然是增强性能的必然代价。但是,我们必须注意,在这里可以看到 .NET 6 中承诺的优化。

.NET 6 与 .NET 5:负载分布

现在让我们详细考虑使用 .NET 6 的 nopCommerce 平台中的负载分布。然后,我们将其与 .NET 5 的相同测试数据进行比较。重要的是,在这里,我们展示了系统在不同平台上工作时的总体趋势,而不是揭示系统失去平衡的极限值,因为这在很大程度上是取决于被测服务器的技术数据。

.NET 6 中的负载分布

.NET 5 中的负载分布

分析这一点,我们可以从 .NET 6 基准测试中看到一个有趣的模式:随着每秒客户端数量的增加,图中的平均响应时间与 .NET 5 保持足够的距离。升级版的曲线更平滑,有更少的爆发。另一个好的指标是在整个测试过程中曲线不会相互交叉。这是增强性能的间接证据。.NET 6 比 .NET 5 更容易处理测试。

概括

我们再次确认,跟随微软的最新技术进步是有益的。除了提高性能外,我们还获得了一个升级的平台,这将使我们能够朝着新的方向前进:移动应用程序。我们在 4.40 版本中开始返回移动应用程序,实现了涵盖我们平台提供的所有功能的 Web API。我们有更多的内存开销来支持性能改进:在选择托管服务提供商时应该考虑这一点。但是,由于当前版本将在中期在我们社区的其他版本中占主导地位,因此切换到它似乎是最实用的解决方案。

了解更多关于开源购物车软件网站或访问我们的 GitHub 存储库