Mejora en rendimiento 1.8.x

Mejora en rendimiento 1.8.x

de Juan Segarra Montesinos -
Número de respuestas: 5
Hola a tod@s.

Últimamente estábamos experimentando una degradación notable de rendimiento en algunas partes concretas (visualización de perfiles y consultas). Actualmente estamos con la versión 1.8.4. Usamos mysql como backend.

Con el slow query log activado, comprobamos que el cuello de botella se encontraba en la query que lanza la función load_user_capabilities() y en particular la parte que determina las anulaciones de rol.

Hemos forzado a que la tabla mdl_role_assignments utilice el índice userid (use index (userid)) y la mejora en el redimiento ha sido BRUTAL.

Si a alguien le interesa hacer la prueba e iniciar el debate, debajo os indico lo que hemos hecho wink

Y nada, un saludo a tod@s sonrisa

Juan.


[...]
HAVING
SUM(rc.permission) != 0

UNION ALL

SELECT rc.capability, c1.id as id1, c2.id as id2, (c1.contextlevel * 100 + c2.contextlevel) AS aggrlevel,
SUM(rc.permission) AS sum
FROM
{$CFG->prefix}role_assignments ra use index(userid) LEFT JOIN
{$CFG->prefix}role_capabilities rc on ra.roleid = rc.roleid LEFT JOIN
{$CFG->prefix}context c1 on ra.contextid = c1.id LEFT JOIN
{$CFG->prefix}context c2 on rc.contextid = c2.id LEFT JOIN
{$CFG->prefix}context_rel cr on cr.c1 = c2.id
WHERE
ra.userid=$userid AND
$searchcontexts1
rc.contextid != $siteinstance->id
$capsearch
AND cr.c2 = c1.id
GROUP BY
rc.capability, c1.id, c2.id, c1.contextlevel * 100 + c2.contextlevel
HAVING
SUM(rc.permission) != 0
ORDER BY
aggrlevel ASC";
[...]
Promedio de valoraciones: -
En respuesta a Juan Segarra Montesinos

Re: Mejora en rendimiento 1.8.x

de ignacio torio -

Hola Juan:

¿Podrias explicarme un poco mas que archivos son los que habeis modificado para hacer pruebas?

Gracias

En respuesta a ignacio torio

Re: Mejora en rendimiento 1.8.x

de Juan Segarra Montesinos -
Juan e Ignacio,

El fichero en cuestión es lib/accesslib.php. Buscad la función load_user_capability(). Añadid lo que está señalado en negrita en el post anterior.

La mejora en nuestro caso ha sido muchísima. Quería compartirlo con vosotr@s para intentar intercambiar impresiones. Tal vez estábamos haciendo algo mal por nuestra parte. Sin embargo, ahora nuestra instalación vuela.

Si alguien pasa algún EXPLAIN concreto de esa select antes y después sería también un puntazo sonrisa

Venga un saludo,

Juan.

En respuesta a Juan Segarra Montesinos

Re: Mejora en rendimiento 1.8.x

de Martín Langhoff -
Detalle interesante (y lamentablemente especifico para mysql).

Lo unico que puedo recomendar es un upgrade a 1.9 -- donde he reimplementado gran parte de la logica de accesslib de manera eficiente.