Aller au contenu
En développement Phare

Memtide

Tiering mémoire CXL

Orchestrateur userspace de tiering mémoire CXL sous Linux : score la « chaleur » des pages et les migre sous garde-fous (kill-switch, circuit breaker).

eBPF heat scoring
≥ 6.1 kernel · cgroup v2
v0.1 pipeline complet
page chaude page froide ↕ migration des pages selon le score de chaleur NŒUD A 64 Go DRAM · ~90 ns NŒUD B 64 Go DRAM · ~90 ns NŒUD C 64 Go DRAM · ~90 ns POOL MÉMOIRE CXL · PARTAGÉ 1 To ~240 ns
Tiering mémoire : chaque nœud garde ses pages « chaudes » en DRAM locale (rapide, ~90 ns), et les pages « froides » descendent dans le pool CXL partagé (large mais ~2,7× plus lent). Memtide score la chaleur (PSI, MGLRU, eBPF) et migre les pages via move_pages(2). Chiffres illustratifs.

Le problème

La mémoire CXL étend la capacité d’un serveur au-delà de ses barrettes DRAM, mais son accès est sensiblement plus lent. On gagne donc en capacité ce que l’on risque de perdre en performance : une page « chaude », souvent accédée, laissée sur le palier CXL pénalise tout le système ; une page « froide » qui occupe de la DRAM gaspille la ressource rapide. Le placement des pages entre les deux paliers décide à lui seul du bénéfice réel du CXL.

Le noyau Linux sait migrer des pages, mais il ne choisit pas seul lesquelles déplacer ni quand, au regard d’un objectif applicatif. Memtide comble ce vide : un orchestrateur qui observe, score et déplace les pages depuis l’espace utilisateur.

Mesurer la chaleur

Tout repose sur la qualité du signal : mal estimer la chaleur d’une page, c’est migrer à contretemps et dégrader ce que l’on cherchait à améliorer. Plutôt qu’une source unique, Memtide en croise plusieurs :

  • PSI (pressure stall information), qui révèle quand le système attend réellement la mémoire ;
  • MGLRU, dont les générations donnent une approximation peu coûteuse de l’ancienneté des pages ;
  • les défauts de page instrumentés en eBPF, pour observer les accès sans modifier les applications ni payer un traçage lourd ;
  • des signaux TLB comme indice de localité.

Croiser ces sources donne un score plus stable qu’aucune ne le permet seule, et assez léger pour tourner en continu.

Décider et migrer

Le pipeline va du signal à l’action : collecte, scoring, migration. Une page jugée chaude ou froide est déplacée via move_pages(2) pour un placement explicite, ou poussée vers le palier lent par memory.reclaim. L’ensemble s’appuie sur cgroup v2 et un noyau ≥ 6.1, ce qui permet de cibler des charges précises sans toucher au reste de l’hôte.

Ne jamais dégrader l’hôte

Un orchestrateur mémoire qui se trompe peut faire plus de mal que de bien. C’est la contrainte qui a le plus pesé sur la conception : Memtide doit pouvoir échouer proprement. Deux garde-fous l’encadrent. Un kill-switch rend la main au noyau instantanément, en rétablissant le comportement par défaut. Un circuit breaker suspend les migrations dès que les indicateurs se dégradent (trop de déplacements, une pression qui monte au lieu de baisser) plutôt que de s’entêter. Dans le pire cas, le système se comporte comme si Memtide n’était pas là.

Pourquoi en espace utilisateur

J’ai délibérément placé la logique en userspace plutôt qu’en module noyau. La décision (quels signaux croiser, quelle politique de scoring, quels seuils retenir) est la partie qui évolue le plus vite ; l’itérer hors du noyau réduit la surface de risque, simplifie le débogage et permet de changer de politique sans recompiler un kernel. Le noyau fournit les primitives (migration, reclaim, signaux) ; Memtide porte la politique.

Validation et état

Tester du tiering CXL sans matériel CXL n’a rien d’évident. J’ai monté un banc dédié sous QEMU/KVM, avec un noyau instrumenté (DAMON) qui reproduit les paliers et expose les migrations à la mesure (voir Banc d’essai CXL/DAMON).

État : MVP v0.1. La chaîne décision → exécution fonctionne de bout en bout, garde-fous compris. Projet personnel, code privé, ouverture possible sur demande.