Tâche de synchronisation des inscriptions par méta-cours très longue

Tâche de synchronisation des inscriptions par méta-cours très longue

par Séverin Terrier,
Nombre de réponses : 11
Avatar Documentation writers Avatar Moodleurs particulièrement utiles Avatar Testeurs Avatar Traducteurs

Bonjour,

J'utilise Moodle 3.7.5 sur ma plateforme principale. Serveur CentOS 7, avec PHP 7.1.33 et MariaDB 5.5.64.

Depuis deux semaines, la tâche de synchronisation des inscriptions par méta-cours (enrol_meta\task\enrol_meta_sync) met très longtemps à s'exécuter : on est passé de 240s (4 minutes) le 16 au matin à 1000s l'après-midi, puis 1800s le 18 mars, 4000s le 22, et 5800s (presque 1h40) aujourd'hui...

Avez-vous constaté des problèmes de ce style sur vos plateformes ? Avez-vous une idée de ce qui pourrait expliquer cela ?

En cherchant un peu, j'ai trouvé MDL-52925, mais je ne sais pas si c'est réellement adapté. Et ce qui m'étonne, c'est surtout cette soudaine augmentation de durée d'exécution...

Pour donner quelques ordres de grandeur :

SELECT COUNT(1) FROM mdl_user_enrolments;
296354
SELECT COUNT(1) FROM mdl_user_enrolments WHERE enrolid IN (SELECT id FROM mdl_enrol WHERE enrol='meta');
64838

SELECT COUNT(1) FROM mdl_user_enrolments WHERE enrolid IN (SELECT id FROM mdl_enrol WHERE enrol='meta')
AND timecreated > UNIX_TIMESTAMP ('2020-03-16');
5311

Merci d'avance,
Séverin


Moyenne des évaluations  -
En réponse à Séverin Terrier

Re: Tâche de synchronisation des inscriptions par méta-cours très longue

par Séverin Terrier,
Avatar Documentation writers Avatar Moodleurs particulièrement utiles Avatar Testeurs Avatar Traducteurs

Bonjour,

Je reviens vers vous par rapport à cette demande. Depuis, la durée d'exécution de la tâche enrol_meta\task\enrol_meta_sync est passée régulièrement à 6900s, voire 7300s parfois, soit plus de deux heures triste

Les valeurs des requêtes précédentes restent sensiblement les mêmes.

J'ai essayé de regarder dans le fichier /enrol/meta/locallib.php, la fonction enrol_meta_sync, mais je dois avouer que je ne comprend pas tout très bien, pour me permettre de comprendre pourquoi le temps d'exécution est aussi long...

Si quelqu'un a une (bonne) idée/explication/piste/solution, je suis preneur.

Séverin

En réponse à Séverin Terrier

Re: Tâche de synchronisation des inscriptions par méta-cours très longue

par Mylène POTIER,
Bonjour Séverin
Nous avons eu le même souci en septembre 2019 avec une version V3.6 et des durées bien plus longues que celles que tu annonces. Je suppose qu'en ce moment tu as un regain d'activité et d'inscription avec le confinement qui explique cette inflation.
Pour info :
SELECT COUNT(1) FROM mdl_user_enrolments;
379767
SELECT COUNT(1) FROM mdl_user_enrolments WHERE enrolid IN (SELECT id FROM mdl_enrol WHERE enrol='meta');
366961
SELECT COUNT(1) FROM mdl_user_enrolments WHERE enrolid IN (SELECT id FROM mdl_enrol WHERE enrol='meta')
AND timecreated > UNIX_TIMESTAMP ('2020-03-18');
2355
09/09 187 545
16/09 121 539
29/09 86 950
Nous devons traiter le sujet pour la prochaine rentrée et nous sommes donc vivement intéressées par ce qui pourrait sortir de ce fil de discussion.
Bonne soirée
Mylène
En réponse à Mylène POTIER

Re: Tâche de synchronisation des inscriptions par méta-cours très longue

par Séverin Terrier,
Avatar Documentation writers Avatar Moodleurs particulièrement utiles Avatar Testeurs Avatar Traducteurs
Bonjour Mylène,

Je ne sais pas si ça doit me rassurer (ou pas) de savoir que je ne suis pas seul (mais que vous n'avez pas trouvé d'explication/solution).

Te rappelles-tu de la durée d'exécution de cette tâche chez vous ?

Par ailleurs, j'ai ouvert une discussion en anglais à ce propos.

Séverin
En réponse à Séverin Terrier

Re: Tâche de synchronisation des inscriptions par méta-cours très longue

par Séverin Terrier,
Avatar Documentation writers Avatar Moodleurs particulièrement utiles Avatar Testeurs Avatar Traducteurs

Bonjour,

Je reviens sur le sujet. En effet, on est actuellement autour de 9 000s d'exécution pour cette tâche.

Et j'avais espoir que la suppression d'inscriptions méta-cours en cascades arrangerait les choses, mais ce n'est apparemment pas le cas.

J'ai également essayé de désactiver la tâche "Synchronisation des méta-inscriptions" (\enrol_meta\task\enrol_meta_sync), et de lancer en ligne de commande l'outil /enrol/meta/cli/sync.php -v (avec appel via PHP, durée d'exécution allongée et résultat consigné dans un fichier) :

/usr/bin/php -d log_errors=1 -d error_reporting=E_ALL -d display_errors=0 -d html_errors=0 -d memory_limit=1024M \
/chemin/vers/moodle/enrol/meta/cli/sync.php -v >> /chemin/vers/log/enrol_meta_sync.txt

Ça a tourné pendant environ 2h30, a terminé sans message d'erreur. Au final, tout un ensemble de lignes de la forme :

enrolling: 87471 ==> 11100
skipping enrolling: 88328 ==> 11047 (user without role)

Ces lignes semblent être par ordre croisant des numéros d'utilisateurs (puis des cours).

Puis les désinscriptions, de la forme (je n'ai pas vraiment bien compris l'ordre) :

unenrolling: 12375 ==> 1159 (user without role)

Mais à part constater ce qui est fait, je ne suis pas encore très avancé...

Peut-être devrais-je le lancer plusieurs fois manuellement, avec enregistrement des résultats, afin de comparer les sorties ?

Ou bien aller éplucher les journaux pour voir si je retrouve des événements correspondants ?

Mais le principe, c'est qu'il aille récupérer toutes les inscriptions non méta-cours des cours liés afin de créer des inscriptions à partir de là. Du coup, quand on utilise ça sur des cours avec des centaines (voire milliers) d'utilisateurs inscrits, ça semble poser problème...

Séverin

En réponse à Séverin Terrier

Re: Tâche de synchronisation des inscriptions par méta-cours très longue

par Patrick Lemaire,
Avatar Développeurs de plugins Avatar Documentation writers Avatar Moodleurs particulièrement utiles Avatar Testeurs Avatar Traducteurs

Bonjour Séverin, 

Lancer la tâche 2 fois de suite devrait, si tout est logique, être moins long et notamment la phase de désinscription ? 

En ce qui concerne la logique de l'ordre pour les désinscriptions, il se pourrait que ce soit depuis la table 'role_assignments' avec les éléments dont le component est 'enrol_meta' et par ID croissant ?
Entre les tables 'user_enrolments' et 'role_assignments', je me demande bien les relations qu'elles peuvent avoir ?!

À bientôt,
Patrick

En réponse à Séverin Terrier

Re: Tâche de synchronisation des inscriptions par méta-cours très longue

par Ludovic ORNON,
Bonjour,
Je commence à m'intéresser au meta link pour une application d'enregistrement d'utilisateurs dans plusieurs cours.
Je pense qu'il est très (trop) facile de faire des boucles de meta-link par mégarde.
Ensuite le "user without role" me fait penser aux paramètres de synchronisation car il est possible de ne pas synchroniser tous les utilisateurs (première partie du screenshot) et le paramètre sur l'enlèvement des rôles (cadre orange).
Edit - piste sérieuse : c'est surtout la deuxième option à étudier ("enrol_meta | syncall") pour éviter de synchro tous les utilisateurs et ensuite les enlever parce que pas de rôle...

Un mapping des meta links, si ce n'est déjà fait pour voir si pas de boucle,
et enlever la possibilité d'en créer aux enseignants pour éviter des soucis futurs...
En espérant que cela te pointe dans la bonne direction.
Ludovic

PS: En regardant mon screenshot 
- 1 j'ai repéré que je ne devais pas répliquer mon nouveau rôle teacher clin d’œil
- 2 en le faisant, l'option "enrol_meta | syncall" m'a un peu plus interrogé. Peut-être la mettre à non ?
Annexe Screenshot 2020-04-27 at 17.37.52.png
En réponse à Ludovic ORNON

Re: Tâche de synchronisation des inscriptions par méta-cours très longue

par Séverin Terrier,
Avatar Documentation writers Avatar Moodleurs particulièrement utiles Avatar Testeurs Avatar Traducteurs
Bonjour Ludovic,

Merci de t’intéresser à mon souci.

J'avais effectivement oublié de préciser clairement mes réglages liés aux inscriptions par méta-cours :

  • j'ai défini plusieurs rôles à ignorer (nosyncroleids)
  • j'ai désactivé le fait de synchroniser tous les utilisateurs (syncall)
  • concernant l'action de désinscription externe (unenrolaction), j'ai choisi "Désinscrire du cours l'utilisateur"
Ces différentes options sont configurées ainsi depuis de nombreux mois (voire années).
Le but est au final de ne synchroniser que le rôle étudiant.

Donc, soit j'ai encore des inscriptions par méta-cours en cascade, soit c'est juste parce qu'on utilise ça sur des cours avec mille étudiants, soit il y a un bogue quelque part ; soit c'est un cumul de ces possibilités...

Séverin
En réponse à Séverin Terrier

Re: Tâche de synchronisation des inscriptions par méta-cours très longue

par Ludovic ORNON,
Bonjour Séverin,

J'imagine que l'administration de tel système demande une grande rigueur et des procédures éprouvées.
Je vois que le post anglais ne fait pas fureur triste.

Bon courage à toi et à Mylène,
Ludovic
En réponse à Séverin Terrier

Re: Tâche de synchronisation des inscriptions par méta-cours très longue

par Séverin Terrier,
Avatar Documentation writers Avatar Moodleurs particulièrement utiles Avatar Testeurs Avatar Traducteurs

Bonjour,

La durée d'exécution de la tâche "Synchronisation des méta-inscriptions" (\enrol_meta\task\enrol_meta_sync) a continué à augmenter : 240s (4 minutes) le 16 mars au matin, 1000s le soir, 1800s le 18 mars, 4000s le 22 mars, 5800s le 31 mars, 7200s le 10 avril et 11000s aujourd'hui...

SELECT COUNT(id) FROM mdl_enrol WHERE enrol='meta';
593 méthodes d'inscription par méta-cours existant aujourd'hui.

SELECT COUNT(id) FROM mdl_enrol WHERE enrol='meta' AND timecreated > UNIX_TIMESTAMP ('2020-03-16');
SELECT COUNT(id) FROM mdl_enrol WHERE enrol='meta' AND timecreated > UNIX_TIMESTAMP ('2020-05-01');
106 méthodes d'inscription par méta-cours créées depuis le 16 mars, et 25 créées depuis le 1er mai, ce qui explique certainement l'augmentation de cette durée d’exécution.

Nous avons des cours avec des populations d'étudiants importantes (> 1 000), ce qui explique certainement le problème.

Si je ne trouve pas de (meilleure) solution, j'envisage de ne lancer cette tâche que pendant la nuit, afin d'éviter de surcharger le serveur toute la journée. Hormis le fait que les inscriptions par méta-cours ne seraient actives que le lendemain, y aurait-il un autre risque ?

Si quelqu'un a d'autres idées de choses à vérifier/surveiller, d'éléments à modifier/tester, je suis preneur.

Séverin

En réponse à Séverin Terrier

Re: Tâche de synchronisation des inscriptions par méta-cours très longue

par Ludovic ORNON,
Bonjour Séverin,
Comment sont créées les méthodes d'inscriptions par méta-links ? A la main ou utilises-tu un fichier plat ?
Y a t-il inflation du temps d'exécution même sans nouveau mouvement (meta link et édudiants) ?
Le chiffres que tu donnes ne semble pas faire une progression linéaire et me font penser à quelque chose qui boucle et/ou n'est pas intègre (comme un memory leak).
Il me semble que tu avais dit que les comptes étudiants sont authentifiés depuis un autre système. Y a t-il beaucoup de mouvements sur cette base ?
Je ne connais pas ton environnement mais 106 nouveaux meta-links sur 593 au total, c'est une inflation de presque 20%. Cela me parait beaucoup. Je chercherais si pas de méta-cours qui se reboucleraient quelque part.

Ludovic
En réponse à Ludovic ORNON

Re: Tâche de synchronisation des inscriptions par méta-cours très longue

par Séverin Terrier,
Avatar Documentation writers Avatar Moodleurs particulièrement utiles Avatar Testeurs Avatar Traducteurs

Bonjour Ludovic,

Les inscriptions par méta-cours sont réalisées manuellement.
L'authentification se fait à partir de CAS, et un grand nombre d'inscriptions automatiques (plus de 215 000) sont réalisées à partir d'une base de données.

J'ai l'impression que la durée d'exécution augmente avec l'augmentation du nombre de méthodes d'inscriptions méta-cours (avec grosses populations d'étudiants).

En effet, si je regarde le nombre de méthodes d'inscriptions par méta-cours créées par mois :

SELECT FROM_UNIXTIME(timecreated,'%Y') AS Année
     , FROM_UNIXTIME(timecreated,'%m') AS Mois
     , COUNT(1)                        AS Nombre
FROM mdl_enrol
WHERE enrol='meta'
  AND timecreated BETWEEN UNIX_TIMESTAMP ('2019-09-01') AND UNIX_TIMESTAMP ('2020-06-01')
GROUP BY FROM_UNIXTIME(timecreated,'%Y'), FROM_UNIXTIME(timecreated,'%m')
ORDER BY FROM_UNIXTIME(timecreated,'%Y'), FROM_UNIXTIME(timecreated,'%m');

+--------+------+--------+
| Année  | Mois | Nombre |
+--------+------+--------+
| 2019   | 09   |     45 |
| 2019   | 10   |      9 |
| 2019   | 11   |     13 |
| 2019   | 12   |      7 |
| 2020   | 01   |     26 |
| 2020   | 02   |      2 |
| 2020   | 03   |     69 |
| 2020   | 04   |     14 |
| 2020   | 05   |     25 |
+--------+------+--------+

On remarque effectivement une forte augmentation de ce nombre depuis le mois de mars, avec la création de pas mal d'éléments, en lien avec la gestion de la crise liée au Coronavirus.


Et le nombre d'inscriptions par méta-cours créées par mois :
SELECT FROM_UNIXTIME(timecreated,'%Y') AS Année
     , FROM_UNIXTIME(timecreated,'%m') AS Mois
     , COUNT(1)                        AS Nombre
FROM mdl_user_enrolments
WHERE enrolid IN (SELECT id FROM mdl_enrol WHERE enrol='meta')
  AND timecreated BETWEEN UNIX_TIMESTAMP ('2019-09-01') AND UNIX_TIMESTAMP ('2020-06-01')
GROUP BY FROM_UNIXTIME(timecreated,'%Y'), FROM_UNIXTIME(timecreated,'%m')
ORDER BY FROM_UNIXTIME(timecreated,'%Y'), FROM_UNIXTIME(timecreated,'%m');

+--------+------+--------+
| Année  | Mois | Nombre |
+--------+------+--------+
| 2019   | 09   |  15935 |
| 2019   | 10   |   1889 |
| 2019   | 11   |   1864 |
| 2019   | 12   |    551 |
| 2020   | 01   |   3948 |
| 2020   | 02   |    492 |
| 2020   | 03   |   3397 |
| 2020   | 04   |    978 |
| 2020   | 05   |   5824 |
+--------+------+--------+

Lui n'est pas excessif, mais c'est le nombre global de cours, utilisateurs et inscriptions à gérer (vérifier/créer/supprimer) qui doit poser problème.

On a fait du nettoyage dans les inscriptions par méta-cours en cascade ; ça ne devrait donc pas être la source du problème.

Séverin

Moyenne des évaluations Utile (1)