Politique LRU/MRU Architecture v200

, par Bertrand Degoy

Dans l’architecture Pyro5, les index ( et certains modèles ) sont chargés depuis le disque puis conservés en RAM pour être accessibles rapidement par les services distants. Le daemon joue le rôle de processus maître.

Pour les index par exemple, il les expose via IndexServer, et sert de point d’accès unique pour tous les RemoteIndexService.

Comme ces index peuvent être volumineux et que le daemon est conçu pour rester actif longtemps, il doit gérer sa mémoire de manière autonome et efficace. C’est précisément pour cela qu’une politique LRU/MRU est indispensable : elle permet de conserver en RAM les index les plus récemment utilisés (MRU), tout en évinçant automatiquement ceux qui ne sont plus sollicités (LRU).

Cette stratégie garantit que le flowchart Pyro5 fonctionne de manière fluide, sans surcharge mémoire, et que les services distants accèdent toujours aux index pertinents sans rechargement inutile depuis le disque.


Politique LRU/MRU

La politique LRU/MRU (Least Recently Used / Most Recently Used) est un mécanisme de gestion de la mémoire qui permet de décider quel objet doit être évincé lorsque la RAM atteint sa capacité maximale. Elle repose sur un principe simple :

  • MRU = objets récemment utilisés → à conserver
  • LRU = objets peu utilisés récemment → candidats à l’éviction

Dans notre système, cette politique est appliquée par le MemoryManager, qui maintient un ordre strict des objets en RAM grâce à un OrderedDict.


MRU — Most Recently Used

Un objet devient MRU lorsqu’il est :

  • chargé en RAM,
  • accédé via get(),
  • marqué via touch().

Le MemoryManager déplace alors la clé à la fin de l’OrderedDict :

[ LRU ... → ... MRU ]

Cela signifie :

  • cet index est actif,
  • il doit être conservé en priorité,
  • il ne doit pas être évincé tant que d’autres objets moins utilisés existent.

LRU — Least Recently Used

L’objet LRU est celui qui :

  • n’a pas été utilisé depuis le plus longtemps,
  • n’a pas été touché récemment,
  • se trouve au début de l’OrderedDict.

Lorsqu’une éviction est nécessaire (ex : len(store) > max_items), le MemoryManager fait :

key, _ = self._store.popitem(last=False)

Ce qui retire le premier élément, donc le LRU.

Pourquoi LRU/MRU est idéal dans ton architecture

1. Les index sont lourds

Ils peuvent peser plusieurs centaines de Mo.
Il est donc crucial d’éviter de recharger inutilement depuis le disque.

2. Les RemoteIndexService sont stateless

Ils ne conservent rien : tout repose sur la RAM du daemon.
LRU/MRU garantit que les index réellement utilisés restent disponibles.

3. Le daemon est long-lived

Il doit s’auto-réguler sans intervention humaine.
LRU/MRU fournit une politique simple, déterministe et efficace.

4. Les thèmes ont des patterns d’accès naturels

Certains thèmes sont consultés souvent (MRU), d’autres rarement (LRU).
La politique s’adapte automatiquement à ces usages.

Résultat : une mémoire auto-optimisée

Grâce à LRU/MRU :

  • Les index actifs restent en RAM → latence minimale
  • Les index inactifs sont évincés → RAM maîtrisée
  • Le daemon ne recharge que si nécessaire → I/O minimisées
  • Le système reste stable même sous forte charge → robustesse