Sugestões de desempenho para o Azure Cosmos DB e SDK de .NET v2Performance tips for Azure Cosmos DB and .NET SDK v2

APLICA-SE A: SQL API

Azure Cosmos DB é uma base de dados distribuída rápida e flexível que escala perfeitamente com latência e produção garantidas.Azure Cosmos DB is a fast and flexible distributed database that scales seamlessly with guaranteed latency and throughput. Não é preciso fazer grandes alterações de arquitetura ou escrever códigos complexos para escalar a sua base de dados com a Azure Cosmos DB.You don't have to make major architecture changes or write complex code to scale your database with Azure Cosmos DB. Escalar para cima e para baixo é tão fácil como fazer uma única chamada API.Scaling up and down is as easy as making a single API call. Para saber mais, consulte como providenciar a produção de contentores ou como providenciar a produção de bases de dados.To learn more, see how to provision container throughput or how to provision database throughput. Mas como o Azure Cosmos DB é acedido através de chamadas de rede, existem otimizações do lado do cliente que pode fazer para atingir o desempenho máximo quando utiliza o SQL .NET SDK.But because Azure Cosmos DB is accessed via network calls, there are client-side optimizations you can make to achieve peak performance when you use the SQL .NET SDK.

Por isso, se está a tentar melhorar o desempenho da sua base de dados, considere estas opções:So, if you're trying to improve your database performance, consider these options:

Upgrade para o .NET V3 SDKUpgrade to the .NET V3 SDK

O .NET v3 SDK é lançado.The .NET v3 SDK is released. Se utilizar o .NET v3 SDK, consulte o guia de desempenho .NET v3 para obter as seguintes informações:If you use the .NET v3 SDK, see the .NET v3 performance guide for the following information:

  • Predefinições no modo TCP diretoDefaults to Direct TCP mode
  • Suporte a API de fluxoStream API support
  • Suporte serializador personalizado para permitir System.Text.JSutilização ONSupport custom serializer to allow System.Text.JSON usage
  • Suporte integrado ao lote e a granelIntegrated batch and bulk support

Recomendações de hospedagemHosting recommendations

Para cargas de trabalho intensivas em consultas, utilize o Windows 64-bit em vez do processamento de anfitriões Linux ou Windows 32 bitsFor query-intensive workloads, use Windows 64-bit instead of Linux or Windows 32-bit host processing

Recomendamos o processamento do anfitrião Windows 64 bits para um melhor desempenho.We recommend Windows 64-bit host processing for improved performance. O SQL SDK inclui uma ServiceInterop.dll nativa para analisar e otimizar consultas localmente.The SQL SDK includes a native ServiceInterop.dll to parse and optimize queries locally. ServiceInterop.dll é suportado apenas na plataforma Windows x64.ServiceInterop.dll is supported only on the Windows x64 platform. Para o Linux e outras plataformas não suportadas onde ServiceInterop.dll não está disponível, é feita uma chamada adicional de rede para o gateway para obter a consulta otimizada.For Linux and other unsupported platforms where ServiceInterop.dll isn't available, an additional network call is made to the gateway to get the optimized query. Os seguintes tipos de aplicações utilizam o processamento de hospedeiro de 32 bits por padrão.The following types of applications use 32-bit host processing by default. Para alterar o processamento do anfitrião para processamento de 64 bits, siga estes passos, com base no tipo da sua aplicação:To change host processing to 64-bit processing, follow these steps, based on the type of your application:

  • Para aplicações executáveis, pode alterar o processamento do anfitrião definindo o alvo da plataforma para x64 na janela Propriedades do Projeto, no separador Construir.For executable applications, you can change host processing by setting the platform target to x64 in the Project Properties window, on the Build tab.

  • Para projetos de teste baseados em VSTest, pode alterar o processamento do hospedeiro selecionando a Arquitetura do Processador Padrão de Definições de Teste de Teste > > como X64 no menu Visual Studio Test.For VSTest-based test projects, you can change host processing by selecting Test > Test Settings > Default Processor Architecture as X64 on the Visual Studio Test menu.

  • Para aplicações web de ASP.NET implementadas localmente, pode alterar o processamento de anfitriões selecionando Utilize a versão de 64 bits do IIS Express para sites e projetos no âmbito de Projetos Web > de Opções de > Ferramentas e Soluções. > For locally deployed ASP.NET web applications, you can change host processing by selecting Use the 64-bit version of IIS Express for web sites and projects under Tools > Options > Projects and Solutions > Web Projects.

  • Para ASP.NET aplicações web implementadas no Azure, pode alterar o processamento do anfitrião selecionando a plataforma de 64 bits nas definições de Aplicação no portal Azure.For ASP.NET web applications deployed on Azure, you can change host processing by selecting the 64-bit platform in Application settings in the Azure portal.

Nota

Por predefinição, novos projetos do Visual Studio estão definidos para Qualquer CPU.By default, new Visual Studio projects are set to Any CPU. Recomendamos que desemalte o seu projeto para x64 para que não mude para x86.We recommend that you set your project to x64 so it doesn't switch to x86. Um projeto definido para Qualquer CPU pode facilmente mudar para x86 se for adicionada uma dependência apenas x86.A project set to Any CPU can easily switch to x86 if an x86-only dependency is added.
ServiceInterop.dll precisa estar na pasta da qual o SDK DLL está a ser executado.ServiceInterop.dll needs to be in the folder that the SDK DLL is being executed from. Isto só deve ser uma preocupação se copiar manualmente DLLs ou tiver sistemas de construção/implementação personalizados.This should be a concern only if you manually copy DLLs or have custom build/deployment systems.

Ligue a recolha de lixo do lado do servidor (GC)Turn on server-side garbage collection (GC)

Reduzir a frequência da recolha de lixo pode ajudar em alguns casos.Reducing the frequency of garbage collection can help in some cases. Em .NET, desateia o gcServer para true .In .NET, set gcServer to true.

Dimensione a carga de trabalho do seu clienteScale out your client workload

Se estiver a testar em níveis de produção elevados (mais de 50.000 RU/s), a aplicação do cliente pode tornar-se o estrangulamento devido à tampa da máquina no CPU ou na utilização da rede.If you're testing at high throughput levels (more than 50,000 RU/s), the client application could become the bottleneck due to the machine capping out on CPU or network utilization. Se chegar a este ponto, pode continuar a empurrar ainda mais a conta DB da Azure Cosmos, escalando as aplicações do seu cliente em vários servidores.If you reach this point, you can continue to push the Azure Cosmos DB account further by scaling out your client applications across multiple servers.

Nota

O uso elevado do CPU pode causar um aumento da latência e solicitar exceções no tempo limite.High CPU usage can cause increased latency and request timeout exceptions.

NetworkingNetworking

Política de ligação: Utilize o modo de ligação diretaConnection policy: Use direct connection mode

.NET V2 SDK modo de ligação padrão é gateway..NET V2 SDK default connection mode is gateway. Configura o modo de ligação durante a construção do DocumentClient caso utilizando o ConnectionPolicy parâmetro.You configure the connection mode during the construction of the DocumentClient instance by using the ConnectionPolicy parameter. Se utilizar o modo direto, também tem de definir o Protocol por usando o ConnectionPolicy parâmetro.If you use direct mode, you need to also set the Protocol by using the ConnectionPolicy parameter. Para saber mais sobre diferentes opções de conectividade, consulte o artigo modos de conectividade.To learn more about different connectivity options, see the connectivity modes article.

Uri serviceEndpoint = new Uri("https://contoso.documents.net");
string authKey = "your authKey from the Azure portal";
DocumentClient client = new DocumentClient(serviceEndpoint, authKey,
new ConnectionPolicy
{
   ConnectionMode = ConnectionMode.Direct, // ConnectionMode.Gateway is the default
   ConnectionProtocol = Protocol.Tcp
});

Exaustão de portas efémerasEphemeral port exhaustion

Se vir um elevado volume de ligação ou um elevado uso da porta nas suas instâncias, verifique primeiro se as instâncias do seu cliente são singletons.If you see a high connection volume or high port usage on your instances, first verify that your client instances are singletons. Por outras palavras, as instâncias do cliente devem ser únicas para o tempo de vida da aplicação.In other words, the client instances should be unique for the lifetime of the application.

Ao executar o protocolo TCP, o cliente otimiza para a latência utilizando as ligações de longa duração em oposição ao protocolo HTTPS, que termina as ligações após 2 minutos de inatividade.When running on the TCP protocol, the client optimizes for latency by using the long-lived connections as opposed to the HTTPS protocol, which terminates the connections after 2 minutes of inactivity.

Em cenários em que tenha acesso escasso e se notar uma contagem de ligação mais alta quando comparado com o acesso ao modo gateway, pode:In scenarios where you have sparse access and if you notice a higher connection count when compared to the gateway mode access, you can:

  • Configure a propriedade ConnectionPolicy.PortReuseMode para PrivatePortPool (eficaz com a versão-quadro>= versão 4.6.1 e .NET core >= 2.0): Esta propriedade permite ao SDK utilizar uma pequena piscina de portas efémeras para diferentes pontos finais de destino Azure Cosmos DB.Configure the ConnectionPolicy.PortReuseMode property to PrivatePortPool (effective with framework version>= 4.6.1 and .NET core version >= 2.0): This property allows the SDK to use a small pool of ephemeral ports for different Azure Cosmos DB destination endpoints.
  • Configure a propriedade ConnectionPolicy.IdleConnectionTimeout deve ser maior ou igual a 10 minutos.Configure the ConnectionPolicy.IdleConnectionTimeout property must be greater than or equal to 10 minutes. Os valores recomendados são entre 20 minutos e 24 horas.The recommended values are between 20 minutes and 24 hours.

Ligue para o OpenAsync para evitar a latência do arranque no primeiro pedidoCall OpenAsync to avoid startup latency on first request

Por padrão, o primeiro pedido tem maior latência porque precisa de ir buscar a tabela de encaminhamento de endereços.By default, the first request has higher latency because it needs to fetch the address routing table. Quando utilizar o SDK V2,ligue OpenAsync() uma vez durante a inicialização para evitar esta latência de arranque no primeiro pedido.When you use SDK V2, call OpenAsync() once during initialization to avoid this startup latency on the first request. A chamada parece: await client.OpenAsync();The call looks like: await client.OpenAsync();

Nota

OpenAsync gerará pedidos para obter a tabela de encaminhamento de endereços para todos os contentores da conta.OpenAsync will generate requests to obtain the address routing table for all the containers in the account. Para contas que têm muitos contentores mas cuja aplicação acede a um subconjunto deles, OpenAsync geraria uma quantidade desnecessária de tráfego, o que tornaria a inicialização lenta.For accounts that have many containers but whose application accesses a subset of them, OpenAsync would generate an unnecessary amount of traffic, which would make the initialization slow. Assim, usar OpenAsync pode não ser útil neste cenário porque atrasa o arranque da aplicação.So using OpenAsync might not be useful in this scenario because it slows down application startup.

Para o desempenho, colocate clientes na mesma região de AzureFor performance, collocate clients in same Azure region

Quando possível, coloque quaisquer aplicações que liguem para Azure Cosmos DB na mesma região que a base de dados DB Azure Cosmos.When possible, place any applications that call Azure Cosmos DB in the same region as the Azure Cosmos DB database. Aqui está uma comparação aproximada: chamadas para Azure Cosmos DB dentro da mesma região completam dentro de 1 000 a 2 ms, mas a latência entre a costa oeste e leste dos EUA é de mais de 50 ms.Here's an approximate comparison: calls to Azure Cosmos DB within the same region complete within 1 ms to 2 ms, but the latency between the West and East coast of the US is more than 50 ms. Esta latência pode variar de pedido a pedido, dependendo do percurso feito pelo pedido à medida que passa do cliente para o limite do datacenter Azure.This latency can vary from request to request, depending on the route taken by the request as it passes from the client to the Azure datacenter boundary. Você pode obter a latência mais baixa possível, garantindo que o pedido de chamada está localizado dentro da mesma região de Azure que o ponto final Azure Cosmos DB.You can get the lowest possible latency by ensuring the calling application is located within the same Azure region as the provisioned Azure Cosmos DB endpoint. Para obter uma lista das regiões disponíveis, consulte as regiões de Azure.For a list of available regions, see Azure regions.

A política de conexão DB Azure Cosmos

Aumentar o número de fios/tarefas Increase the number of threads/tasks

Como as chamadas para Azure Cosmos DB são feitas pela rede, poderá ser necessário variar o grau de paralelismo dos seus pedidos para que a aplicação do cliente passe o mínimo de tempo à espera entre os pedidos.Because calls to Azure Cosmos DB are made over the network, you might need to vary the degree of parallelism of your requests so that the client application spends minimal time waiting between requests. Por exemplo, se estiver a utilizar a Biblioteca Paralela .NET Task,crie na ordem de centenas de tarefas que leiam ou escrevam para Azure Cosmos DB.For example, if you're using the .NET Task Parallel Library, create on the order of hundreds of tasks that read from or write to Azure Cosmos DB.

Permitir networking aceleradoEnable accelerated networking

Para reduzir a latência e o nervosismo do CPU, recomendamos que permita uma ligação acelerada em rede em máquinas virtuais do cliente.To reduce latency and CPU jitter, we recommend that you enable accelerated networking on client virtual machines. Ver Criar uma máquina virtual do Windows com rede acelerada ou criar uma máquina virtual Linux com rede acelerada.See Create a Windows virtual machine with accelerated networking or Create a Linux virtual machine with accelerated networking.

Utilização do SDKSDK usage

Instale o SDK mais recenteInstall the most recent SDK

Os Azure Cosmos DB SDKs estão constantemente a ser melhorados para proporcionar o melhor desempenho.The Azure Cosmos DB SDKs are constantly being improved to provide the best performance. Consulte as páginas DB SDK do Azure Cosmos para determinar as mais recentes melhorias da SDK e rever as melhorias.See the Azure Cosmos DB SDK pages to determine the most recent SDK and review improvements.

Use um cliente singleton Azure Cosmos DB para a vida da sua aplicaçãoUse a singleton Azure Cosmos DB client for the lifetime of your application

Cada DocumentClient instância é segura e executa uma gestão eficiente da ligação e cache de endereços ao operar em modo direto.Each DocumentClient instance is thread-safe and performs efficient connection management and address caching when operating in direct mode. Para permitir uma gestão eficiente da ligação e um melhor desempenho do cliente SDK, recomendamos que utilize um único exemplo por AppDomain dia durante o tempo de vida da aplicação.To allow efficient connection management and better SDK client performance, we recommend that you use a single instance per AppDomain for the lifetime of the application.

Aumente System.Net MaxConnections por anfitrião ao utilizar o modo gatewayIncrease System.Net MaxConnections per host when using gateway mode

Os pedidos de DB da Azure Cosmos são feitos sobre HTTPS/REST quando utiliza o modo gateway.Azure Cosmos DB requests are made over HTTPS/REST when you use gateway mode. Estão sujeitos ao limite de ligação predefinido por nome de hospedeiro ou endereço IP.They're subjected to the default connection limit per hostname or IP address. Você pode precisar de definir MaxConnections para um valor mais alto (100 a 1.000) para que a biblioteca do cliente possa usar múltiplas ligações simultâneas ao Azure Cosmos DB.You might need to set MaxConnections to a higher value (100 to 1,000) so the client library can use multiple simultaneous connections to Azure Cosmos DB. Em .NET SDK 1.8.0 e posteriormente, o valor predefinido para ServicePointManager.DefaultConnectionLimit é de 50.In .NET SDK 1.8.0 and later, the default value for ServicePointManager.DefaultConnectionLimit is 50. Para alterar o valor, pode definir Documentos.Cliente.ConnectionPolicy.MaxConnectionLimit para um valor mais elevado.To change the value, you can set Documents.Client.ConnectionPolicy.MaxConnectionLimit to a higher value.

Afinar consultas paralelas para coleções divididasTune parallel queries for partitioned collections

SQL .NET SDK 1.9.0 e posterior suporte consultas paralelas, que permitem consultar uma coleção dividida em paralelo.SQL .NET SDK 1.9.0 and later support parallel queries, which enable you to query a partitioned collection in parallel. Para obter mais informações, consulte amostras de código relacionadas com o trabalho com os SDKs.For more information, see code samples related to working with the SDKs. Consultas paralelas são projetadas para proporcionar uma melhor consulta de latência e produção do que a sua contraparte em série.Parallel queries are designed to provide better query latency and throughput than their serial counterpart. Consultas paralelas fornecem dois parâmetros que pode sintonizar para se adaptar às suas necessidades:Parallel queries provide two parameters that you can tune to fit your requirements:

  • MaxDegreeOfParallelism controla o número máximo de divisórias que podem ser consultadas em paralelo.MaxDegreeOfParallelism controls the maximum number of partitions that can be queried in parallel.
  • MaxBufferedItemCount controla o número de resultados pré-recáveis.MaxBufferedItemCount controls the number of pre-fetched results.

Grau de sintonização do paralelismoTuning degree of parallelism

A consulta paralela funciona consultando várias divisórias em paralelo.Parallel query works by querying multiple partitions in parallel. Mas os dados de uma partição individual são recolhidos em série no que diz respeito à consulta.But data from an individual partition is fetched serially with respect to the query. A fixação MaxDegreeOfParallelism em SDK V2 para o número de divisórias tem a melhor hipótese de alcançar a consulta mais performante, desde que todas as outras condições do sistema permaneçam as mesmas.Setting MaxDegreeOfParallelism in SDK V2 to the number of partitions has the best chance of achieving the most performant query, provided all other system conditions remain the same. Se não souber o número de divisórias, pode definir o grau de paralelismo para um número elevado.If you don't know the number of partitions, you can set the degree of parallelism to a high number. O sistema escolherá o mínimo (número de divisórias, entrada fornecida pelo utilizador) como o grau de paralelismo.The system will choose the minimum (number of partitions, user provided input) as the degree of parallelism.

Consultas paralelas são as que mais beneficiam se os dados forem distribuídos uniformemente em todas as divisórias no que diz respeito à consulta.Parallel queries produce the most benefit if the data is evenly distributed across all partitions with respect to the query. Se a recolha dividida for dividida de modo a que todos ou a maioria dos dados devolvidos por uma consulta se concentrem em algumas divisórias (uma partição é o pior caso), essas divisórias irão engarrafar o desempenho da consulta.If the partitioned collection is partitioned so that all or most of the data returned by a query is concentrated in a few partitions (one partition is the worst case), those partitions will bottleneck the performance of the query.

Afinação MaxBufferedItemCountTuning MaxBufferedItemCount

A consulta paralela é projetada para pré-obter resultados enquanto o lote atual de resultados está sendo processado pelo cliente.Parallel query is designed to pre-fetch results while the current batch of results is being processed by the client. Esta pré-busca ajuda a melhorar a latência geral de uma consulta.This pre-fetching helps improve the overall latency of a query. O MaxBufferedItemCount parâmetro limita o número de resultados pré-recedidos.The MaxBufferedItemCount parameter limits the number of pre-fetched results. MaxBufferedItemCountDesagreda ao número esperado de resultados devolvidos (ou um número mais elevado) para permitir que a consulta receba o máximo benefício da pré-obtenção.Set MaxBufferedItemCount to the expected number of results returned (or a higher number) to allow the query to receive the maximum benefit from pre-fetching.

A pré-busca funciona da mesma forma, independentemente do grau de paralelismo, e há um único tampão para os dados de todas as divisórias.Pre-fetching works the same way regardless of the degree of parallelism, and there's a single buffer for the data from all partitions.

Implementar backoff em Intervalos RetryAfterImplement backoff at RetryAfter intervals

Durante os testes de desempenho, deverá aumentar a carga até que uma pequena taxa de pedidos seja acelerada.During performance testing, you should increase load until a small rate of requests are throttled. Se os pedidos forem acelerados, a aplicação do cliente deve recuar no acelerador para o intervalo de retagem especificado pelo servidor.If requests are throttled, the client application should back off on throttle for the server-specified retry interval. Respeitar o recuo garante que passa o mínimo de tempo à espera entre as retrações.Respecting the backoff ensures you spend a minimal amount of time waiting between retries.

O apoio à política de retenção está incluído nestes SDKs:Retry policy support is included in these SDKs:

Para obter mais informações, consulte RetryAfter.For more information, see RetryAfter.

Na versão 1.19 e posterior do .NET SDK, existe um mecanismo para registar informações adicionais de diagnóstico e problemas de latência de resolução de problemas, como mostra a amostra seguinte.In version 1.19 and later of the .NET SDK, there's a mechanism for logging additional diagnostic information and troubleshooting latency issues, as shown in the following sample. Pode registar a cadeia de diagnóstico para pedidos com uma latência mais lida.You can log the diagnostic string for requests that have a higher read latency. A cadeia de diagnóstico capturada irá ajudá-lo a entender quantas vezes recebeu 429 erros para um determinado pedido.The captured diagnostic string will help you understand how many times you received 429 errors for a given request.

ResourceResponse<Document> readDocument = await this.readClient.ReadDocumentAsync(oldDocuments[i].SelfLink);
readDocument.RequestDiagnosticsString 

UrIs de documento de cache para menor leitura de latênciaCache document URIs for lower read latency

Cache document URIs sempre que possível para o melhor desempenho de leitura.Cache document URIs whenever possible for the best read performance. É necessário definir lógica para cache o ID do recurso quando cria um recurso.You need to define logic to cache the resource ID when you create a resource. As análises baseadas em IDs de recursos são mais rápidas do que as procuras baseadas em nomes, por isso caching estes valores melhora o desempenho.Lookups based on resource IDs are faster than name-based lookups, so caching these values improves performance.

Sintonize o tamanho da página para consultas/feeds de leitura para um melhor desempenhoTune the page size for queries/read feeds for better performance

Quando se faz uma leitura a granel de documentos utilizando a funcionalidade de feed de leitura (por exemplo, ReadDocumentFeedAsync ) ou quando emite uma consulta SQL, os resultados são devolvidos de forma segmentada se o conjunto de resultados for demasiado grande.When you do a bulk read of documents by using read feed functionality (for example, ReadDocumentFeedAsync) or when you issue a SQL query, the results are returned in a segmented fashion if the result set is too large. Por predefinição, os resultados são devolvidos em pedaços de 100 itens ou 1 MB, qualquer que seja o limite atingido primeiro.By default, results are returned in chunks of 100 items or 1 MB, whichever limit is hit first.

Para reduzir o número de viagens redondas de rede necessárias para obter todos os resultados aplicáveis, pode aumentar o tamanho da página utilizando a contagem de x-ms-max-item para solicitar até 1.000 cabeçalhos.To reduce the number of network round trips required to retrieve all applicable results, you can increase the page size by using x-ms-max-item-count to request as many as 1,000 headers. Quando precisa de apresentar apenas alguns resultados, por exemplo, se a interface do utilizador ou aplicação API retorna apenas 10 resultados de cada vez, também pode diminuir o tamanho da página para 10 para reduzir a produção consumida para leituras e consultas.When you need to display only a few results, for example, if your user interface or application API returns only 10 results at a time, you can also decrease the page size to 10 to reduce the throughput consumed for reads and queries.

Nota

A maxItemCount propriedade não deve ser usada apenas para paginação.The maxItemCount property shouldn't be used just for pagination. O seu principal uso é melhorar o desempenho das consultas reduzindo o número máximo de itens devolvidos numa única página.Its main use is to improve the performance of queries by reducing the maximum number of items returned in a single page.

Também pode definir o tamanho da página usando os SDKs DB DB do Azure Cosmos disponíveis.You can also set the page size by using the available Azure Cosmos DB SDKs. A propriedade MaxItemCount FeedOptions permite definir o número máximo de itens a serem devolvidos na operação de enumeração.The MaxItemCount property in FeedOptions allows you to set the maximum number of items to be returned in the enumeration operation. Quando maxItemCount está definido para -1, o SDK encontra automaticamente o valor ideal, dependendo do tamanho do documento.When maxItemCount is set to -1, the SDK automatically finds the optimal value, depending on the document size. Por exemplo:For example:

IQueryable<dynamic> authorResults = client.CreateDocumentQuery(documentCollection.SelfLink, "SELECT p.Author FROM Pages p WHERE p.Title = 'About Seattle'", new FeedOptions { MaxItemCount = 1000 });

Quando uma consulta é executada, os dados resultantes são enviados dentro de um pacote TCP.When a query is executed, the resulting data is sent within a TCP packet. Se especificar um valor demasiado baixo para maxItemCount , o número de viagens necessárias para enviar os dados dentro do pacote TCP é elevado, o que afeta o desempenho.If you specify too low a value for maxItemCount, the number of trips required to send the data within the TCP packet is high, which affects performance. Portanto, se não tem certeza de que valor definir para a maxItemCount propriedade, o melhor é defini-lo para -1 e deixar o SDK escolher o valor padrão.So if you're not sure what value to set for the maxItemCount property, it's best to set it to -1 and let the SDK choose the default value.

Aumentar o número de fios/tarefasIncrease the number of threads/tasks

Ver Aumentar o número de linhas/tarefas na secção de networking deste artigo.See Increase the number of threads/tasks in the networking section of this article.

Política de indexaçãoIndexing policy

Excluir os caminhos não utilizados da indexação para assegurar escritas mais rápidasExclude unused paths from indexing for faster writes

A política de indexação DB do Azure Cosmos também permite especificar quais os caminhos documentais a incluir ou excluir da indexação utilizando caminhos de indexação (IndexingPolicy.IncludedPaths e IndexingPolicy.ExcludeedPaths).The Azure Cosmos DB indexing policy also allows you to specify which document paths to include in or exclude from indexing by using indexing paths (IndexingPolicy.IncludedPaths and IndexingPolicy.ExcludedPaths). Os caminhos de indexação podem melhorar o desempenho da escrita e reduzir o armazenamento de índices para cenários em que os padrões de consulta são conhecidos previamente.Indexing paths can improve write performance and reduce index storage for scenarios in which the query patterns are known beforehand. Isto porque os custos de indexação estão correlacionados diretamente com o número de caminhos únicos indexados.This is because indexing costs correlate directly to the number of unique paths indexed. Por exemplo, este código mostra como excluir uma secção inteira dos documentos (uma subtree) de indexação utilizando o wildcard "*":For example, this code shows how to exclude an entire section of the documents (a subtree) from indexing by using the "*" wildcard:

var collection = new DocumentCollection { Id = "excludedPathCollection" };
collection.IndexingPolicy.IncludedPaths.Add(new IncludedPath { Path = "/*" });
collection.IndexingPolicy.ExcludedPaths.Add(new ExcludedPath { Path = "/nonIndexedContent/*");
collection = await client.CreateDocumentCollectionAsync(UriFactory.CreateDatabaseUri("db"), collection);

Para obter mais informações, consulte as políticas de indexação de DB do Azure Cosmos.For more information, see Azure Cosmos DB indexing policies.

ProduçãoThroughput

Meça e sintonize para unidades de pedido mais baixas/segunda utilizaçãoMeasure and tune for lower Request Units/second usage

A Azure Cosmos DB oferece um rico conjunto de operações de base de dados.Azure Cosmos DB offers a rich set of database operations. Estas operações incluem consultas relacionais e hierárquicas com UDFs, procedimentos armazenados e gatilhos, todos operando nos documentos dentro de uma recolha de base de dados.These operations include relational and hierarchical queries with UDFs, stored procedures, and triggers, all operating on the documents within a database collection. O custo associado a cada uma destas operações varia consoante o CPU, IO e memória necessários para completar a operação.The cost associated with each of these operations varies depending on the CPU, IO, and memory required to complete the operation. Em vez de pensar e gerir recursos de hardware, pode pensar numa Unidade de Pedido (RU) como uma única medida para os recursos necessários para realizar várias operações de base de dados e servir um pedido de aplicação.Instead of thinking about and managing hardware resources, you can think of a Request Unit (RU) as a single measure for the resources required to perform various database operations and service an application request.

A produção é proscedida com base no número de Unidades de Pedido definidas para cada contentor.Throughput is provisioned based on the number of Request Units set for each container. Pedido O consumo unitário é avaliado como uma taxa por segundo.Request Unit consumption is evaluated as a rate per second. Os pedidos que excedam a taxa de unidade de pedido prevista para o seu contentor são limitados até que a taxa baixe abaixo do nível previsto para o contentor.Applications that exceed the provisioned Request Unit rate for their container are limited until the rate drops below the provisioned level for the container. Se a sua aplicação necessitar de um nível de produção mais elevado, pode aumentar a sua produção fornecendo Unidades de Pedido adicionais.If your application requires a higher level of throughput, you can increase your throughput by provisioning additional Request Units.

A complexidade de uma consulta afeta a quantidade de Unidades de Pedido consumidas numa operação.The complexity of a query affects how many Request Units are consumed for an operation. O número de predicados, a natureza dos predicados, o número de UDFs e o tamanho do conjunto de dados de origem influenciam o custo das operações de consulta.The number of predicates, the nature of the predicates, the number of UDFs, and the size of the source dataset all influence the cost of query operations.

Para medir a sobrecarga de qualquer operação (criar, atualizar ou apagar), inspecione o cabeçalho x-ms-request-charge (ou a propriedade equivalente RequestCharge dentro ou no ResourceResponse\<T> FeedResponse\<T> .NET SDK) para medir o número de Unidades de Pedido consumidas pelas operações:To measure the overhead of any operation (create, update, or delete), inspect the x-ms-request-charge header (or the equivalent RequestCharge property in ResourceResponse\<T> or FeedResponse\<T> in the .NET SDK) to measure the number of Request Units consumed by the operations:

// Measure the performance (Request Units) of writes
ResourceResponse<Document> response = await client.CreateDocumentAsync(collectionSelfLink, myDocument);
Console.WriteLine("Insert of document consumed {0} request units", response.RequestCharge);
// Measure the performance (Request Units) of queries
IDocumentQuery<dynamic> queryable = client.CreateDocumentQuery(collectionSelfLink, queryString).AsDocumentQuery();
while (queryable.HasMoreResults)
    {
        FeedResponse<dynamic> queryResponse = await queryable.ExecuteNextAsync<dynamic>();
        Console.WriteLine("Query batch consumed {0} request units", queryResponse.RequestCharge);
    }

A taxa de pedido devolvida neste cabeçalho é uma fração da sua produção proviscionada (ou seja, 2.000 RUs/segundo).The request charge returned in this header is a fraction of your provisioned throughput (that is, 2,000 RUs / second). Por exemplo, se a consulta anterior devolver 1.000 documentos 1-KB, o custo da operação é de 1.000.For example, if the preceding query returns 1,000 1-KB documents, the cost of the operation is 1,000. Então, dentro de um segundo, o servidor honra apenas dois desses pedidos antes de taxa limitando pedidos posteriores.So, within one second, the server honors only two such requests before rate limiting later requests. Para obter mais informações, consulte Unidades de Pedido e a calculadora da Unidade de Pedido.For more information, see Request Units and the Request Unit calculator.

Taxa de maneneta limitando/taxa de pedido demasiado grandeHandle rate limiting/request rate too large

Quando um cliente tenta exceder a produção reservada para uma conta, não há degradação de desempenho no servidor e não há uso da capacidade de produção para além do nível reservado.When a client attempts to exceed the reserved throughput for an account, there's no performance degradation at the server and no use of throughput capacity beyond the reserved level. O servidor terminará preventivamente o pedido com o RequestRateTooLarge (código de estado HTTP 429).The server will preemptively end the request with RequestRateTooLarge (HTTP status code 429). Retornará um cabeçalho x-ms-retry-after-ms que indica o tempo, em milissegundos, que o utilizador deve esperar antes de tentar novamente o pedido.It will return an x-ms-retry-after-ms header that indicates the amount of time, in milliseconds, that the user must wait before attempting the request again.

HTTP Status 429,
Status Line: RequestRateTooLarge
x-ms-retry-after-ms :100

Os SDKs capturam implicitamente esta resposta, respeitam o cabeçalho especificado pelo servidor e recaem o pedido.The SDKs all implicitly catch this response, respect the server-specified retry-after header, and retry the request. A menos que a sua conta esteja a ser acedida simultaneamente por vários clientes, a próxima repetição será bem sucedida.Unless your account is being accessed concurrently by multiple clients, the next retry will succeed.

Se tiver mais de um cliente a operar de forma cumulativa acima da taxa de pedido, a contagem de retíria por defeito atualmente definida para 9 internamente pelo cliente pode não ser suficiente.If you have more than one client cumulatively operating consistently above the request rate, the default retry count currently set to 9 internally by the client might not suffice. Neste caso, o cliente lança um DocumentClientException com o código de estado 429 para a aplicação.In this case, the client throws a DocumentClientException with status code 429 to the application.

Pode alterar a contagem de repetição por defeito definindo RetryOptions a no ConnectionPolicy caso.You can change the default retry count by setting the RetryOptions on the ConnectionPolicy instance. Por predefinição, o DocumentClientException com o código de estado 429 é devolvido após um tempo de espera acumulado de 30 segundos se o pedido continuar a funcionar acima da taxa de pedido.By default, the DocumentClientException with status code 429 is returned after a cumulative wait time of 30 seconds if the request continues to operate above the request rate. Este erro retorna mesmo quando a contagem de repetição atual é inferior à contagem máxima de repetição, quer o valor atual seja o padrão de 9 ou um valor definido pelo utilizador.This error returns even when the current retry count is less than the maximum retry count, whether the current value is the default of 9 or a user-defined value.

O comportamento de relembolso automatizado ajuda a melhorar a resiliência e a usabilidade para a maioria das aplicações.The automated retry behavior helps improve resiliency and usability for most applications. Mas pode não ser o melhor comportamento quando se está a fazer referências de desempenho, especialmente quando se está a medir a latência.But it might not be the best behavior when you're doing performance benchmarks, especially when you're measuring latency. A latência observada pelo cliente aumentará se a experiência atingir o acelerador do servidor e fizer com que o cliente SDK volte a tentar silenciosamente.The client-observed latency will spike if the experiment hits the server throttle and causes the client SDK to silently retry. Para evitar picos de latência durante as experiências de desempenho, meça a carga devolvida por cada operação e certifique-se de que os pedidos estão a funcionar abaixo da taxa de pedido reservada.To avoid latency spikes during performance experiments, measure the charge returned by each operation and ensure that requests are operating below the reserved request rate. Para mais informações, consulte Unidades de Pedido.For more information, see Request Units.

Para uma maior produção, design para documentos menoresFor higher throughput, design for smaller documents

A taxa de pedido (isto é, o custo de processamento de pedido) de uma determinada operação está diretamente relacionada com a dimensão do documento.The request charge (that is, the request-processing cost) of a given operation correlates directly to the size of the document. As operações em grandes documentos custam mais do que operações em pequenos documentos.Operations on large documents cost more than operations on small documents.

Passos seguintesNext steps

Para uma aplicação de amostra que é usada para avaliar Azure Cosmos DB para cenários de alto desempenho em algumas máquinas de clientes, consulte testes de desempenho e escala com Azure Cosmos DB.For a sample application that's used to evaluate Azure Cosmos DB for high-performance scenarios on a few client machines, see Performance and scale testing with Azure Cosmos DB.

Para saber mais sobre a conceção da sua aplicação para escala e alto desempenho, consulte Partition e dimensionamento em Azure Cosmos DB.To learn more about designing your application for scale and high performance, see Partitioning and scaling in Azure Cosmos DB.