...
Quelles optimisations serveur sont possibles ?
Octobre 2021Mars 2024, le le esup-sgc de l'Université de Rouen Normandie gère 100.000 cartes pour plus de 5080.000 utilisateurs (étudiants de l'année n et , n-1, ... personnels, invités ...).
L'ensemble des briques serveur esup-sgc (esup-sgc, esup-nfc-tag, apache en frontal et base de données Postgresql) tourne sur une seule VM qui dispose de 2 4 CPUS et 8 12 GB de RAM.
La base de données prend un peu moins de 40GB 56GB sur disque.
Le serveur est une debian bookworm avec openjdk 17, postgresql 15 et apache 2.4 de cette distribution.
Le service est stable et peu gourmand ; complexifier l'architecture en installant des mécansimes mécanismes logiciels de failover ou load-balancing n'est pas conseillé.
1 2 GB de RAM alloué au tomcat d'esup-sgc (-Xms1024M -Xmx1024MXmx2048M) est suffisant.
L'AJP est utilisé entre le tomcat et le apache avec un proxypass ainsi fait :
ProxyPass / ajp://localhost:8009/ ttl=10 timeout=3600 retry=1
...
Les synchronisations des utilisateurs s'opèrent grâce à de très nombreuses requêtes ldap/sql sur les LDAP et bases de données SQL du SI.
Ces requêtes sont issues des configurations données dans applicationContext-services.xml.
Aussi les ldap et bases de données doivent présenter des index permettant de répondre au mieux à ces requêtes (l'eppn est généralement utilisé comme clef).
La récupération et le calcul des UserInfoServices d'un utilisateur depuis le SI prend environ 3ms : ce temps de calcul est consultable dans l'IHM via le menu Admin < UserInfos.
Concernant le calcul des groupes et rôles, l'IHM via le menu Admin < GroupsRoles donne 122ms pour la récupération des groupes d'un user ou encore 326ms pour lé décompte des membres des différents groupes.
La synchronisation totale régulière des 80.000 utilisateurs (cf ResynchronisationService en level info dans les logs) se fait en 33min, avec seuls 300 environs notés comme ayant "du" être mis à jour.
La synchronsisation totale régulière des groupes en base (LdapGroup2UserRoleService en level debug dans les logs) prend 0.5sec.
Accélération temporaire pour optimiser des procédures de modifications en masse.
Les modifications en base de données esup-sgc des données sur les cartes et les utilisateurs sont sujet à une indexation plein texte continue qui sont consommateurs de ressources.
Sur un usage courant et quotidien d'esup-sgc, même avec des centaines de milliers de cartes et utilisateurs, cette (ré)indexation à chaque modification d'une entrée de carte et/ou utilisateur n'est pas pénalisante, mais elle peut le devenir si vous intervenez en masse sur l'ensemble de la base de données.
Ainsi par exemple, la procédure d'upgrade de la base de données esup-sgc lors de montée de version majeure intègre de facto la désactivation des triggers permettant l'indexation plein texte continue des cartes/utilisateurs, la réindexation totale plein texte et la réactivation des triggers.
Si vous devez intervenir sur la base de données en masse et que vous avez des dizaines de milliers d'entrées de cartes et utilisateurs, nous vous conseillons d'en faire de même ainsi.
Dans psql pour désactiver les triggers :
| Bloc de code | ||||
|---|---|---|---|---|
| ||||
esupsgc=# alter table user_account disable trigger tsvectorupdateuser;
esupsgc=# alter table card disable trigger tsvectorupdate; |
Vous pouvez alors effectuer vos modifications.
Ensuite, vous pouvez réindexer l'ensemble et réactiver les triggers, dans psql toujours :
| Bloc de code | ||||
|---|---|---|---|---|
| ||||
esupsgc=# UPDATE card SET textsearchable_index_col = setweight(to_tsvector('simple', coalesce(card.eppn,'')), 'B')
|| setweight(to_tsvector('simple', replace(coalesce(user_account.name,''),'-',' ')), 'A')
|| setweight(to_tsvector('simple', replace(coalesce(user_account.firstname,''),'-',' ')), 'B')
|| setweight(to_tsvector('simple', coalesce(user_account.email,'')), 'B')
|| setweight(to_tsvector('simple', replace(coalesce(user_account.supann_emp_id,''),'-',' ')), 'B')
|| setweight(to_tsvector('simple', replace(coalesce(user_account.supann_etu_id,''),'-',' ')), 'B')
|| setweight(to_tsvector('simple', replace(coalesce(user_account.supann_entite_affectation_principale,''),'-',' ')), 'C')
|| setweight(to_tsvector('simple', replace(coalesce(card.csn,''),'-',' ')), 'C')
|| setweight(to_tsvector('simple', replace(coalesce(card.full_text,''),'-',' ')), 'D')
|| setweight(to_tsvector('simple', replace(coalesce(user_account.full_text,''),'-',' ')), 'D')
FROM user_account where card.eppn=user_account.eppn;
esupsgc=# alter table user_account enable trigger tsvectorupdateuser;
esupsgc=# alter table card disable enable tsvectorupdate; |
ESUP-NFC-TAG
Je n'ai pas de groupes dans ldap, est-ce que je peux plutôt utiliser des filtres pour affecter les rôles dans l'application ESUP-NFC-TAG ?
...