gpt4 book ai didi

c# - 如何排查从 Azure Function 向 Azure Cosmos 插入缓慢的问题

转载 作者:行者123 更新时间:2023-12-03 00:58:09 25 4
gpt4 key购买 nike

我想使用 Cosmos .NET SDK v3 将小文档(<10 个 JSON 字段)从 Azure Functions 插入到 Azure Cosmos DB,但每次插入需要 1-2 秒。

插入代码是

await container.CreateItemAsync(
objectToAdd,
new PartitionKey(objectToAdd.PartitionKey),
new ItemRequestOptions { EnableContentResponseOnWrite = false })

查看诊断,大部分时间都花在项目流传输期间(请参阅最后的日志)。

Azure Function 和 Cosmos 均部署到同一区域(北欧)。 Cosmos 允许通过启用服务端点的 vnet 访问 Azure Function。

我已阅读https://blog.tdwright.co.uk/2019/06/29/aggressively-tuning-cosmos-db-the-long-way-round/https://learn.microsoft.com/en-us/azure/cosmos-db/performance-tips-dotnet-sdk-v3-sql尝试了以下方法:

  • 同时使用直接连接模式和网关连接模式(未发现显着差异)。
  • 禁用写入操作的内容响应(这会将写入时间缩短至 250 毫秒至 500 毫秒左右)。
  • 确保存在单例 CosmosClient

我没试过:

  • 增加数据库上的 RU,因为我只测试少量 7.6 RU 插入。
  • 使用批量库,因为文档是单独到达的

对于应该完全在单个数据中心内的东西来说,这似乎是一个很长的响应时间。

我的问题:

  • 以上信息是否表明存在网络问题?
    • 如果是这样,Cosmos 是否提供了一种类似于 TRACERT 的方式来跟踪 Azure 内的连接?
    • Cosmos 是否记录它认为连接源自的 IP 地址?
  • 或者是否可以在代码级别进行进一步优化?
{
"Summary": {
"StartUtc": "2020-10-22T21:21:03.3520979Z",
"ElapsedTime": "00:00:01.0030109",
"UserAgent": "cosmos-netstandard-sdk/3.6.0|3.4.2|38128|X86|Microsoft Windows 10.0.14393 |.NET Core 4.6.29215.02|"
},
"Context": [
{
"Id": "ItemStream",
"ElapsedTime": "00:00:01.0030109"
},
{
"Id": "ItemSerialize",
"ElapsedTime": "00:00:00.0000212"
},
{
"Id": "ExtractPkValue",
"ElapsedTime": "00:00:00.0000402"
},
{
"Id": "BatchAsyncContainerExecutor.Limiter",
"ElapsedTime": "00:00:00.0000056"
},
{
"Id": "RequestInvokerHandler",
"ElapsedTime": "00:00:00.0071549"
},
{
"Id": "Microsoft.Azure.Cosmos.Handlers.RetryHandler",
"ElapsedTime": "00:00:00.0071272"
},
{
"Id": "Microsoft.Azure.Cosmos.Handlers.RouterHandler",
"ElapsedTime": "00:00:00.0070979"
},
{
"Id": "TransportHandler",
"ElapsedTime": "00:00:00.0070954"
},
{
"Id": "PointOperationStatistics",
"ActivityId": "...",
"StatusCode": 200,
"SubStatusCode": 0,
"RequestCharge": 7.62,
"RequestUri": "...",
"RequestSessionToken": null,
"ResponseSessionToken": "..",
"ClientRequestStats": {
"RequestStartTimeUtc": "2020-10-22T21:21:04.3479626Z",
"RequestEndTimeUtc": "2020-10-22T21:21:04.3548940Z",
"RequestLatency": "00:00:00.0069314",
"IsCpuOverloaded": false,
"NumberRegionsAttempted": 1,
"ResponseStatisticsList": [
{
"ResponseTime": "2020-10-22T21:21:04.354894Z",
"ResourceType": 2,
"OperationType": 40,
"StoreResult": "StorePhysicalAddress: rntbd://cdb-ms-prod-northeurope1-fd8.documents.azure.com:14173/apps/.../, LSN: 304, GlobalCommittedLsn: 303, PartitionKeyRangeId: 0, IsValid: True, StatusCode: 200, SubStatusCode: 0, RequestCharge: 7.62, ItemLSN: -1, SessionToken: ..., UsingLocalLSN: False, TransportException: null"
}
],
"AddressResolutionStatistics": [],
"SupplementalResponseStatistics": [],
"FailedReplicas": [],
"RegionsContacted": [
"<redacted>"
],
"ContactedReplicas": [
"rntbd://cdb-ms-prod-northeurope1-fd8.documents.azure.com:14173/apps/<redacted>/",
"rntbd://cdb-ms-prod-northeurope1-fd8.documents.azure.com:14387/apps/<redacted>/",
"rntbd://cdb-ms-prod-northeurope1-fd8.documents.azure.com:14215/apps/<redacted>/",
"rntbd://cdb-ms-prod-northeurope1-fd8.documents.azure.com:14064/apps/<redacted>/"
]
}
},
{
"Id": "BatchAsyncContainerExecutor.ToResponse",
"ElapsedTime": "00:00:00.0000295"
}
]
}

最佳答案

您似乎正在使用批量模式。请记住,批量模式是一种在发送大量操作时使 RU 饱和的模式。您提到您正在发送 < 10 个,因此我建议您在这种情况下不要使用批量模式(除非您发送的数量更多)。

另请检查:

  • 您使用的是 Singleton CosmosClient 吗?
  • 实例是否在与写入 Cosmos DB 区域相同的区域中运行?
  • 更新您的 SDK,您使用的是 3.6.0 版本,3.11.0 中对 Bulk(如果您仍想使用 Bulk)进行了改进使其在文档数量较少的情况下速度更快。

关于c# - 如何排查从 Azure Function 向 Azure Cosmos 插入缓慢的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64491369/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com