7.5. Grandes pages
Comprendre et configurer les grandes pages.
7.5.1. Ce que font les grandes pages
La mémoire est gérée par blocs appelés pages. Sur la plupart des systèmes, une page correspond à 4Ki. 1Mi de mémoire équivaut à 256 pages ; 1Gi de mémoire équivaut à 256 000 pages, et ainsi de suite. Les unités centrales de traitement disposent d'une unité de gestion de la mémoire intégrée qui gère une liste de ces pages au niveau matériel. Le Translation Lookaside Buffer (TLB) est une petite mémoire cache matérielle des correspondances entre les pages virtuelles et les pages physiques. Si l'adresse virtuelle transmise dans une instruction matérielle peut être trouvée dans le TLB, la correspondance peut être déterminée rapidement. Si ce n'est pas le cas, la TLB est manquée et le système revient à une traduction d'adresse plus lente, basée sur le logiciel, ce qui entraîne des problèmes de performance. La taille de la TLB étant fixe, le seul moyen de réduire le risque d'erreur de la TLB est d'augmenter la taille de la page.
Une page énorme est une page de mémoire dont la taille est supérieure à 4Ki. Sur les architectures x86_64, il existe deux tailles courantes de pages énormes : 2Mi et 1Gi. Les tailles varient sur les autres architectures. Pour utiliser les pages énormes, le code doit être écrit de manière à ce que les applications en soient conscientes. Les pages énormes transparentes (THP) tentent d'automatiser la gestion des pages énormes sans que l'application en ait connaissance, mais elles ont des limites. En particulier, elles sont limitées à des tailles de page de 2Mi. Les THP peuvent entraîner une dégradation des performances sur les nœuds à forte utilisation ou fragmentation de la mémoire en raison des efforts de défragmentation des THP, qui peuvent bloquer les pages de mémoire. Pour cette raison, certaines applications peuvent être conçues pour (ou recommander) l'utilisation d'énormes pages pré-allouées au lieu de THP.
7.5.2. Comment les pages volumineuses sont consommées par les applications
Les nœuds doivent pré-allouer des pages volumineuses pour que le nœud puisse indiquer sa capacité de pages volumineuses. Un nœud ne peut pré-allouer des pages volumineuses que pour une seule taille.
Les pages volumineuses peuvent être consommées par le biais des exigences de ressources au niveau du conteneur en utilisant le nom de la ressource hugepages-<size>
, où la taille est la notation binaire la plus compacte utilisant des valeurs entières prises en charge par un nœud particulier. Par exemple, si un nœud prend en charge des tailles de page de 2048 Ko, il expose une ressource planifiable hugepages-2Mi
. Contrairement à l'unité centrale ou à la mémoire, les pages volumineuses ne permettent pas le surengagement.
apiVersion: v1
kind: Pod
metadata:
generateName: hugepages-volume-
spec:
containers:
- securityContext:
privileged: true
image: rhel7:latest
command:
- sleep
- inf
name: example
volumeMounts:
- mountPath: /dev/hugepages
name: hugepage
resources:
limits:
hugepages-2Mi: 100Mi 1
memory: "1Gi"
cpu: "1"
volumes:
- name: hugepage
emptyDir:
medium: HugePages
- 1
- Spécifiez la quantité de mémoire pour
hugepages
comme étant la quantité exacte à allouer. Ne spécifiez pas cette valeur comme étant la quantité de mémoire pourhugepages
multipliée par la taille de la page. Par exemple, compte tenu d'une taille de page énorme de 2 Mo, si vous souhaitez utiliser 100 Mo de RAM soutenue par des pages énormes pour votre application, vous devez allouer 50 pages énormes. OpenShift Container Platform fait le calcul pour vous. Comme dans l'exemple ci-dessus, vous pouvez spécifier100MB
directement.
Allocating huge pages of a specific size
Certaines plates-formes prennent en charge plusieurs tailles de pages volumineuses. Pour allouer des pages volumineuses d'une taille spécifique, faites précéder les paramètres de la commande d'amorçage des pages volumineuses d'un paramètre de sélection de la taille des pages volumineuses hugepagesz=<size>
. La valeur de <size>
doit être spécifiée en octets avec un suffixe d'échelle facultatif [kKmMgG
]. La taille par défaut des pages énormes peut être définie à l'aide du paramètre d'amorçage default_hugepagesz=<size>
.
Huge page requirements
- Les demandes de pages volumineuses doivent être égales aux limites. Il s'agit de la valeur par défaut si des limites sont spécifiées, mais que les demandes ne le sont pas.
- Les pages volumineuses sont isolées au niveau du pod. L'isolation des conteneurs est prévue dans une prochaine itération.
-
EmptyDir
les volumes soutenus par des pages volumineuses ne doivent pas consommer plus de mémoire de page volumineuse que la demande de pod. -
Les applications qui consomment des pages volumineuses via
shmget()
avecSHM_HUGETLB
doivent fonctionner avec un groupe supplémentaire qui correspond à proc/sys/vm/hugetlb_shm_group.
7.5.3. Configuration de pages volumineuses
Les nœuds doivent pré-allouer les pages volumineuses utilisées dans un cluster OpenShift Container Platform. Il existe deux façons de réserver des pages volumineuses : au démarrage et à l'exécution. La réservation au démarrage augmente les chances de succès car la mémoire n'a pas encore été fragmentée de manière significative. Le Node Tuning Operator prend actuellement en charge l'allocation de pages volumineuses au moment du démarrage sur des nœuds spécifiques.
7.5.3.1. Au moment du démarrage
Procédure
Pour minimiser les redémarrages de nœuds, l'ordre des étapes ci-dessous doit être respecté :
Étiqueter tous les nœuds qui ont besoin du même réglage de pages énormes par une étiquette.
oc label node <node_using_hugepages> node-role.kubernetes.io/worker-hp= $ oc label node <node_using_hugepages> node-role.kubernetes.io/worker-hp=
Créez un fichier avec le contenu suivant et nommez-le
hugepages-tuned-boottime.yaml
:apiVersion: tuned.openshift.io/v1 kind: Tuned metadata: name: hugepages 1 namespace: openshift-cluster-node-tuning-operator spec: profile: 2 - data: | [main] summary=Boot time configuration for hugepages include=openshift-node [bootloader] cmdline_openshift_node_hugepages=hugepagesz=2M hugepages=50 3 name: openshift-node-hugepages recommend: - machineConfigLabels: 4 machineconfiguration.openshift.io/role: "worker-hp" priority: 30 profile: openshift-node-hugepages
- 1
- Réglez le site
name
de la ressource accordée surhugepages
. - 2
- Définir la section
profile
pour allouer des pages volumineuses. - 3
- L'ordre des paramètres est important, car certaines plates-formes prennent en charge des pages volumineuses de différentes tailles.
- 4
- Activer la correspondance basée sur le pool de configuration de la machine.
Créer l'objet Tuned
hugepages
$ oc create -f hugepages-tuned-boottime.yaml
Créez un fichier avec le contenu suivant et nommez-le
hugepages-mcp.yaml
:apiVersion: machineconfiguration.openshift.io/v1 kind: MachineConfigPool metadata: name: worker-hp labels: worker-hp: "" spec: machineConfigSelector: matchExpressions: - {key: machineconfiguration.openshift.io/role, operator: In, values: [worker,worker-hp]} nodeSelector: matchLabels: node-role.kubernetes.io/worker-hp: ""
Créer le pool de configuration de la machine :
$ oc create -f hugepages-mcp.yaml
Avec suffisamment de mémoire non fragmentée, tous les nœuds du pool de configuration de la machine worker-hp
devraient maintenant avoir 50 pages énormes de 2Mi allouées.
$ oc get node <node_using_hugepages> -o jsonpath="{.status.allocatable.hugepages-2Mi}" 100Mi
Le plugin TuneD bootloader est actuellement pris en charge sur les nœuds de travail Red Hat Enterprise Linux CoreOS (RHCOS) 8.x. Pour les nœuds de travail Red Hat Enterprise Linux (RHEL) 7.x, le plugin de chargeur de démarrage TuneD n'est actuellement pas pris en charge.