Resolver problemas de rendimiento

Consultas lentas, escrituras concentradas y nodos sin io_uring.

Estos son los problemas de rendimiento que más se ven. De cada uno tienes la causa, cómo confirmarla, cómo resolverlo y qué hacer para que no vuelva a pasar.

Una consulta lee muchos más documentos de los que devuelve

La consulta tarda y su tiempo crece con el tamaño de la colección. Devuelve pocos documentos, pero el nodo recorre muchos más para encontrarlos.

Causa

Ningún índice cubre el filtro o el orden de la consulta, así que el planificador recorre la colección entera o un índice que solo sirve para una parte del filtro.

Cómo confirmarlo

Compara dos cifras. Ejecuta la consulta con explain("executionStats") y, si totalDocsExamined es mucho mayor que nReturned, el nodo está leyendo documentos que luego descarta.

Solución

Crea un índice con los campos de igualdad del filtro primero, después los del orden y por último los de rango. Vuelve a ejecutar explain para ver que lo usa.

Cómo evitarlo

Pasa las consultas nuevas por el perfilador antes de llevarlas a producción, con una copia de los datos de producción, porque con una colección pequeña cualquier consulta parece rápida y el perfilador no te avisa de los documentos que lee de más.

Las escrituras se concentran en un rango

Un nodo trabaja mucho más que los demás. Casi todas las escrituras de una colección van al mismo rango, y ese rango se divide una y otra vez.

Causa

La clave de los documentos, o la de un índice, siempre crece: un ObjectId, una fecha de creación o un contador. Toda entrada nueva cae al final del intervalo.

Cómo confirmarlo

Ejecuta teseladb admin ranges --collection <base.colección>. Verás un rango que se divide una y otra vez por su final mientras los demás apenas cambian.

Solución

Cambia la clave. Usa para los documentos una clave que no crezca siempre, como un UUID aleatorio, y crea los índices sobre una fecha o un contador con teselaBuckets, que reparte sus entradas en cubos hash.

Cómo evitarlo

Antes de crear una colección con muchas escrituras, decide su clave con Claves y puntos calientes delante.

Un nodo va más lento que los demás

Las operaciones que lidera un nodo tardan más que las mismas operaciones en los demás nodos, con la misma carga y los mismos datos.

Causa

Hay dos causas posibles. El kernel de esa máquina no tiene io_uring y el nodo usa hilos de E/S, o su disco no es NVMe.

Cómo confirmarlo

Empieza por el log. La línea de arranque del nodo dice qué ejecutor de disco eligió, y si dice hilos de E/S ya tienes la causa; si dice io_uring, comprueba el modelo del disco de la máquina.

Solución

Actualiza el kernel a una versión con io_uring y usa discos NVMe. Vuelve a arrancar el nodo para que elija el ejecutor de io_uring.

Cómo evitarlo

Prepara todas las máquinas del clúster igual, siguiendo Requisitos de hardware y sistema antes de instalar el binario.

Ver también