乐趣区

关于.net:Bing-性能是如何跟随-NET-一起迭代的

大概两年前,我发表了一篇文章,具体的介绍了 Bing 的地方工作流引擎 (XAP) 从 .NET Framework 降级到 .NET 5 的过程。你能够通过这篇文章来理解 XAP 的工作原理,以及它在 Bing 全局中的地位。从那时起,XAP 始终是微软许多搜寻和工作流相干技术的要害组件,并在新的集成中施展了核心作用,比方新的 AI 驱动的 Bing。

人们对性能和性能的冀望越来越高,这意味着咱们对 .NET 作为基础设施的要害局部的依赖性越来越深。

在过来的两年里,咱们是 .NET 6 和 .NET 7 的晚期采纳者,当初正将眼光转向 .NET 8。咱们发现每个版本都比上一个版本更容易降级。作为一个外围平台团队,咱们对每个版本的 .NET 带来的性能晋升和新性能都充斥了强烈的能源。通过踊跃地测试并降级到最新版本,并向 .NET 团队提供反馈,对他们的打算产生肯定影响。

本文将重点介绍咱们所做的一些次要更新和面对的挑战,以及咱们在踊跃跟进最新 .NET 版本时最终获得的成绩。

Hybrid No-More

当第一次降级到 .NET 5 时,咱们是在一个混合模型中进行的,其中咱们依然是基于 .NET Framework 4.x 构建的,然而加载程序集并在 .NET 5 下运行。咱们可能疏导本人和咱们的外部合作伙伴,在放弃构建简略的同时确保一些要害的向后兼容性,但依然利用新的运行时。

在咱们降级到 .NET 6 之前,咱们迁徙到了一个多指标零碎,间接针对 .NET Framework 和 .NET 5 进行构建。通过一些条件编译,咱们能够开始采纳新的 API 来取得一些性能劣势。到目前为止,咱们曾经齐全弃用了 .NET Framework,并且把精力齐全集中在新的运行时上。

.NET 6

随着咱们实现了从 .NET Framework 的降级,咱们预计迁徙到 .NET 6 会更容易。然而,依然有一些小挑战和一些意想之外的播种,等下会具体阐明。

在测试期间,咱们留神到一些后端 HTTP 调用的问题。事实证明,SocketHttpHandler 的变动使实现更符合规范,但并没有可能灵便地解决产生谬误负载的谬误服务器。.NET 团队批改了代码,使它兼容性更强。

咱们遇到的另一个乏味的运行时问题是一个常见的旋转计数 bug。它体现为在单个数据中心(可能是因为特定的硬件和流量配置)中,偶然呈现十分高的提早峰值和较低的整体可用性。实际上,在咱们提出这个问题时,. NET 团队曾经修复了它。在利用修复之后,咱们看到可用性有了显著且间接的晋升:

这两个问题都解决后,公布基本上就很简略了,咱们只须要比拟少的代码更改。最终,整体性能全面晋升了约 5%。还有一个方面的改良比这要显著得多:启动工夫。

当过程启动时,它会加载几千个程序集。所有这些代码都须要 jitted,最好是在真正的用户查问达到之前。多年来,咱们曾经迭代了许多技术来实现这一点,但目前的办法是通过剖析 JIT 事件日志来查看哪些办法最须要它,并在后续的启动中被动地 jitting 它们。咱们尽可能快地在所有处理器内核上执行此操作。

.NET 6 的 JIT 效率因而失去了极大的晋升,对启动工夫产生了很大的影响:

在一些机器 SKU 上,启动工夫进步了近 40%!难以置信!

.NET 7

.NET 6 公布后,咱们就立刻集中精力降级到 .NET 7。有两个次要变动须要特地留神:

1. 线程池的操作形式。
2. 一个新的基于区域的 GC。

具体的测试表明,新的线程池设计为咱们带来了更好的性能,所以这里不必放心。

事实上,新的垃圾收集器设计在几个月的工夫里由 .NET 开发者在咱们的一些测试机器上进行了具体且宽泛的测试,以确保它没有引入任何回归。在一个对运行时如何工作的假如进行了高度优化的零碎中,当运行时的一个根本局部极大地扭转了其实现时,总数令人担忧。

侥幸的是,在测试中咱们发现过程花在 GC 上的工夫均匀进步了 24%,尽管一开始并不是很多。在理论生产中,这个比例甚至更高,靠近 30%。

解决了这两个问题后,咱们通常会看到大概 10-17% 的效率晋升,这取决于数据中心和工作负载类型。

很大一部分性能晋升来自运行时 CPU 使用率的晋升,也就是在 Bing 中查问时 CPU 使用率的升高:

留神:上图中的值并不代表查问提早,它是所有并行门路上的 CPU 使用率的总和。

在 GC 改良、新的线程池和对处理器更无效地应用之间,咱们实现了 P95 提早 3 -7% 的改良,在更高的百分比上改良更多。这种效率的晋升让咱们可能给用户更快的服务体验,或者在某些状况下,缩小资源应用并以不同的形式实现运行时收益。“效率”对于科技公司来说就像 2023 年的年度词汇,.NET 7 在咱们的致力中表演了很要害的角色。

.NET 8

. NET 8 曾经公布了预览版。咱们将开始在这个新的运行时下测试工作流引擎。到目前为止,年复一年地降级到最新版本曾经被证实是显著进步性能的最经济无效的办法。咱们从未冀望“收费”取得所有这些性能劣势,咱们始终谋求的是平价。很难设想效率方面比拟大的改良会永恒继续上来(只管目前还没有进行的迹象)。咱们很快乐能站在 .NET 提高的风口浪尖上!

点我返回原博客~

退出移动版