微软跨平台网页开发框架ASP.NET Core即将迎来第7个主要版本,由于.NET 7对性能的诸多改善,ASP.NET Core 7也同时受益,官方解释,由于.NET 7在性能部分的提升,许多方面直接或间接地强化ASP.NET Core性能。
ASP.NET Core 7从.NET 7中获益,使Ampere机器可更好地扩展,并且获得巨大的性能提升。Ampere机器是以Arm处理器为基础,拥有大量核心,因为其低功耗和平价的优点,被用于许多云计算服务器,但这些机器过去并无法很好的扩展,而.NET 7对全局线程池队列,和Socket连接使用的内存进行分区,改善了这个缺点。
微软解释,分区能够使核心在自己的队列上运行,减少竞争并提高大型核心机器的可扩展性。微软在80核心的Ampere机器上实验,明文平台基准性能提高了514%,JSON平台基准性能也提高了311%。
但是为了提高性能,ASP.NET Core 7也做出一些妥协,因为现在有多个队列被读取,因此不再保证工作项目能以严格的FIFO排序进到全局线程队列中,另外,当机器处在低负载状态,要进行工作窃取(Work stealing)时,因为现在需要搜索更多的队列,因此可能使CPU使用率略为增加。
由于抛出异常可能成本高昂,而ASP.NET Core 7让开发者可以掌握网页服务器Kestrel的Socket传输区域,因此开发者可进一步避免程序在连接关闭期间,在特定层抛出异常,微软提到,在他们的测试中,不抛出异常能够降低CPU使用率,特别是在Linux上,可以降低10% CPU使用率。
微软在ASP.NET Core 6中,更新许多Kestrel中的异步读取方法,减少从请求中读取所使用的内存,微软在ASP.NET Core 7扩展了这项改进,最明显的是在WebSockets的使用案例上,过去ASP.NET Core 6进行1,000次读取,系统需要分配3,000个状态机,也就是说,每次读取系统就需要分配3个独立的状态机,而ASP.NET Core 7消除了所有WebSocket连接读取的状态机分配。
ASP.NET Core 6中Kestrel的HTTP/2处理,在特定情况存在较高的锁争用(Lock Contention),而ASP.NET Core 7消除了大部分锁争用的机会。微软解释,HTTP/2在单一连接上可以有多个流媒体,当一个流媒体写入连接时,便需要一个锁来阻塞其他并行的流媒体,他们测试了几种方法,最后借由在一个频道中队列所有写入,并让单一取用者任务程序来处理队列,执行所有的写入工作,进而消除大部分争用,使服务器不再被锁争用阻塞。
微软在ASP.NET Core 6添加对HTTP/3的实验性支持,在7.0中,HTTP/3已经不是实验性功能,但仍是选择激活的项目。除了改善HTTP/3的可靠性、正确性和最终API定案之外,HTTP/3也有大幅度的性能提升,微软改进客户端和服务器端用来压缩标头的QPack,QPack现在能以更有效率的方法压缩发送、接收标头。