Ú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";
[...]