14.3. Réglage des nœuds pour une faible latence à l'aide du profil de performance
Le profil de performance vous permet de contrôler les aspects de réglage de la latence des nœuds qui appartiennent à un certain pool de configuration de machines. Après avoir spécifié vos paramètres, l'objet PerformanceProfile est compilé en plusieurs objets qui effectuent le réglage au niveau du nœud :
-
Un fichier
MachineConfigqui manipule les nœuds. -
Un fichier
KubeletConfigqui configure le gestionnaire de topologie, le gestionnaire de CPU et les nœuds d'OpenShift Container Platform. - Le profil d'accord qui configure l'opérateur d'accord du nœud.
Vous pouvez utiliser un profil de performance pour spécifier s'il faut mettre à jour le noyau vers kernel-rt, allouer d'énormes pages et partitionner les CPU pour qu'ils effectuent des tâches ménagères ou exécutent des charges de travail.
Vous pouvez créer manuellement l'objet PerformanceProfile ou utiliser le Performance Profile Creator (PPC) pour générer un profil de performance. Voir les ressources supplémentaires ci-dessous pour plus d'informations sur le PPC.
Exemple de profil de performance
apiVersion: performance.openshift.io/v2
kind: PerformanceProfile
metadata:
name: performance
spec:
cpu:
isolated: "5-15"
reserved: "0-4"
hugepages:
defaultHugepagesSize: "1G"
pages:
- size: "1G"
count: 16
node: 0
realTimeKernel:
enabled: true
numa:
topologyPolicy: "best-effort"
nodeSelector:
node-role.kubernetes.io/worker-cnf: ""
- 1
- Ce champ permet d'isoler des unités centrales spécifiques à utiliser avec des conteneurs d'application pour les charges de travail.
- 2
- Utilisez ce champ pour réserver des unités centrales spécifiques à utiliser avec des conteneurs infra pour l'entretien.
- 3
- Utilisez ce champ pour installer le noyau en temps réel sur le nœud. Les valeurs valides sont
trueoufalse. La valeurtrueinstalle le noyau en temps réel. - 4
- Ce champ permet de configurer la politique du gestionnaire de topologie. Les valeurs valides sont
none(par défaut),best-effort,restrictedetsingle-numa-node. Pour plus d'informations, voir Politiques du gestionnaire de topologie. - 5
- Utilisez ce champ pour spécifier un sélecteur de nœuds afin d'appliquer le profil de performance à des nœuds spécifiques.
14.3.1. Configuration de pages volumineuses Copier lienLien copié sur presse-papiers!
Les nœuds doivent pré-allouer les pages volumineuses utilisées dans un cluster OpenShift Container Platform. Utilisez l'opérateur Node Tuning pour allouer des pages volumineuses sur un nœud spécifique.
OpenShift Container Platform fournit une méthode pour créer et allouer d'énormes pages. Node Tuning Operator fournit une méthode plus simple pour le faire en utilisant le profil de performance.
Par exemple, dans la section hugepages pages du profil de performance, vous pouvez spécifier plusieurs blocs de size, count et, éventuellement, node:
hugepages:
defaultHugepagesSize: "1G"
pages:
- size: "1G"
count: 4
node: 0
- 1
nodeest le nœud NUMA dans lequel les pages volumineuses sont allouées. Si vous ometteznode, les pages sont réparties uniformément entre tous les nœuds NUMA.
Attendez que le statut du pool de configuration de la machine concerné indique que la mise à jour est terminée.
Ce sont les seules étapes de configuration que vous devez effectuer pour allouer des pages volumineuses.
Vérification
Pour vérifier la configuration, consultez le fichier
/proc/meminfosur le nœud :$ oc debug node/ip-10-0-141-105.ec2.internal# grep -i huge /proc/meminfoExemple de sortie
AnonHugePages: ###### ## ShmemHugePages: 0 kB HugePages_Total: 2 HugePages_Free: 2 HugePages_Rsvd: 0 HugePages_Surp: 0 Hugepagesize: #### ## Hugetlb: #### ##Utilisez
oc describepour indiquer la nouvelle taille :$ oc describe node worker-0.ocp4poc.example.com | grep -i hugeExemple de sortie
hugepages-1g=true hugepages-###: ### hugepages-###: ###
14.3.2. Allocation de plusieurs pages de grande taille Copier lienLien copié sur presse-papiers!
Vous pouvez demander des pages volumineuses de différentes tailles dans le même conteneur. Cela vous permet de définir des pods plus complexes composés de conteneurs ayant des besoins différents en matière de taille des pages.
Par exemple, vous pouvez définir les tailles 1G et 2M et l'opérateur Node Tuning configurera les deux tailles sur le nœud, comme illustré ci-dessous :
spec:
hugepages:
defaultHugepagesSize: 1G
pages:
- count: 1024
node: 0
size: 2M
- count: 4
node: 1
size: 1G
14.3.3. Configuration d'un nœud pour l'équilibrage dynamique de la charge par IRQ Copier lienLien copié sur presse-papiers!
Configurez un nœud de cluster pour l'équilibrage de charge dynamique IRQ afin de contrôler quels cœurs peuvent recevoir des demandes d'interruption de périphérique (IRQ).
Conditions préalables
- Pour l'isolation du noyau, tous les composants matériels du serveur doivent prendre en charge l'affinité IRQ. Pour plus d'informations, voir la section Additional resources.
Procédure
- Connectez-vous au cluster OpenShift Container Platform en tant qu'utilisateur disposant des privilèges cluster-admin.
-
Définissez le profil de performance
apiVersionpour utiliserperformance.openshift.io/v2. -
Supprimez le champ
globallyDisableIrqLoadBalancingou attribuez-lui la valeurfalse. Définissez les CPU isolés et réservés appropriés. L'extrait suivant illustre un profil qui réserve 2 CPU. L'équilibrage de la charge des IRQ est activé pour les pods fonctionnant sur l'ensemble de CPU
isolated:apiVersion: performance.openshift.io/v2 kind: PerformanceProfile metadata: name: dynamic-irq-profile spec: cpu: isolated: 2-5 reserved: 0-1 ...NoteLorsque vous configurez des CPU réservés et isolés, les conteneurs d'infrastructure dans les pods utilisent les CPU réservés et les conteneurs d'application utilisent les CPU isolés.
Créez le pod qui utilise des CPU exclusifs et attribuez les annotations
irq-load-balancing.crio.ioetcpu-quota.crio.ioàdisable. Par exemple :apiVersion: v1 kind: Pod metadata: name: dynamic-irq-pod annotations: irq-load-balancing.crio.io: "disable" cpu-quota.crio.io: "disable" spec: containers: - name: dynamic-irq-pod image: "registry.redhat.io/openshift4/cnf-tests-rhel8:v4.4.12" command: ["sleep", "10h"] resources: requests: cpu: 2 memory: "200M" limits: cpu: 2 memory: "200M" nodeSelector: node-role.kubernetes.io/worker-cnf: "" runtimeClassName: performance-dynamic-irq-profile ...-
Saisissez le pod
runtimeClassNamesous la forme performance-<profile_name>, où <profile_name> est lenamedu YAMLPerformanceProfile, dans cet exemple,performance-dynamic-irq-profile. - Définir le sélecteur de nœud pour cibler un travailleur cnf.
Assurez-vous que le pod fonctionne correctement. Le statut doit être
running, et le nœud cnf-worker correct doit être défini :$ oc get pod -o wideRésultats attendus
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES dynamic-irq-pod 1/1 Running 0 5h33m <ip-address> <node-name> <none> <none>Obtenir les unités centrales sur lesquelles le pod configuré pour l'équilibrage de charge dynamique IRQ fonctionne :
$ oc exec -it dynamic-irq-pod -- /bin/bash -c "grep Cpus_allowed_list /proc/self/status | awk '{print $2}'"Résultats attendus
Cpus_allowed_list: 2-3Assurez-vous que la configuration du nœud est appliquée correctement. Accédez au nœud par SSH pour vérifier la configuration.
$ oc debug node/<node-name>Résultats attendus
Starting pod/<node-name>-debug ... To use host binaries, run `chroot /host` Pod IP: <ip-address> If you don't see a command prompt, try pressing enter. sh-4.4#Vérifiez que vous pouvez utiliser le système de fichiers du nœud :
sh-4.4# chroot /hostRésultats attendus
sh-4.4#Assurez-vous que le masque d'affinité CPU du système par défaut n'inclut pas les CPU
dynamic-irq-pod, par exemple, les CPU 2 et 3.$ cat /proc/irq/default_smp_affinityExemple de sortie
33Assurez-vous que les IRQ du système ne sont pas configurées pour fonctionner sur les unités centrales
dynamic-irq-pod:find /proc/irq/ -name smp_affinity_list -exec sh -c 'i="$1"; mask=$(cat $i); file=$(echo $i); echo $file: $mask' _ {} \;Exemple de sortie
/proc/irq/0/smp_affinity_list: 0-5 /proc/irq/1/smp_affinity_list: 5 /proc/irq/2/smp_affinity_list: 0-5 /proc/irq/3/smp_affinity_list: 0-5 /proc/irq/4/smp_affinity_list: 0 /proc/irq/5/smp_affinity_list: 0-5 /proc/irq/6/smp_affinity_list: 0-5 /proc/irq/7/smp_affinity_list: 0-5 /proc/irq/8/smp_affinity_list: 4 /proc/irq/9/smp_affinity_list: 4 /proc/irq/10/smp_affinity_list: 0-5 /proc/irq/11/smp_affinity_list: 0 /proc/irq/12/smp_affinity_list: 1 /proc/irq/13/smp_affinity_list: 0-5 /proc/irq/14/smp_affinity_list: 1 /proc/irq/15/smp_affinity_list: 0 /proc/irq/24/smp_affinity_list: 1 /proc/irq/25/smp_affinity_list: 1 /proc/irq/26/smp_affinity_list: 1 /proc/irq/27/smp_affinity_list: 5 /proc/irq/28/smp_affinity_list: 1 /proc/irq/29/smp_affinity_list: 0 /proc/irq/30/smp_affinity_list: 0-5
Certains contrôleurs d'IRQ ne prennent pas en charge le rééquilibrage des IRQ et exposent toujours tous les CPU en ligne comme masque d'IRQ. Ces contrôleurs d'IRQ fonctionnent effectivement sur l'unité centrale 0. Pour plus d'informations sur la configuration de l'hôte, connectez-vous en SSH à l'hôte et exécutez la commande suivante, en remplaçant <irq-num> par le numéro de l'unité centrale que vous souhaitez interroger :
$ cat /proc/irq/<irq-num>/effective_affinity
14.3.3.1. Compatibilité matérielle avec l'affinité IRQ Copier lienLien copié sur presse-papiers!
Pour l'isolation du noyau, tous les composants matériels du serveur doivent prendre en charge l'affinité IRQ. Pour vérifier si les composants matériels de votre serveur prennent en charge l'affinité IRQ, consultez les spécifications matérielles du serveur ou contactez votre fournisseur de matériel.
OpenShift Container Platform prend en charge les périphériques matériels suivants pour l'équilibrage dynamique de la charge :
| Fabricant | Model | ID du vendeur | ID de l'appareil |
|---|---|---|---|
| Broadcom | BCM57414 | 14e4 | 16d7 |
| Broadcom | BCM57508 | 14e4 | 1750 |
| Intel | X710 | 8086 | 1572 |
| Intel | XL710 | 8086 | 1583 |
| Intel | XXV710 | 8086 | 158b |
| Intel | E810-CQDA2 | 8086 | 1592 |
| Intel | E810-2CQDA2 | 8086 | 1592 |
| Intel | E810-XXVDA2 | 8086 | 159b |
| Intel | E810-XXVDA4 | 8086 | 1593 |
| Mellanox | Famille MT27700 [ConnectX-4] | 15b3 | 1013 |
| Mellanox | Famille MT27710 [ConnectX-4 Lx] | 15b3 | 1015 |
| Mellanox | Famille MT27800 [ConnectX-5] | 15b3 | 1017 |
| Mellanox | Famille MT28880 [ConnectX-5 Ex] | 15b3 | 1019 |
| Mellanox | Famille MT28908 [ConnectX-6] | 15b3 | 101b |
| Mellanox | Famille MT2892 [ConnectX-6 Dx] | 15b3 | 101d |
| Mellanox | Famille MT2894 [ConnectX-6 Lx] | 15b3 | 101f |
| Mellanox | MT42822 BlueField-2 en mode NIC ConnectX-6 | 15b3 | a2d6 |
| Pensando | DSC-25 carte de services distribués 25G à double port pour pilote ionique | 0x1dd8 | 0x1002 |
| Pensando | DSC-100 carte de services distribués 100G à double port pour pilote ionique | 0x1dd8 | 0x1003 |
| Silicom | Famille STS | 8086 | 1591 |
14.3.4. Configuration de l'hyperthreading pour un cluster Copier lienLien copié sur presse-papiers!
Pour configurer l'hyperthreading pour un cluster OpenShift Container Platform, définissez les threads CPU dans le profil de performance sur les mêmes cœurs que ceux configurés pour les pools de CPU réservés ou isolés.
Si vous configurez un profil de performance et que vous modifiez par la suite la configuration de l'hyperthreading pour l'hôte, assurez-vous de mettre à jour les champs CPU isolated et reserved dans le PerformanceProfile YAML pour qu'ils correspondent à la nouvelle configuration.
La désactivation d'une configuration d'hyperthreading de l'hôte précédemment activée peut entraîner l'inexactitude des ID des cœurs de CPU répertoriés dans le fichier PerformanceProfile YAML. Cette configuration incorrecte peut entraîner l'indisponibilité du nœud car les CPU répertoriés ne peuvent plus être trouvés.
Conditions préalables
-
Accès au cluster en tant qu'utilisateur ayant le rôle
cluster-admin. - Installer le CLI OpenShift (oc).
Procédure
Vérifiez quels threads s'exécutent sur quels processeurs pour l'hôte que vous souhaitez configurer.
Vous pouvez voir quels threads sont en cours d'exécution sur les CPU hôtes en vous connectant au cluster et en exécutant la commande suivante :
$ lscpu --all --extendedExemple de sortie
CPU NODE SOCKET CORE L1d:L1i:L2:L3 ONLINE MAXMHZ MINMHZ 0 0 0 0 0:0:0:0 yes 4800.0000 400.0000 1 0 0 1 1:1:1:0 yes 4800.0000 400.0000 2 0 0 2 2:2:2:0 yes 4800.0000 400.0000 3 0 0 3 3:3:3:0 yes 4800.0000 400.0000 4 0 0 0 0:0:0:0 yes 4800.0000 400.0000 5 0 0 1 1:1:1:0 yes 4800.0000 400.0000 6 0 0 2 2:2:2:0 yes 4800.0000 400.0000 7 0 0 3 3:3:3:0 yes 4800.0000 400.0000Dans cet exemple, il y a huit cœurs logiques de CPU fonctionnant sur quatre cœurs physiques de CPU. CPU0 et CPU4 fonctionnent sur le Core0 physique, CPU1 et CPU5 fonctionnent sur le Core 1 physique, et ainsi de suite.
Pour afficher les threads définis pour un cœur de processeur physique particulier (
cpu0dans l'exemple ci-dessous), ouvrez une invite de commande et exécutez la commande suivante :$ cat /sys/devices/system/cpu/cpu0/topology/thread_siblings_listExemple de sortie
0-4Appliquez les CPU isolés et réservés dans le YAML
PerformanceProfile. Par exemple, vous pouvez définir les cœurs logiques CPU0 et CPU4 commeisolated, et les cœurs logiques CPU1 à CPU3 et CPU5 à CPU7 commereserved. Lorsque vous configurez des CPU réservés et isolés, les conteneurs d'infrastructure dans les pods utilisent les CPU réservés et les conteneurs d'application utilisent les CPU isolés.... cpu: isolated: 0,4 reserved: 1-3,5-7 ...NoteLes pools de CPU réservés et isolés ne doivent pas se chevaucher et doivent couvrir tous les cœurs disponibles dans le nœud de travail.
L'hyperthreading est activé par défaut sur la plupart des processeurs Intel. Si vous activez l'hyperthreading, tous les threads traités par un cœur particulier doivent être isolés ou traités sur le même cœur.
14.3.4.1. Désactivation de l'hyperthreading pour les applications à faible latence Copier lienLien copié sur presse-papiers!
Lorsque vous configurez des clusters pour un traitement à faible latence, vous devez vous demander si vous souhaitez désactiver l'hyperthreading avant de déployer le cluster. Pour désactiver l'hyperthreading, procédez comme suit :
- Créez un profil de performance adapté à votre matériel et à votre topologie.
Définir
nosmtcomme un argument supplémentaire du noyau. L'exemple de profil de performance suivant illustre ce paramètre :apiVersion: performance.openshift.io/v2 kind: PerformanceProfile metadata: name: example-performanceprofile spec: additionalKernelArgs: - nmi_watchdog=0 - audit=0 - mce=off - processor.max_cstate=1 - idle=poll - intel_idle.max_cstate=0 - nosmt cpu: isolated: 2-3 reserved: 0-1 hugepages: defaultHugepagesSize: 1G pages: - count: 2 node: 0 size: 1G nodeSelector: node-role.kubernetes.io/performance: '' realTimeKernel: enabled: trueNoteLorsque vous configurez des CPU réservés et isolés, les conteneurs d'infrastructure dans les pods utilisent les CPU réservés et les conteneurs d'application utilisent les CPU isolés.
14.3.5. Comprendre les indices de charge de travail Copier lienLien copié sur presse-papiers!
Le tableau suivant décrit l'impact des combinaisons de consommation d'énergie et de paramètres en temps réel sur la latence.
Les indices de charge de travail suivants peuvent être configurés manuellement. Vous pouvez également utiliser les indices de charge de travail à l'aide du Créateur de profil de performance. Pour plus d'informations sur le profil de performance, voir la section "Création d'un profil de performance".
| Paramètres du créateur du profil de performance | Indice | Environnement | Description |
|---|---|---|---|
| Défaut |
| Cluster à haut débit sans exigences de latence | Performances obtenues grâce au partitionnement de l'unité centrale uniquement. |
| Faible latence |
| Centres de données régionaux | Des économies d'énergie et une faible latence sont souhaitables : il faut trouver un compromis entre la gestion de l'énergie, la latence et le débit. |
| Très faible latence |
| Clusters de pointe, charges de travail critiques en termes de latence | Optimisé pour une latence minimale absolue et un déterminisme maximal au prix d'une consommation d'énergie accrue. |
| Gestion de l'alimentation par pod |
| Charges de travail critiques et non critiques | Permet la gestion de l'énergie par module. |
14.3.6. Configuration manuelle des indices de charge de travail Copier lienLien copié sur presse-papiers!
Procédure
-
Créez un site
PerformanceProfileadapté au matériel et à la topologie de l'environnement, comme décrit dans le tableau de la section "Comprendre les indices de charge de travail". Ajustez le profil pour qu'il corresponde à la charge de travail prévue. Dans cet exemple, nous réglons la latence pour qu'elle soit la plus faible possible. Ajoutez les indices de charge de travail
highPowerConsumptionetrealTime. Les deux sont réglés surtrueici.apiVersion: performance.openshift.io/v2 kind: PerformanceProfile metadata: name: workload-hints spec: ... workloadHints: highPowerConsumption: true1 realTime: true2
14.3.7. Limiter les CPU pour les conteneurs d'infrastructures et d'applications Copier lienLien copié sur presse-papiers!
Les tâches génériques de maintenance et de charge de travail utilisent les CPU d'une manière qui peut avoir un impact sur les processus sensibles à la latence. Par défaut, le moteur d'exécution des conteneurs utilise tous les processeurs en ligne pour exécuter tous les conteneurs ensemble, ce qui peut entraîner des changements de contexte et des pics de latence. Le partitionnement des CPU empêche les processus bruyants d'interférer avec les processus sensibles à la latence en les séparant les uns des autres. Le tableau suivant décrit comment les processus s'exécutent sur une unité centrale après avoir réglé le nœud à l'aide de l'opérateur de réglage du nœud :
| Type de processus | Détails |
|---|---|
|
| Fonctionne sur n'importe quelle unité centrale, sauf en cas de charge de travail à faible latence |
| Pods d'infrastructure | Fonctionne sur n'importe quelle unité centrale, sauf en cas de charge de travail à faible latence |
| Interruptions | Redirections vers des CPU réservés (optionnel dans OpenShift Container Platform 4.7 et plus) |
| Processus du noyau | Broches vers les unités centrales réservées |
| Pods de charge de travail sensibles aux temps de latence | Pins vers un ensemble spécifique d'unités centrales exclusives du pool isolé |
| Processus du système d'exploitation/services Systemd | Broches vers les unités centrales réservées |
La capacité allouable des cœurs sur un nœud pour les pods de tous les types de processus QoS, Burstable, BestEffort, ou Guaranteed, est égale à la capacité du pool isolé. La capacité du pool réservé est retirée de la capacité totale des cœurs du nœud pour être utilisée par le cluster et les tâches ménagères du système d'exploitation.
Exemple 1
Un nœud a une capacité de 100 cœurs. À l'aide d'un profil de performance, l'administrateur de la grappe alloue 50 cœurs au pool isolé et 50 cœurs au pool réservé. L'administrateur de cluster attribue 25 cœurs aux pods QoS Guaranteed et 25 cœurs aux pods BestEffort ou Burstable. Cela correspond à la capacité du pool isolé.
Exemple 2
Un nœud a une capacité de 100 cœurs. À l'aide d'un profil de performance, l'administrateur de la grappe alloue 50 cœurs au pool isolé et 50 cœurs au pool réservé. L'administrateur de cluster attribue 50 cœurs aux pods QoS Guaranteed et un cœur pour les pods BestEffort ou Burstable. La capacité du pool isolé est ainsi dépassée d'un cœur. La planification des pods échoue en raison d'une capacité insuffisante de l'unité centrale.
Le modèle de partitionnement exact à utiliser dépend de nombreux facteurs tels que le matériel, les caractéristiques de la charge de travail et la charge prévue du système. Voici quelques exemples de cas d'utilisation :
- Si la charge de travail sensible à la latence utilise un matériel spécifique, tel qu'un contrôleur d'interface réseau (NIC), assurez-vous que les CPU du pool isolé sont aussi proches que possible de ce matériel. Au minimum, vous devez placer la charge de travail dans le même nœud NUMA (Non-Uniform Memory Access).
- Le pool réservé est utilisé pour gérer toutes les interruptions. Lorsque vous dépendez du réseau du système, allouez un pool de réserve suffisamment grand pour gérer toutes les interruptions de paquets entrants. Dans la version 4.12 et les versions ultérieures, les charges de travail peuvent éventuellement être qualifiées de sensibles.
La décision concernant les unités centrales spécifiques à utiliser pour les partitions réservées et isolées nécessite une analyse et des mesures détaillées. Des facteurs tels que l'affinité NUMA des périphériques et de la mémoire jouent un rôle. La sélection dépend également de l'architecture de la charge de travail et du cas d'utilisation spécifique.
Les pools de CPU réservés et isolés ne doivent pas se chevaucher et doivent couvrir tous les cœurs disponibles dans le nœud de travail.
Pour garantir que les tâches ménagères et les charges de travail n'interfèrent pas les unes avec les autres, spécifiez deux groupes de CPU dans la section spec du profil de performance.
-
isolated- Spécifie les unités centrales pour les charges de travail des conteneurs d'application. Ces unités centrales ont la latence la plus faible. Les processus de ce groupe n'ont pas d'interruptions et peuvent, par exemple, atteindre une bande passante DPDK sans perte de paquets beaucoup plus élevée. -
reserved- Spécifie les unités centrales pour les tâches d'entretien du cluster et du système d'exploitation. Les threads du groupereservedsont souvent occupés. N'exécutez pas d'applications sensibles aux temps de latence dans le groupereserved. Les applications sensibles aux temps de latence sont exécutées dans le groupeisolated.
Procédure
- Créer un profil de performance adapté au matériel et à la topologie de l'environnement.
Ajoutez les paramètres
reservedetisolatedavec les CPU que vous souhaitez réserver et isoler pour les conteneurs d'infrastructure et d'application :apiVersion: performance.openshift.io/v2 kind: PerformanceProfile metadata: name: infra-cpus spec: cpu: reserved: "0-4,9"1 isolated: "5-8"2 nodeSelector:3 node-role.kubernetes.io/worker: ""- 1
- Spécifiez les unités centrales destinées aux conteneurs infra pour effectuer les tâches de maintenance du cluster et du système d'exploitation.
- 2
- Spécifiez les unités centrales destinées aux conteneurs d'application pour l'exécution des charges de travail.
- 3
- Facultatif : Spécifiez un sélecteur de nœuds pour appliquer le profil de performance à des nœuds spécifiques.