Sugerencias de rendimiento para Azure Cosmos DB y el SDK de .NET v2Performance tips for Azure Cosmos DB and .NET SDK v2

SE APLICA A: SQL API

Azure Cosmos DB es una base de datos distribuida rápida y flexible que se escala sin problemas con una latencia y un rendimiento garantizados.Azure Cosmos DB is a fast and flexible distributed database that scales seamlessly with guaranteed latency and throughput. No es necesario realizar cambios de arquitectura importantes ni escribir el código complejo para escalar la base de datos con 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 o reducir verticalmente es tan sencillo como realizar una única llamada API.Scaling up and down is as easy as making a single API call. Para más información, consulte cómo aprovisionar el rendimiento del contenedor o cómo aprovisionar el rendimiento de la base de datos.To learn more, see how to provision container throughput or how to provision database throughput. Sin embargo, dado que se tiene acceso a Azure Cosmos DB a través de llamadas de red, existen optimizaciones del lado cliente que se pueden realizar para lograr el máximo rendimiento cuando se usa el del SDK de .NET para SQL.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 lo tanto, si está intentando mejorar el rendimiento de la base de datos, tenga en cuenta estas opciones:So, if you're trying to improve your database performance, consider these options:

Actualización al SDK de .NET v3Upgrade to the .NET V3 SDK

Se publicó el SDK de .NET v3.The .NET v3 SDK is released. Si usa el SDK de .NET v3, consulte la información siguiente en la guía de rendimiento de .NET v3:If you use the .NET v3 SDK, see the .NET v3 performance guide for the following information:

  • Valores predeterminados en el modo TCP directoDefaults to Direct TCP mode
  • Compatibilidad con Stream APIStream API support
  • Compatibilidad con el serializador personalizado para permitir el uso de System.Text.JSONSupport custom serializer to allow System.Text.JSON usage
  • Compatibilidad integrada en bloque y en masaIntegrated batch and bulk support

Hospedando recomendacionesHosting recommendations

En el caso de cargas de trabajo con un uso intensivo de consultas, use Windows de 64 bits en lugar del procesamiento de host de Windows de 32 bits y LinuxFor query-intensive workloads, use Windows 64-bit instead of Linux or Windows 32-bit host processing

Se recomienda el procesamiento de host de Windows de 64 bits para mejorar el rendimiento.We recommend Windows 64-bit host processing for improved performance. El SDK de SQL incluye un archivo ServiceInterop.dll nativo para analizar y optimizar consultas localmente.The SQL SDK includes a native ServiceInterop.dll to parse and optimize queries locally. ServiceInterop.dll solo se admite en la plataforma Windows x64.ServiceInterop.dll is supported only on the Windows x64 platform. En el caso de Linux y otras plataformas no compatibles en las que ServiceInterop.dll no está disponible, se realiza una llamada de red adicional a la puerta de enlace para obtener la consulta optimizada.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. Los siguientes tipos de aplicaciones utilizan el procesamiento de host de 32 bits de forma predeterminada.The following types of applications use 32-bit host processing by default. Para cambiar el procesamiento de host al procesamiento de 64 bits, siga estos pasos según el tipo de la aplicación:To change host processing to 64-bit processing, follow these steps, based on the type of your application:

  • En el caso de las aplicaciones ejecutables, puede cambiar el procesamiento de host estableciendo el destino de la plataforma en x64 en la ventana Propiedades del proyecto, en la pestaña Compilar.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 proyectos de prueba basados en VSTest, puede cambiar el procesamiento del host seleccionando Prueba > Configuración de prueba > Arquitectura de procesador predeterminada como X64 en el menú de Prueba de Visual Studio.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.

  • En el caso de las aplicaciones Web de ASP.NET implementadas de forma local, puede cambiar el procesamiento de host seleccionando Usar la versión de 64 bits de IIS Express para proyectos y sitios web en Herramientas > Opciones > Proyectos y Proyectos > de Soluciones Web.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.

  • En el caso de las aplicaciones Web de ASP.NET implementadas en Azure, puede cambiar el procesamiento de host seleccionando la plataforma de 64 bits en Configuración de la aplicación en el Azure Portal.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

De forma predeterminada, los nuevos proyectos de Visual Studio se establecen en cualquier CPU.By default, new Visual Studio projects are set to Any CPU. Se recomienda establecer el proyecto en x64 para que no cambie a x86.We recommend that you set your project to x64 so it doesn't switch to x86. Un proyecto establecido para cualquier CPU puede cambiar fácilmente a x86 si se agrega una dependencia de solo x86.A project set to Any CPU can easily switch to x86 if an x86-only dependency is added.
ServiceInterop.dll debe estar en la carpeta desde la que se ejecuta la DLL del SDK.ServiceInterop.dll needs to be in the folder that the SDK DLL is being executed from. Esto solo debe ser un problema si se copian manualmente los archivos DLL o los sistemas de compilación o implementación personalizados.This should be a concern only if you manually copy DLLs or have custom build/deployment systems.

Activación de la recolección de elementos no utilizados (GC) del lado servidorTurn on server-side garbage collection (GC)

La reducción de la frecuencia de recolección de elementos no utilizados puede ayudar en algunos casos.Reducing the frequency of garbage collection can help in some cases. En .NET, establezca gcServer en true.In .NET, set gcServer to true.

Escalado horizontal de la carga de trabajo de clienteScale out your client workload

Si va a realizar pruebas en niveles de alto rendimiento (más de 50 000 RU/s), la aplicación del cliente podría convertirse en el cuello de botella debido a que el equipo se limita al uso de la CPU o la red.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. Si llega a este punto, puede seguir insertando la cuenta de Azure Cosmos DB mediante la escala horizontal de las aplicaciones cliente en varios 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

Un uso elevado de CPU puede provocar el aumento de la latencia, así como excepciones de tiempo de espera de solicitud.High CPU usage can cause increased latency and request timeout exceptions.

RedesNetworking

Directiva de conexión: uso del modo de conexión directaConnection policy: Use direct connection mode

El modo de conexión predeterminado del SDK de .NET V2 es la puerta de enlace..NET V2 SDK default connection mode is gateway. El modo de conexión se configura durante la construcción de la instancia de DocumentClient mediante el parámetro ConnectionPolicy.You configure the connection mode during the construction of the DocumentClient instance by using the ConnectionPolicy parameter. Si usa el modo directo, también debe establecer Protocol mediante el parámetro ConnectionPolicy.If you use direct mode, you need to also set the Protocol by using the ConnectionPolicy parameter. Para obtener más información sobre las distintas opciones de conectividad, vea el artículo Modos de conectividad.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
});

Agotamiento de puertos efímerosEphemeral port exhaustion

Si en las instancias detecta un volumen de conexiones alto o un uso elevado de los puertos, compruebe primero que las instancias del cliente son singleton.If you see a high connection volume or high port usage on your instances, first verify that your client instances are singletons. Es decir, las instancias de cliente deben ser únicas para la duración de la aplicación.In other words, the client instances should be unique for the lifetime of the application.

Cuando se ejecuta en el protocolo TCP, el cliente se optimiza para la latencia mediante conexiones de larga duración en lugar de con el protocolo HTTPS, que finaliza las conexiones tras dos minutos de inactividad.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.

En escenarios en los que tiene acceso disperso y observa un recuento de conexiones superior en comparación con el acceso del modo de puerta de enlace, puede hacer lo siguiente: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 la propiedad ConnectionPolicy.PortReuseMode en PrivatePortPool (en vigor con la versión de Framework >= 4.6.1 y la versión de .NET Core >= 2.0): Esta propiedad permite al SDK usar un pequeño grupo de puertos efímeros para diferentes puntos de conexión de destino de 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 la propiedad ConnectionPolicy.IdleConnectionTimeout para que sea mayor o igual que 10 minutos.Configure the ConnectionPolicy.IdleConnectionTimeout property must be greater than or equal to 10 minutes. Los valores recomendados son entre 20 minutos y 24 horas.The recommended values are between 20 minutes and 24 hours.

Llamada a OpenAsync para evitar la latencia de inicio en la primera solicitudCall OpenAsync to avoid startup latency on first request

De forma predeterminada, la primera solicitud tiene una latencia mayor porque debe capturar la tabla de enrutamiento de direcciones.By default, the first request has higher latency because it needs to fetch the address routing table. Cuando use SDK V2, llame a OpenAsync() una vez durante la inicialización para evitar esta latencia de inicio en la primera solicitud.When you use SDK V2, call OpenAsync() once during initialization to avoid this startup latency on the first request. La llamada tiene el aspecto siguiente: await client.OpenAsync();The call looks like: await client.OpenAsync();

Nota

OpenAsync generará solicitudes para obtener la tabla de enrutamiento de direcciones para todos los contenedores de la cuenta.OpenAsync will generate requests to obtain the address routing table for all the containers in the account. En el caso de las cuentas que tienen muchos contenedores pero cuya aplicación tiene acceso a un subconjunto de ellos, OpenAsync generaría una cantidad innecesaria de tráfico, lo que haría que la inicialización fuera 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. Por lo tanto, el uso de OpenAsync podría no ser útil en este escenario porque ralentiza el inicio de la aplicación.So using OpenAsync might not be useful in this scenario because it slows down application startup.

Para el rendimiento, colocar a los clientes de la misma región de AzureFor performance, collocate clients in same Azure region

Cuando sea posible, coloque las aplicaciones que llaman a Azure Cosmos DB en la misma región que la base de datos de Azure Cosmos DB.When possible, place any applications that call Azure Cosmos DB in the same region as the Azure Cosmos DB database. Esta es una comparación aproximada: las llamadas a Azure Cosmos DB en la misma región se completan entre 1 ms y 2 ms, pero la latencia entre la costa oeste y el este de EE. UU. es superior a 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 latencia puede variar de una solicitud a otra, en función de la ruta realizada por la solicitud a medida que pasa del cliente al límite del centro de recursos de 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. Para obtener la menor latencia posible, asegúrese de que la aplicación que realiza la llamada se encuentra dentro de la misma región de Azure que el punto de conexión de Azure Cosmos DB aprovisionado.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 obtener una lista de las regiones disponibles, vea Regiones de Azure.For a list of available regions, see Azure regions.

La Directiva de conexión de Azure Cosmos DB

Aumentar el número de subprocesos o tareas Increase the number of threads/tasks

Dado que las llamadas a Azure Cosmos DB se realizan a través de la red, puede que tenga que cambiar el grado de paralelismo de las solicitudes para que la aplicación cliente dedique tiempo mínimo a esperar entre solicitudes.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 ejemplo, si usa la biblioteca TPL de .NET, cree en el orden de cientos de tareas que leen o escriben en 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.

Habilitación de la redes aceleradasEnable accelerated networking

Para reducir la latencia y la vibración de la CPU, se recomienda habilitar redes aceleradas en las máquinas virtuales de cliente.To reduce latency and CPU jitter, we recommend that you enable accelerated networking on client virtual machines. Consulte Creación de una máquina virtual Windows con redes aceleradas o Creación de una máquina virtual Linux con redes aceleradas.See Create a Windows virtual machine with accelerated networking or Create a Linux virtual machine with accelerated networking.

Uso del SDKSDK usage

Instalación del SDK más recienteInstall the most recent SDK

Los SDK de Azure Cosmos DB se mejoran constantemente para proporcionar el mejor rendimiento.The Azure Cosmos DB SDKs are constantly being improved to provide the best performance. Consulte las páginas del SDK de Azure Cosmos DB para determinar las mejoras de los SDK y las revisiones más recientes.See the Azure Cosmos DB SDK pages to determine the most recent SDK and review improvements.

Uso de un cliente de Azure Cosmos DB singleton para aumentar la duración de la aplicaciónUse a singleton Azure Cosmos DB client for the lifetime of your application

Cada instancia de DocumentClient es segura para subprocesos y realiza una administración eficaz de la conexión y el almacenamiento en caché de direcciones cuando funciona en modo directo.Each DocumentClient instance is thread-safe and performs efficient connection management and address caching when operating in direct mode. Para permitir una administración de conexión eficaz y un mejor rendimiento del cliente de SDK, se recomienda usar una sola instancia por AppDomain durante la vigencia de la aplicación.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.

Aumentar System.Net MaxConnections por host al usar el modo de puerta de enlaceIncrease System.Net MaxConnections per host when using gateway mode

Las solicitudes de Azure Cosmos DB se realizan a través de HTTPS o REST cuando se usa el modo de puerta de enlace.Azure Cosmos DB requests are made over HTTPS/REST when you use gateway mode. Están sujetos al límite de conexiones predeterminado por nombre de host o dirección IP.They're subjected to the default connection limit per hostname or IP address. Es posible que tenga que establecer MaxConnections en un valor superior (de 100 a 1 000) para que la biblioteca de cliente pueda utilizar varias conexiones simultáneas para 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. En el SDK de .NET 1.8.0 y versiones posteriores, el valor predeterminado de ServicePointManager.DefaultConnectionLimit es 50.In .NET SDK 1.8.0 and later, the default value for ServicePointManager.DefaultConnectionLimit is 50. Para cambiar el valor, puede establecer Documents.Client.ConnectionPolicy.MaxConnectionLimit en un valor superior.To change the value, you can set Documents.Client.ConnectionPolicy.MaxConnectionLimit to a higher value.

Optimizar consultas paralelas para colecciones con particionesTune parallel queries for partitioned collections

El SDK de .NET para SQL 1.9.0 y versiones posteriores admiten consultas paralelas, que permiten consultar una colección con particiones en paralelo.SQL .NET SDK 1.9.0 and later support parallel queries, which enable you to query a partitioned collection in parallel. Para obtener más información, consulte ejemplos de código relacionados para trabajar con los SDK.For more information, see code samples related to working with the SDKs. Las consultas paralelas están diseñadas para proporcionar una mejor latencia de consulta y rendimiento que su homólogo en serie.Parallel queries are designed to provide better query latency and throughput than their serial counterpart. Las consultas paralelas proporcionan dos parámetros que se pueden adaptar para ajustarse a sus requisitos:Parallel queries provide two parameters that you can tune to fit your requirements:

  • MaxDegreeOfParallelism controla el número máximo de particiones que se pueden consultar en paralelo.MaxDegreeOfParallelism controls the maximum number of partitions that can be queried in parallel.
  • MaxBufferedItemCount controla el número de resultados capturados previamente.MaxBufferedItemCount controls the number of pre-fetched results.

Grado de optimización del paralelismoTuning degree of parallelism

La consulta en paralelo funciona consultando varias particiones en paralelo.Parallel query works by querying multiple partitions in parallel. Sin embargo, los datos de una partición individual se capturan en serie con respecto a la consulta.But data from an individual partition is fetched serially with respect to the query. Al establecer MaxDegreeOfParallelism en SDK v2 en el número de particiones, tiene la mejor posibilidad de lograr la consulta de mayor rendimiento, siempre y cuando todas las demás condiciones del sistema sigan siendo las mismas.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. Si no conoce el número de particiones, puede establecer el grado de paralelismo en un número alto.If you don't know the number of partitions, you can set the degree of parallelism to a high number. El sistema elegirá el mínimo (número de particiones, entrada proporcionada por el usuario) como el grado de paralelismo.The system will choose the minimum (number of partitions, user provided input) as the degree of parallelism.

Las consultas paralelas son las que mayor ventaja ofrecen si los datos se distribuyen de manera uniforme entre todas las particiones con respecto a la consulta.Parallel queries produce the most benefit if the data is evenly distributed across all partitions with respect to the query. Si la colección con particiones tiene particiones para que todos o la mayoría de los datos devueltos por una consulta se concentren en algunas particiones (una partición es el peor caso), esas particiones producirán cuellos de botella en el rendimiento de la 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.

Optimizar MaxBufferedItemCountTuning MaxBufferedItemCount

Las consultas en paralelo están diseñadas para capturar previamente los resultados mientras el cliente procesa el lote actual de resultados.Parallel query is designed to pre-fetch results while the current batch of results is being processed by the client. Esta captura previa ayuda a mejorar la latencia general de una consulta.This pre-fetching helps improve the overall latency of a query. El parámetro MaxBufferedItemCount limita el número de resultados capturados previamente.The MaxBufferedItemCount parameter limits the number of pre-fetched results. Establezca MaxBufferedItemCount en el número esperado de resultados devueltos (o un número más alto) para permitir que la consulta reciba el máximo beneficio de la captura previa.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.

La captura previa funciona de la misma manera, independientemente del grado de paralelismo y hay un único búfer para los datos de todas las particiones.Pre-fetching works the same way regardless of the degree of parallelism, and there's a single buffer for the data from all partitions.

Implementación del retroceso según intervalos RetryAfterImplement backoff at RetryAfter intervals

Durante las pruebas de rendimiento, debe aumentar la carga hasta que se limite una pequeña tasa de solicitudes.During performance testing, you should increase load until a small rate of requests are throttled. Si se limitan las solicitudes, la aplicación del cliente debe volver al límite para el intervalo de reintentos especificado por el servidor.If requests are throttled, the client application should back off on throttle for the server-specified retry interval. Respetar el retroceso garantiza una cantidad mínima de tiempo en espera entre reintentos.Respecting the backoff ensures you spend a minimal amount of time waiting between retries.

La compatibilidad con la directiva de reintentos se incluye en estos SDK:Retry policy support is included in these SDKs:

Para más información, consulte RetryAfter.For more information, see RetryAfter.

En la versión 1.19 y posteriores del SDK de .NET, hay un mecanismo para registrar información de diagnóstico adicional y problemas de latencia de solución de problemas, tal como se muestra en el ejemplo siguiente.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. Puede registrar la cadena de diagnóstico para las solicitudes que tienen una mayor latencia de lectura.You can log the diagnostic string for requests that have a higher read latency. La cadena de diagnóstico capturada le ayudará a comprender cuántas veces ha recibido 429 errores para una solicitud determinada.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 

Almacenamiento en caché de los identificadores URI de documentos para una latencia menor en las operaciones de lecturaCache document URIs for lower read latency

Siempre que sea posible, almacene en caché los identificadores URI para obtener el mejor rendimiento en las operaciones de lectura.Cache document URIs whenever possible for the best read performance. Debe definir la lógica para almacenar en caché el identificador de recurso al crear un recurso.You need to define logic to cache the resource ID when you create a resource. Las búsquedas basadas en identificadores de recursos son más rápidas que las búsquedas basadas en nombres, por lo que el almacenamiento en caché de estos valores mejora el rendimiento.Lookups based on resource IDs are faster than name-based lookups, so caching these values improves performance.

Ajuste del tamaño de página en consultas y fuentes de lectura para aumentar el rendimientoTune the page size for queries/read feeds for better performance

Cuando se realiza una lectura masiva de documentos mediante la funcionalidad de fuente de lectura (por ejemplo, ReadDocumentFeedAsync) o cuando se emite una consulta SQL, los resultados se devuelven de forma segmentada si el conjunto de resultados es 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. De forma predeterminada, se devuelven resultados en fragmentos de 1 MB o de 100 artículos, el límite que se alcance primero.By default, results are returned in chunks of 100 items or 1 MB, whichever limit is hit first.

Para reducir el número de recorridos de ida y vuelta de red necesarios para recuperar todos los resultados aplicables, puede aumentar el tamaño de página mediante x-ms-max-item-count para solicitar un máximo de 1 000 encabezados.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. Si necesita mostrar solo unos cuantos resultados, por ejemplo, si la interfaz de usuario o la API de aplicación solo devuelve 10 resultados a la vez, también puede reducir el tamaño de página a 10 para reducir el rendimiento consumido en las lecturas y 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

La propiedad maxItemCount no se debe utilizar solo para la paginación.The maxItemCount property shouldn't be used just for pagination. Su uso principal es mejorar el rendimiento de las consultas reduciendo el número máximo de elementos devueltos en una sola página.Its main use is to improve the performance of queries by reducing the maximum number of items returned in a single page.

También puede establecer el tamaño de página mediante los SDK de Azure Cosmos DB disponibles.You can also set the page size by using the available Azure Cosmos DB SDKs. La propiedad MaxItemCount de FeedOptions permite establecer el número máximo de elementos que se devolverán en la operación de enumeración.The MaxItemCount property in FeedOptions allows you to set the maximum number of items to be returned in the enumeration operation. Cuando maxItemCount se establece en-1, el SDK busca automáticamente el valor óptimo, en función del tamaño del documento.When maxItemCount is set to -1, the SDK automatically finds the optimal value, depending on the document size. Por ejemplo:For example:

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

Cuando se ejecuta una consulta, se envían los datos resultantes en un paquete TCP.When a query is executed, the resulting data is sent within a TCP packet. Si especifica un valor demasiado bajo para maxItemCount, el número de viajes necesarios para enviar los datos dentro del paquete TCP es alto, lo que afecta al rendimiento.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. Por lo tanto, si no está seguro del valor que se va a establecer para la propiedad maxItemCount, es mejor establecerlo en -1 y dejar que el SDK elija el valor predeterminado.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 el número de subprocesos o tareasIncrease the number of threads/tasks

Consulte Aumentar el número de subprocesos y tareas en la sección de redes de este artículo.See Increase the number of threads/tasks in the networking section of this article.

Directiva de indexaciónIndexing policy

Exclusión de rutas de acceso sin utilizar de la indexación para acelerar las escriturasExclude unused paths from indexing for faster writes

La Directiva de indexación de Azure Cosmos DB también le permite especificar las rutas de acceso de documentos que se van a incluir o excluir de la indexación mediante rutas de acceso de indexación (IndexingPolicy.IncludedPaths and IndexingPolicy.ExcludedPaths).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). Las rutas de indexación pueden mejorar el rendimiento de escritura y reducir el almacenamiento de índices en los escenarios en los que los patrones de consulta se conocen con antelación.Indexing paths can improve write performance and reduce index storage for scenarios in which the query patterns are known beforehand. Esto se debe a que los costos de indización se relacionan directamente con el número de rutas de acceso únicas indizadas.This is because indexing costs correlate directly to the number of unique paths indexed. Por ejemplo, este código muestra cómo excluir una sección completa de los documentos (un subárbol) de la indexación mediante el carácter comodín "*":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 más información, consulte Directivas de indexación de Azure Cosmos DB.For more information, see Azure Cosmos DB indexing policies.

RendimientoThroughput

Medición y optimización del uso menor de unidades de solicitud por segundoMeasure and tune for lower Request Units/second usage

Azure Cosmos DB ofrece un amplio conjunto de operaciones de base de datos.Azure Cosmos DB offers a rich set of database operations. Estas operaciones incluyen consultas relacionales y jerárquicas con UDF, procedimientos almacenados y desencadenadores que funcionan en los documentos de una colección de base de datos.These operations include relational and hierarchical queries with UDFs, stored procedures, and triggers, all operating on the documents within a database collection. El costo asociado a cada una de estas operaciones varía en función de la CPU, la E/S y la memoria necesaria para completar la operación.The cost associated with each of these operations varies depending on the CPU, IO, and memory required to complete the operation. En lugar de pensar y administrar los recursos de hardware, puede pensar en una unidad de solicitud (RU) como una única medida para los recursos necesarios para realizar varias operaciones de base de datos y dar servicio a una solicitud de aplicación.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.

El rendimiento se aprovisiona en función del número de unidades de solicitud establecidas para cada contenedor.Throughput is provisioned based on the number of Request Units set for each container. El consumo de la unidad de solicitud se evalúa como una tarifa por segundo.Request Unit consumption is evaluated as a rate per second. Las aplicaciones que superan la frecuencia de unidad de solicitud aprovisionada para su contenedor se limitan hasta que la velocidad cae por debajo del nivel aprovisionado para el contenedor.Applications that exceed the provisioned Request Unit rate for their container are limited until the rate drops below the provisioned level for the container. Si su aplicación requiere un mayor nivel de rendimiento, puede aumentar el rendimiento mediante el aprovisionamiento de unidades de solicitud adicionales.If your application requires a higher level of throughput, you can increase your throughput by provisioning additional Request Units.

La complejidad de una consulta afecta a la cantidad de unidades de solicitud que se consumen para una operación.The complexity of a query affects how many Request Units are consumed for an operation. El número de predicados, la naturaleza de los predicados, el número de UDF y el tamaño del conjunto de código de origen influyen en el coste de las operaciones 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 la sobrecarga de cualquier operación (crear, actualizar o eliminar), inspeccione el encabezado x-ms-request-charge (o la propiedad equivalente a RequestCharge en ResourceResponse\<T> o FeedResponse\<T> en el SDK de .NET) para medir el número de unidades de solicitud consumidas por las operaciones: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);
    }

El cargo de solicitud devuelto en este encabezado es una fracción del rendimiento aprovisionado (es decir, 2 000 RUs por segundo).The request charge returned in this header is a fraction of your provisioned throughput (that is, 2,000 RUs / second). Por ejemplo, si la consulta anterior devuelve 1 000 documentos de 1 KB, el costo de la operación es 1 000.For example, if the preceding query returns 1,000 1-KB documents, the cost of the operation is 1,000. Por lo tanto, en un segundo, el servidor respeta solo dos solicitudes de este tipo antes de la limitación de velocidad de las solicitudes posteriores.So, within one second, the server honors only two such requests before rate limiting later requests. Para más información, consulte Unidades de solicitud y la Calculadora de unidades de solicitud .For more information, see Request Units and the Request Unit calculator.

Administración de la limitación de velocidad y la tasa de solicitudes demasiado grandeHandle rate limiting/request rate too large

Cuando un cliente intenta superar la capacidad de proceso reservada para una cuenta, no hay degradación del rendimiento en el servidor y no se usa la capacidad de rendimiento más allá del nivel 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. El servidor finalizará de forma preventiva la solicitud con RequestRateTooLarge (código de Estado HTTP 429).The server will preemptively end the request with RequestRateTooLarge (HTTP status code 429). Devolverá un encabezado x-ms-retry-after-ms que indica la cantidad de tiempo, en milisegundos, que el usuario debe esperar antes de volver a intentar la solicitud.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

Los SDK capturan implícitamente esta respuesta, respetan el encabezado retry-after especificado por el servidor y reintentan la solicitud.The SDKs all implicitly catch this response, respect the server-specified retry-after header, and retry the request. A menos que varios clientes obtengan acceso a la cuenta al mismo tiempo, el siguiente reintento se realizará correctamente.Unless your account is being accessed concurrently by multiple clients, the next retry will succeed.

Si tiene más de un cliente que funciona acumulativamente de forma sistemática por encima de la tasa de solicitudes, es posible que el número de reintentos predeterminado establecido en 9 internamente por el cliente no sea 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. En este caso, el cliente inicia una DocumentClientException con el código de estado 429 en la aplicación.In this case, the client throws a DocumentClientException with status code 429 to the application.

Puede cambiar el número de reintentos predeterminado estableciendo el RetryOptions en la instancia de ConnectionPolicy.You can change the default retry count by setting the RetryOptions on the ConnectionPolicy instance. De forma predeterminada, la excepción DocumentClientException con el código de estado 429 se devuelve tras un tiempo de espera acumulativo de 30 segundos si la solicitud sigue funcionando por encima de la tasa de solicitudes.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 error se devuelve aunque el número de reintentos actual sea inferior al número máximo de reintentos, tanto si el valor actual es el predeterminado de 9 como si es un valor definido por el usuario.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.

El comportamiento de reintento automatizado ayuda a mejorar la resistencia y la facilidad de uso de la mayoría de las aplicaciones.The automated retry behavior helps improve resiliency and usability for most applications. Pero es posible que no sea el mejor comportamiento al realizar pruebas comparativas de rendimiento, especialmente cuando se mide la latencia.But it might not be the best behavior when you're doing performance benchmarks, especially when you're measuring latency. La latencia observada del cliente aumentará si el experimento llega a la limitación del servidor y hace que el SDK del cliente realice reintentos de forma silenciosa.The client-observed latency will spike if the experiment hits the server throttle and causes the client SDK to silently retry. Para evitar aumentos de latencia durante los experimentos de rendimiento, mida el gasto devuelto por cada operación y asegúrese de que las solicitudes funcionan por debajo de la tasa de solicitudes observada.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 más información, consulte Unidades de solicitud.For more information, see Request Units.

Para un mayor rendimiento, diseñe para documentos más pequeñosFor higher throughput, design for smaller documents

El cargo de la solicitud (es decir, el coste de procesamiento de solicitudes) de una operación determinada se correlaciona directamente con el tamaño del documento.The request charge (that is, the request-processing cost) of a given operation correlates directly to the size of the document. Las operaciones en documentos grandes cuestan más que las operaciones en documentos pequeños.Operations on large documents cost more than operations on small documents.

Pasos siguientesNext steps

Para obtener una aplicación de ejemplo que se usa para evaluar Azure Cosmos DB en escenarios de alto rendimiento en algunos equipos del cliente, consulte Rendimiento y pruebas de escalado con 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 más información sobre cómo diseñar la aplicación para escalarla y obtener un alto rendimiento, consulte Partición y escalado en Azure Cosmos DB.To learn more about designing your application for scale and high performance, see Partitioning and scaling in Azure Cosmos DB.