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