Dans une architecture à accès mémoire non uniforme (NUMA), notamment sur les instances ARM, les processus accèdent parfois à des segments de code stockés sur un nœud NUMA distant plutôt que sur leur nœud local. Cet accès inter-nœuds accroît la latence et la consommation de bande passante mémoire. La fonctionnalité Code duptext élimine cette surcharge en copiant les segments de code distants vers le nœud local, ce qui permet aux processus de lire directement depuis la mémoire locale.
Fonctionnement
Lorsque le noyau détecte qu'un processus d'un nœud NUMA accède à des segments de code situés sur un autre nœud, il en crée une copie locale avec une granularité à la page (chaque page fait 4 Ko) :
Un processus du nœud 1 accède à
libc.sostocké sur le nœud 0, ou un processus du nœud 0 accède àteststocké sur le nœud 1.Le noyau copie le segment de code distant sur le nœud local : une copie de
libc.sosur le nœud 1 et une copie detestsur le nœud 0.Chaque processus lit sa copie locale, supprimant ainsi les accès inter-nœuds.
La page originale contenant le segment de code est appelée page principale. La copie locale créée par la fonctionnalité duptext est appelée sous-page.
Le système d'exploitation peut allouer de la mémoire sur plusieurs nœuds NUMA pour soulager la pression mémoire ou répondre aux exigences d'équilibrage de charge, provoquant ainsi des accès au code inter-nœuds. L'activation de la fonctionnalité Code duptext constitue la solution d'atténuation recommandée.
Limites
La fonctionnalité Code duptext requiert les deux conditions suivantes :
Type d'instance : familles ECS Bare Metal Instance. Pour plus d'informations, consultez Vue d'ensemble.
Image : Alibaba Cloud Linux 3 avec une version de noyau
5.10.112-11ou ultérieure.
Pour vérifier la version du noyau de votre instance, exécutez la commande suivante :
uname -r
Commutateurs
Cette fonctionnalité comporte deux commutateurs : global et par memcg. Les deux doivent être activés pour que le noyau crée des sous-pages pour un processus donné.
| Commutateur | Description | Valeur par défaut |
|---|---|---|
/sys/kernel/mm/duptext/enabled |
Commutateur global. Définissez-le à 1 pour activer la fonctionnalité sur l'ensemble du système ; définissez-le à 0 pour la désactiver. |
0 |
/sys/fs/cgroup/memory/<memcg-dir>/memory.allow_duptext |
Commutateur par memcg. Définissez-le à 1 pour activer la fonctionnalité pour tous les processus de ce memcg ; définissez-le à 0 pour la désactiver. |
0 |
Lorsque le commutateur global est défini à 0 , le noyau efface automatiquement toutes les sous-pages de l'instance.
Surveillance des sous-pages
Consultez les fichiers suivants pour vérifier l'activité de duptext :
| Fichier ou champ | Informations affichées |
|---|---|
nr_duptext dans /proc/vmstat |
Nombre de sous-pages actuellement marquées comme duptext dans le noyau. Une valeur supérieure à zéro confirme que la fonctionnalité crée activement des sous-pages. Si la valeur reste à zéro après l'activation, aucun accès au code inter-nœuds n'a été détecté. |
DupText dans /proc/meminfo |
Mémoire totale utilisée par les sous-pages duptext, en Ko. |
/proc/<pid>/smaps |
Statistiques des sous-pages par processus. Le champ DupText dans la sortie indique si une sous-page a été créée sur le nœud local pour ce processus. |
Activation de la fonctionnalité Code duptext
Cet exemple compile et exécute un programme de test sur une instance NUMA à deux nœuds.
Prérequis
Avant de commencer, assurez-vous de disposer des éléments suivants :
Une instance ECS Bare Metal Instance exécutant Alibaba Cloud Linux 3 (
5.10.112-11ou ultérieur)Un accès root ou sudo
Étapes
Connectez-vous à l'instance ECS. Pour obtenir des instructions, consultez Utiliser Workbench pour se connecter à une instance Linux via SSH.
-
(Facultatif) Consultez la topologie NUMA de l'instance :
Si
numactln'est pas installé, exécutez d'abordsudo yum install numactl.numactl -HLa sortie répertorie tous les nœuds NUMA. L'exemple suivant montre une instance à deux nœuds comprenant le nœud 0 et le nœud 1.

-
Compilez le programme de test sur le nœud 1 afin que celui-ci conserve le cache de pages du binaire
test:numactl -N 1 -m 1 gcc test.c -o test -
Activez le commutateur global :
sudo sh -c 'echo 1 > /sys/kernel/mm/duptext/enabled' -
Créez un répertoire memcg et activez-y la fonctionnalité duptext :
sudo mkdir /sys/fs/cgroup/memory/test sudo sh -c 'echo 1 > /sys/fs/cgroup/memory/test/memory.allow_duptext' -
Exécutez le binaire
testsous le memcg, en le liant au nœud 0. Le noyau détecte alors l'accès inter-nœuds et crée une copie sous-page du segment de codetestsur le nœud 0 :Si
cgexecn'est pas installé, exécutez d'abordsudo yum install -y libcgroup-tools.sudo cgexec -g "memory:test" numactl -N 0 -m 0 ./test -
Vérifiez qu'une sous-page a bien été créée pour le processus
test:sudo cat /proc/$(pidof test)/smapsLe champ
DupTextdans la sortie confirme la création d'une copie sous-page sur le nœud 0.
Pour consulter les statistiques duptext au niveau de l'instance, exécutez les commandes suivantes :
cat /proc/vmstat | grep -i duptext cat /proc/meminfo | grep -i duptextSi
nr_duptextest supérieur à zéro, la fonctionnalité crée activement des sous-pages.
Désactivation de la fonctionnalité Code duptext
Désactivez la fonctionnalité Code duptext selon vos besoins métier. Lors de la désactivation, le noyau efface automatiquement toutes les sous-pages de l'instance.
Connectez-vous à l'instance ECS. Pour obtenir des instructions, consultez Utiliser Workbench pour se connecter à une instance Linux via SSH.
-
Désactivez le commutateur global :
sudo sh -c 'echo 0 > /sys/kernel/mm/duptext/enabled' -
Vérifiez que toutes les sous-pages ont bien été effacées :
cat /proc/vmstat | grep -i duptext cat /proc/meminfo | grep -i duptextLes deux valeurs doivent être égales à
0, confirmant ainsi que la fonctionnalité est désactivée et que toutes les sous-pages ont été libérées.