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.