Снижение производительности после обновления до Microsoft.Azure.Cosmos.Table для доступа к хранилищу таблиц Azure.

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

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

Мы используем код .NET Framework, считывая данные из таблицы 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}");
    }
}

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


person Maxim Alexeyev    schedule 07.04.2020    source источник
comment
We observed performance degradation of our application after that. We even created test applications with identical usage pattern to isolate it, and still see this performance hit. – Пожалуйста, отредактируйте свой вопрос и включите больше деталей, например, для каких операций вы видите проблемы с производительностью и т. д.   -  person Gaurav Mantri    schedule 07.04.2020
comment
Обновлено: включен пример кода   -  person Maxim Alexeyev    schedule 07.04.2020


Ответы (2)


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

person PaulChen    schedule 10.04.2020
comment
source name=Microsoft.Azure.Cosmos.Table switchName=ClientSwitch switchType=System.Diagnostics.SourceSwitch В разделе коммутаторов добавьте name=ClientSwitch value=Off - person PaulChen; 10.04.2020

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

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

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

person PaulChen    schedule 09.04.2020
comment
Да, мы на классическом хранилище, повторим тесты на хранилище v2. Однако деградация не составляет 15%, это цифры для нашего образца: Старый клиент — 0:34 Новый клиент — 1:37 Обновлено: результаты получены при выполнении теста на виртуальной машине Azure. - person Maxim Alexeyev; 09.04.2020
comment
Мой тест производительности был основан на 5000 объектах ~1 КБ, и ниже приведены выходные данные с использованием таблицы SDK 1.0.6: 1 страница из 1000 объектов заняла 00:00:00.5731967 1 страница из 1000 объектов заняла 00:00:01.0005410 1 страница из 1000 объектов заняло 00:00:00.6324008 1 страница из 1000 объектов заняло 00:00:00.6053916 1 страница из 1000 объектов заняло 00:00:00.5835644 клиент таблицы CosmosDB. Всего истекло: 00:00:03.3968653 - person PaulChen; 09.04.2020
comment
Кажется, вы испытываете гораздо большую продолжительность в 1,5 минуты. Не могли бы вы поделиться более подробной информацией, чтобы я мог получить местную копию? (выбор объекта, всего строк одного и того же ключа раздела) - person PaulChen; 09.04.2020
comment
пришлите мне электронное письмо по адресу [email protected], чтобы мы могли организовать встречу. После решения мы можем обновить эту тему. - person PaulChen; 09.04.2020
comment
Спасибо за ответ, отпишусь. - person Maxim Alexeyev; 09.04.2020
comment
@PaulChen У меня возникают аналогичные проблемы с падением производительности при использовании запроса пустой таблицы для извлечения всех объектов в таблице. Я настроил контрольный тест, используя учетную запись таблицы Cosmos db и учетную запись хранения. Обе таблицы имеют одинаковый набор данных примерно из 200 тыс. сущностей. При использовании библиотеки Microsoft.WindowsAzure.Storage в учетной записи хранения среднее время выполнения составляет ~2 минуты. При использовании CosmosDB Table SDK 1.0.7 на таблице Cosmos я вижу ~3 часа с Cosmos Executor и ~3 минуты с остальным исполнителем. Любая помощь приветствуется. - person Blaine; 01.07.2020