Bing.com在.NET Core 2.1上运行!

相关知识请参考.netCore开发团队博客(https://blogs.msdn.microsoft.com/dotnet/)

Bing.com是一种云服务,运行在遍布全球许多数据中心的数千台服务器上。Bing服务器每秒处理来自全球消费者的数千个用户查询,通过他们的浏览器,使用Microsoft认知服务API的合作伙伴以及个人数字助理Cortana进行搜索。我们的用户要求这些结果具有相关性和速度,因此性能和可靠性是运行Bing等成功云服务的关键组件。
Bing的前端堆栈主要是以MVC模式分层的托管代码编写的。大多数业务逻辑代码都是用C#编写的数据模型,视图逻辑是用Razor编写的。该层负责将搜索结果数据(编码为Microsoft Bond)转换为HTML,然后将其压缩并发送到浏览器。作为Bing的前端平台的守门人,我们将开发人员的工作效率和功能敏捷性视为我们成功定义中的附加关键组件。数以百计的开发人员依靠这个平台将他们的功能投入生产,他们希望它能像钟表一样运行。
从一开始,Bing.com就在.NET Framework上运行,但它最近已转换为在.NET Core上运行。推动Bing.com采用.NET Core的主要原因是性能(即服务延迟),支持并行和应用程序本地安装,与机器范围的安装(或缺少安装)和ReadyToRun映像无关。为了实现这些改进,我们开始努力使代码在.NET实现中可移植,而不是依赖于仅在Windows上可用且仅与.NET Framework一起使用的库。团队开始使用.NET Standard 1.x,但是减少的API表面为我们的代码迁移带来了非常重要的复杂性。使用.NET Standard 2.0返回的20,000多个API,一切都改变了,我们能够迅速从代码修改转移到测试。在压缩了一些bug后,我们准备将.NET Core部署到生产环境中。
ReadyToRun图像
托管应用程序通常可能具有较差的启动性能,因为首先必须将JIT编译为机器代码。.NET Framework具有预编译技术NGEN。但是,NGEN需要在将执行代码的计算机上执行预编译步骤。对于Bing来说,这意味着NGENing成千上万的机器。随着应用程序在Web服务机器上进行预编译,这与积极的部署周期相结合将导致显着的服务容量减少。此外,运行NGEN需要管理权限,这些权限在数据中心设置中通常不可用或经过严格审查。在.NET Core上,crossgen 工具允许将代码预编译为预部署步骤,例如在构建实验室中,并且部署到生产的映像已准备好运行!
性能
.NET Core 2.1几乎在运行时和库的所有领域都进行了重大的性能改进; 博客上一篇文章中提供了一篇很好的论文。
我们的生产数据与.NET Core 2.1中的显着性能改进(与.NET Core 2.0和.NET Framework 4.7.2相比)产生了共鸣。下图跟踪了过去几个月内部服务器的延迟情况。Y轴是延迟(省略实际值),最后的急剧下降(6月2日)是.NET Core 2.1的部署!这一切都提高了34%,这要归功于.NET社区的辛勤工作!
.NET Core 2.1中的以下更改是我们工作负载的显着改进的亮点。它们以降低的影响顺序呈现。
  1. 矢量化string.Equals(@jkotas)和string.IndexOf/LastIndexOf(@eerhardt)
无论您采用哪种方式切片,HTML渲染和操作都是字符串繁重的工作负载。字符串比较和索引操作是其中的主要组成部分。这些操作的矢量化是我们测量的性能改进的最大贡献者。
  1. EqualityComparer<T>.Default(@AndyAyersMS)的虚拟化支持
我们的主要软件组件之一是重度用户Dictionary<int/long, V>,间接受益于JIT中为了Dictionary<K, V>优化而进行的内在识别工作(@benaadams)
  1. 软件写入监视并发GC(@ Maoni0和@kouvel)
这导致我们的应用程序中CPU使用率降低。在.NET Core 2.1之前,Windows x64(以及.NET Framework)上的写入监视是使用具有不同性能权衡的Windows API实现的。这个新实现依赖于JIT写屏障,它直观地增加了参考商店的成本,但是这个成本是摊销的,而且在我们的工作量中没有注意到。此改进现在也可以通过2018年5月的安全性和质量汇总在.NET Framework上获得
  1. 使用calli的方法现在可以内联(@AndyAyersMS和@mjsabby)
我们在代码的性能关键部分中使用ldftn+ calli代替委托(这会产生对象分配),其中需要间接调用托管方法。此更改允许具有calli指令的方法体具有内联条件。我们的依赖注入框架生成这样的方法
  1. 提高string.IndexOfAny的2&3 char搜索性能(@bbowyersmyth)
前端堆栈中的常见操作是在字符串中搜索“:”,“/”,“/”以分隔URL的各个部分。这种特殊的外壳改进在整个代码库中都是有益的。
除了运行时更改之外,.NET Core 2.1还为.NET库生态系统带来了Brotli支持。Bing.com使用此功能动态压缩内容并将其提供给支持的浏览器。
运行时敏捷
最后,在我们的应用程序中拥有运行时的xcopy版本的能力意味着我们能够以更快的速度采用更新版本的运行时。事实上,如果您查看上面的图表,我们将在6月2日(即发布后的两天)的常规应用程序部署中全球范围内进行.NET Core 2.1更新!
这是可能的,因为我们在.NET Core的每日CI构建测试功能和性能的整个版本中运行我们的持续集成(CI)管道。
我们对未来感到兴奋,并与.NET团队密切合作,帮助他们确定未来的更新资格!.NET Core团队很兴奋,因为我们提供了大量的功能测试和额外的大型代码库来衡量实际的性能改进,以及我们致力于为Bing.com用户提供快速结果以及我们自己的开发人员使用最新的软件和工具。

本篇文章原址:Bing.com runs on .NET Core 2.1!

Bing.com在.NET Core 2.1上运行!的更多相关文章

  1. 记一次asp.net core 在iis上运行抛出502.5错误

    asp.net core 在iis上运行抛出502.5异常的部分原因以及解决方案 环境说明 已安装 .net core runtime 2.1.401 已安装 .net core windows ho ...

  2. 在传统.NET Framework 上运行ASP.NET Core项目

    新的项目我们想用ASP.NET Core来开发,但是苦于我们历史的遗产很多,比如<使用 JavaScriptService 在.NET Core 里实现DES加密算法>,我们要估计等到.N ...

  3. ASP.NET Core 中文文档 第二章 指南(5) 在 Nano Server 上运行ASP.NET Core

    原文 ASP.NET Core on Nano Server 作者 Sourabh Shirhatti 翻译 娄宇(Lyrics) 校对 刘怡(AlexLEWIS).许登洋(Seay).谢炀(kile ...

  4. 在ASP.NET Core Web API上使用Swagger提供API文档

    我在开发自己的博客系统(http://daxnet.me)时,给自己的RESTful服务增加了基于Swagger的API文档功能.当设置IISExpress的默认启动路由到Swagger的API文档页 ...

  5. 【无私分享:ASP.NET CORE 项目实战(第十章)】发布项目到 Linux 上运行 Core 项目

    目录索引 [无私分享:ASP.NET CORE 项目实战]目录索引 简介 ASP.Net Core 给我们带来的最大的亮点就是跨平台,我在我电脑(win7)上用虚拟机建了个 CentOS7 ,来演示下 ...

  6. win2008server R2 x64 部署.net core到IIS上出现【Failed to load the dll from [C:\Program Files\dotnet\host\fxr\1.0.1\hostfxr.dll], HRESULT: 0x80070057】错误

    win2008server R2 x64 部署.net core到IIS上出现[Failed to load the dll from [C:\Program Files\dotnet\host\fx ...

  7. Core Web API上使用Swagger提供API文档

    在ASP.NET Core Web API上使用Swagger提供API文档   我在开发自己的博客系统(http://daxnet.me)时,给自己的RESTful服务增加了基于Swagger的AP ...

  8. 发布项目到 Linux 上运行 Core 项目

    发布项目到 Linux 上运行 Core 项目 目录索引 [无私分享:ASP.NET CORE 项目实战]目录索引 简介 ASP.Net Core 给我们带来的最大的亮点就是跨平台,我在我电脑(win ...

  9. 在.NET Core 上运行的 WordPress

    在.NET Core 上运行的 WordPress,无需安装PHP既可跨平台运行WordPress. 在Peachpie中实现PHP所需的功能数月后,现在终于可以运行一个真实的应用程序:WordPre ...

随机推荐

  1. webstorm 2018 激活破解方法大全

    转载自:https://blog.csdn.net/voke_/article/details/76418116 方法一:(更新时间:2018/4/8)v3.3 注册时,在打开的License Act ...

  2. PhantomJs浏览器下载

    下载地址: http://phantomjs.org/download.html 链接:https://pan.baidu.com/s/1g9ZHLm0Fg56LN30CsDu-CA 密码:qhar

  3. SQL Server中sys.syslogin中updatedate字段的浅析

    在系统视图sys.syslogins中,有createdate与updatedate两个字段,分别表示创建登录名与更新登录名的日期,如果你用updatedate的值来判断一个登录名的权限是否被修改过, ...

  4. Oracle解锁scott用户

    解决: (1)conn sys/sys as sysdba;//以DBA的身份登录 (2)alter user scott account unlock;// 然后解锁 (3)conn scott/t ...

  5. Zabbix监控文件是否存在/文件大小

    检查C:\Zabbix\zabbix_agentd.log文件是否存在 zabbix_get -s 10.16.4.1 -k vfs.file.exists[C:\\Zabbix\\zabbix_ag ...

  6. python模块之sys和subprocess以及编写简单的主机扫描脚本

    python模块之sys和subprocess以及编写简单的主机扫描脚本 1.sys模块 sys.exit(n)  作用:执行到主程序末尾,解释器自动退出,但是如果需要中途退出程序,可以调用sys.e ...

  7. Linux 小知识翻译 - 「NTP」

    这周聊聊「NTP」. 上次,聊了「时区」,也就是时间相关的话题. NTP是「Network Time Protocol」的简称,是为了将网络中计算机的时钟同步到正确时间的协议. PC内部的时钟是相当不 ...

  8. 【Teradata】gtwglobal查看

    使用root登录TD数据库节点 cnsterm 6 start gtwglobal cnsterm 3 //上一个命令的window编号 h //帮助 QUIT //退出

  9. 简单理解Vue中的nextTick

    Vue中的nextTick涉及到Vue中DOM的异步更新,感觉很有意思,特意了解了一下.其中关于nextTick的源码涉及到不少知识,很多不太理解,暂且根据自己的一些感悟介绍下nextTick. 一. ...

  10. SQLite这么娇小可爱,不多了解点都不行啊

    简介 SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统.它的设计目标是嵌入式的,目前Android和iOS的设备内置的都是SQLite数据库.SQLite虽然娇小,但也支持事务和 ...