问题描述
我尝试将一些构建于.NET Core 3.1上的Web API移植到Azure应用服务(在Linux上)。早些时候,所有这些API都托管在Azure App Services(在Windows上)中,但是由于与它们相关的巨大成本优势,我想将它们移植到Linux环境中。
但是,在移植它们并运行了一些性能套件之后,我发现Linux和Windows App Service之间存在一些严重的性能差异。我曾期望Linux App Service中的性能会提高或保持不变,但令我感到沮丧的是性能实际上下降了。以下是一些结果:
+-----------------------------------------------+-----------+--------+---------+
| Operation | User Load | Linux | Windows |
+-----------------------------------------------+-----------+--------+---------+
| Cosmos DB Read | 50 | 600 ms | 60 ms |
+-----------------------------------------------+-----------+--------+---------+
| Simple Ping | 50 | 30 ms | 20 ms |
+-----------------------------------------------+-----------+--------+---------+
| 15 parallel calls to Azure Feature Management | 50 | 510 ms | 160 ms |
+-----------------------------------------------+-----------+--------+---------+
是什么原因导致Linux性能下降?是.NET Core,在Windows中性能要比Linux更好。如果是这样,这是否会在.NET 5或其他后续版本中获得地址?
解决方法
至少对于CosmosDB,使用.NET SDK时,对于Windows有documented performance preference:
我们建议使用Windows 64位主机处理以提高性能。 SQL SDK包含一个本地ServiceInterop.dll,用于解析和优化 本地查询。仅Windows支持ServiceInterop.dll x64平台。对于Linux和其他不受支持的平台, ServiceInterop.dll不可用,进行了另一个网络调用 到网关以获取优化的查询。