【问题标题】:How to troubleshoot slow inserts to Azure Cosmos from Azure Function如何解决从 Azure Function 向 Azure Cosmos 缓慢插入的问题
【发布时间】:2020-10-22 22:25:22
【问题描述】:

我想使用 Cosmos .NET SDK v3 从 Azure 函数向 Azure Cosmos DB 插入小文档(

插入代码是

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://docs.microsoft.com/en-us/azure/cosmos-db/performance-tips-dotnet-sdk-v3-sql 尝试了以下操作:

  • 同时使用 Direct 和 Gateway 连接模式(未发现显着差异)。
  • 在写入操作时禁用内容响应(这会将写入时间减少到大约 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"
        }
    ]
}

【问题讨论】:

    标签: c# azure azure-functions azure-cosmosdb


    【解决方案1】:

    您似乎正在使用批量模式。请记住,批量模式是在发送大量操作时使 RU 饱和的模式。你提到你发送

    请同时检查:

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

    【讨论】:

    • 谢谢。关闭批量模式是解决方案。使用AllowBulkExecution = false,插入时间现在快了 100 多倍。
    • 太棒了。还要确保更新 SDK,在您需要使用 Bulk 的情况下(例如,您要插入 1K 项),那么您希望在较新版本中进行所有改进
    猜你喜欢
    • 1970-01-01
    • 2021-10-15
    • 1970-01-01
    • 2019-02-06
    • 2017-11-13
    • 1970-01-01
    • 1970-01-01
    • 2021-12-16
    • 2022-08-18
    相关资源
    最近更新 更多