Снижение производительности после обновления до Microsoft. Azure .Cosmos. Доступ к Azure табличному хранилищу - PullRequest
3 голосов
/ 07 апреля 2020

Мы обновились до следующей версии SDK для доступа к нашему Azure Табличному хранилищу.

После этого мы наблюдали снижение производительности нашего приложения. Мы даже создали тестовые приложения с идентичным шаблоном использования, чтобы изолировать его, и до сих пор видим это снижение производительности.

Мы используем. NET Код платформы, чтение данных из таблицы Azure.

Старый клиент: Microsoft. WindowsAzure .Storage - 9.3.2

Новый клиент: Microsoft. Azure .Cosmos.Table - 1.0.6

Вот один из примеры тестов, которые мы пытались запустить:

public async Task ComparisionTest1()
{
    var partitionKey = CompanyId.ToString();

    {
        // Microsoft.Azure.Cosmos.Table
        var storageAccount = Microsoft.Azure.Cosmos.Table.CloudStorageAccount.Parse(ConnectionString);
        var tableClient = Microsoft.Azure.Cosmos.Table.CloudStorageAccountExtensions.CreateCloudTableClient(storageAccount);
        var tableRef = tableClient.GetTableReference("UserStatuses");
        var query = new Microsoft.Azure.Cosmos.Table.TableQuery<Microsoft.Azure.Cosmos.Table.TableEntity>()
                            .Where(Microsoft.Azure.Cosmos.Table.TableQuery.GenerateFilterCondition("PartitionKey", "eq", partitionKey));
        var result = new List<Microsoft.Azure.Cosmos.Table.TableEntity>(20000);

        var stopwatch = Stopwatch.StartNew();
        var tableQuerySegment = await tableRef.ExecuteQuerySegmentedAsync(query, null);
        result.AddRange(tableQuerySegment.Results);
        while (tableQuerySegment.ContinuationToken != null)
        {
            tableQuerySegment = await tableRef.ExecuteQuerySegmentedAsync(query, tableQuerySegment.ContinuationToken);
            result.AddRange(tableQuerySegment.Results);
        }

        stopwatch.Stop();
        Trace.WriteLine($"Cosmos table client. Elapsed: {stopwatch.Elapsed}");
    }

    {
        // Microsoft.WindowsAzure.Storage
        var storageAccount = Microsoft.WindowsAzure.Storage.CloudStorageAccount.Parse(ConnectionString);
        var tableClient = storageAccount.CreateCloudTableClient();
        var tableRef = tableClient.GetTableReference("UserStatuses");
        var query = new Microsoft.WindowsAzure.Storage.Table.TableQuery<Microsoft.WindowsAzure.Storage.Table.TableEntity>()
                            .Where(Microsoft.WindowsAzure.Storage.Table.TableQuery.GenerateFilterCondition("PartitionKey", "eq", partitionKey));
        var result = new List<Microsoft.WindowsAzure.Storage.Table.TableEntity>(20000);

        var stopwatch = Stopwatch.StartNew();
        var tableQuerySegment = await tableRef.ExecuteQuerySegmentedAsync(query, null);
        result.AddRange(tableQuerySegment.Results);
        while (tableQuerySegment.ContinuationToken != null)
        {
            tableQuerySegment = await tableRef.ExecuteQuerySegmentedAsync(query, tableQuerySegment.ContinuationToken);
            result.AddRange(tableQuerySegment.Results);
        }

        stopwatch.Stop();
        Trace.WriteLine($"Old table client. Elapsed: {stopwatch.Elapsed}");
    }
}

Кто-нибудь это наблюдал, есть мысли по этому поводу?

Ответы [ 2 ]

1 голос
/ 10 апреля 2020

Проблема производительности будет решена в Таблице SDK 1.0.7, что подтверждено для крупного объекта. На 1.0.6 обходной путь - отключить трассировку Table sdk, добавив раздел диагностики в app.config, если это приложение. NET framework. Это все равно будет медленнее, чем Storage sdk, но намного лучше, чем обходной путь, в зависимости от использования.

1 голос
/ 09 апреля 2020

Я думаю, что ваши данные хранятся в устаревшей таблице хранения. На всякий случай, если это резервная копия таблицы CosmosDB, вы можете получить более высокую производительность, если для TableClientConfiguration.UseRestExecutorForCosmosEndpoint установлено значение True.

Если это устаревшее хранилище таблиц хранения, CosmosDB Table sdk 1.0.6 будет примерно на 15% медленнее. Таблица хранения SDK 9.3.3. Кроме того, он имеет дополнительные вторые накладные расходы после первой операции CRUD. Более высокая длительность запроса была разрешена в версии 1.0.7, что соответствует стандарту Storage SDK. Вторая инициализация по-прежнему требуется, поэтому используйте CosmosDB Table sdk 1.0.7, что должно быть приемлемым.

Мы планируем выпустить 1.0.7 в течение недели 4/13.

...