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
Y nada, un saludo a tod@s
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";
[...]
Juan:
Me gustaría saber cuál es el programa que hay que modificar.
Juan
Me gustaría saber cuál es el programa que hay que modificar.
Juan
Hola Juan:
¿Podrias explicarme un poco mas que archivos son los que habeis modificado para hacer pruebas?
Gracias
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
Venga un saludo,
Juan.
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
Venga un saludo,
Juan.
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.
Lo unico que puedo recomendar es un upgrade a 1.9 -- donde he reimplementado gran parte de la logica de accesslib de manera eficiente.
Por aquí tenemos muchas ganas de probar esa nueva versión Será nuestro siguiente paso
Un saludo Martín,
Juan.
Un saludo Martín,
Juan.