Red Hat Training
A Red Hat training course is available for Red Hat Enterprise Linux
Guide de réglage des performances
Optimiser le débit des sous-systèmes dans Red Hat Enterprise Linux 6
Édition 4.0
Experts de domaine fonctionnel de Red Hat
Publié par
Don Domingo
Publié par
Laura Bailey
Résumé
Chapitre 1. Aperçu
- Fonctionnalités
- Chaque chapitre de sous-système décrit des fonctionnalités de performances uniques à (ou implémentées différemment dans) Red Hat Enterprise Linux 6. Ces chapitres traitent aussi des mises à jour de Red Hat Enterprise Linux 6 ayant amélioré les performances de sous-systèmes spécifiques sur Red Hat Enterprise Linux 5.
- Analyse
- Cet ouvrage énumère aussi les indicateurs de performance de chaque sous-système spécifique. Les valeurs typiques de ces indicateurs sont décrites dans le contexte de services spécifiques, vous aidant à mieux comprendre leurs signification dans des systèmes de production réels.En outre, le Guide de réglage des performances montre aussi différentes manières de récupérer les données des performances (c'est-à-dire le profilage) d'un sous-système. Remarquez que certains outils de profilage présentés ici sont documentés ailleurs avec plus de détails.
- Configuration
- Les informations les plus importantes dans cet ouvrage sont probablement les instructions sur la manière d'ajuster les performances d'un sous-système spécifique dans Red Hat Enterprise Linux 6. Le Guide de réglage des performances explique comment régler précisément un sous-système de Red Hat Enterprise Linux 6 pour des services spécifiques.
1.1. Audience
- Analystes informatiques ou commerciaux
- Cet ouvrage énumère et explique les fonctionnalités des performances de Red Hat Enterprise Linux 6 à un haut niveau, offrant de nombreuses informations sur la performance des sous-systèmes avec des charges de travail spécifiques (par défaut et lorsque optimisé). Le niveau de détail utilisé dans les descriptions des fonctionnalités des performances de Red Hat Enterprise Linux 6 aide les clients potentiels et ingénieurs de vente à mieux comprendre le caractère approprié de cette plate-forme et son offre de services exigeants en ressources à un niveau acceptable.Lorsque possible, le Guide de réglage des performances fournit aussi des liens vers des documents plus détaillés sur chaque fonctionnalité. À ce niveau de détails, les lecteurs pourront suffisamment comprendre les fonctionnalités de performance pour former une stratégie de haut niveau dans le déploiement et l'optimisation de Red Hat Enterprise Linux 6. Ceci permet aux lecteurs de développer et d'évaluer des propositions d'infrastructure.Ce niveau de documentation, concentré sur les fonctionnalités, convient aux lecteurs possédant une bonne compréhension des sous-systèmes Linux et des réseaux de niveau entreprise.
- Administrateur système
- Les procédures énumérées dans cet ouvrage conviendront aux administrateurs système possédant un niveau de compétences RHCE [1] (ou son équivalent, de 3 à 5 ans d'expérience dans le déploiement et la gestion de Linux). Le Guide de réglage des performances vise à fournir autant de détails que possible sur les effets de chaque configuration ; autrement dit, la description de toute contre-performance pouvant survenir.Les performances sous-jacentes lors du réglage des performances ne dépend pas de savoir comment analyser et régler un sous-système. Au contraire, un administrateur système adepte du réglage des performance saura comment équilibrer et optimiser un système Red Hat Enterprise Linux 6 dans un but précis. Cela implique aussi de savoir quelles pénalités et contre-performances sont acceptables lors de la tentative d'implémentation d'une configuration conçue pour stimuler les performances d'un sous-système spécifique.
1.2. Évolutivité horizontale
1.2.1. Informatique parallèle
1.3. Systèmes distribués
- Communication
- Une évolutivité horizontale requiert que de nombreuses tâches soient effectuées simultanément (en parallèle). Ainsi, ces tâches doivent pouvoir effectuer des communications inter-processus afin de coordonner leur travail. Par ailleurs, une plate-forme avec une évolutivité horizontale devrait être en mesure de partager des tâches sur de multiples systèmes.
- Stockage
- Le stockage via des disques locaux n'est pas suffisant pour répondre aux conditions nécessaires à une évolutivité horizontale. Une certaine forme de stockage distribué ou partagé est requise, avec une couche d'abstraction permettant à la capacité d'un volume de stockage unique d'augmenter de manière transparente avec l'ajout de nouveau matériel de stockage.
- Gestion
- La responsabilité la plus importante dans l'informatique distribuée est la couche de gestion. Cette couche de gestion coordonne tous les composants matériels et logiciels, gérant efficacement les communications et le stockage, ainsi que l'utilisation des ressources partagées.
1.3.1. Communication
- Matériel
- Logiciel
Pour les ordinateurs, la manière la plus commune de communiquer entre eux est sur Ethernet. De nos jours, GbE (« Gigabit Ethernet ») est fourni par défaut sur les systèmes et la plupart des serveurs incluent 2 à 4 ports Gigabit Ethernet. GbE offre une bonne bande passante et latence. Ceci est la fondation des systèmes distribués les plus utilisés de nos jours. Même lorsque des systèmes incluent un matériel réseau plus rapide, il reste commun d'utiliser GbE pour une interface de gestion dédiée.
10 Gigabit Ethernet (10GbE) est de plus en plus accepté pour les serveurs haut de gamme et de milieu de gamme. 10GbE fournit dix fois la bande passante de GbE. L'un de ses principaux avantages réside dans ses processeurs multi-cœurs modernes, où est restauré l'équilibre entre les communications et l'informatique. Vous pouvez comparer un système à seul cœur utilisant GbE avec un système à huit cœurs utilisant 10GbE. Utilisé de cette manière, 10GbE est particulièrement utile pour la maintenance des performances générales du système pour éviter la congestion des communications.
Infiniband offre des performances encore plus élevées que 10GbE. En plus des connexions TCP/IP et UDP utilisées avec Ethernet, Infiniband prend aussi en charge les communications de mémoire partagée. Cela permet à Infiniband de fonctionner entre des systèmes via RDMA (de l'anglais, « remote direct memory access »).
RoCCE (« RDMA over Ethernet ») implémente des communications dans le style d'Infiniband (y compris RDMA) sur une infrastructure 10GbE. Vu le coût des améliorations associées au volume grandissant des produits 10GbE, il est raisonnable de s'attendre à une augmentation de l'utilisation de RDMA et RoCCE sur un plus large éventail de systèmes et d'applications.
1.3.2. Stockage
- De multiples systèmes stockent des données dans un emplacement unique
- Une unité de stockage (par exemple, un volume) composée de multiples appareils de stockage
NFS (« Network File System ») permet à de multiples serveurs ou utilisateurs de monter et utiliser la même instance de stockage distant via TCP ou UDP. NFS est communément utilisé pour conserver les données partagées par de multiples applications. NFS est aussi pratique pour le stockage en vrac de grandes quantités de données.
Les réseaux de stockage SAN (« Storage Area Networks ») utilisent le protocole Fibre Channel ou iSCSI afin d'offrir un accès distant au stockage. L'infrastructure Fibre Channel (comme les adaptateurs de bus hôte Fibre Channel, commutateurs et matrices de stockage) combinent hautes performances, une bande passante importante et un stockage massif. Les réseaux de stockage SAN séparent le stockage du traitement, offrant ainsi une importante flexibilité dans la conception du système.
- Contrôle de l'accès au stockage
- Gestion de grandes quantités de données
- Approvisionnement des systèmes
- Sauvegarde et réplication de données
- Prise d'instantanés
- Prise en charge du basculement (« failover ») de systèmes
- Assurance de l'intégrité des données
- Migration des données
Le système de fichiers Red Hat Global File System 2 (GFS2) offre plusieurs capacités spécialisées. La fonction de base de GFS2 est d'offrir un système de fichiers unique, y compris l'accès simultané lecture/écriture, partagé sur de multiples membres d'un cluster. Cela signifie que chaque membre du cluster voit exactement les mêmes données « sur disque » dans le système de fichiers GFS2.
1.3.3. Réseaux convergents
Avec FCoe, les commandes Fibre Channel standard et les paquets de données sont transportés sur une infrastructure 10GbE via une CNA (converged network card, ou « carte réseau convergente »). Le trafic Ethernet TCP/IP standard et les opérations de stockage Fibre Channel peuvent être transportés via le même lien. FCoE utilise une carte d'interface réseau physique (et un câble) pour de multiples connexions de stockage ou réseau logique.
- Nombre de connexions réduit
- FCoE réduit de moitié le nombre de connexions réseau à un serveur. Vous pouvez toujours choisir d'avoir de multiples connexions pour les performances ou pour la disponibilité ; cependant, une seule connexion offre une connectivité stockage et réseau. Ceci est particulièrement utile pour les serveurs « Pizza box » et les serveurs « Blade », puisqu'ils ont tous deux un espace très limité pour les composants.
- Moindre coût
- Un nombre de connexions réduit signifie un nombre immédiatement réduit de câbles, d'interrupteurs et autres équipements de réseau. L'histoire d'Ethernet démontre aussi des économies de grande taille ; le coût des réseaux a dramatiquement diminué alors que le nombre de périphériques sur le marché est passé de plusieurs millions à des milliards, tout comme le déclin des prix des périphériques 100 Mo Ethernet et gigabit Ethernet a pu être observé.De manière similaire, 10GbE deviendra aussi moins coûteux alors que davantage d'entreprises s'adapteront à son utilisation. Aussi, tandis que le matériel CNA est intégré en une seule puce, son utilisation de masse augmentera sur le marché, ce qui, au cours du temps, aura pour conséquence la diminution significative de son prix.
iSCSI (« Internet SCSI ») est un autre type de protocole de réseau convergé, une alternative a FCoE. Tout comme Fibre Channel, iSCSI fournit un stockage de niveau bloc sur un réseau. Cependant, iSCSI ne fournit pas d'environnement de gestion complet. Le principal avantage d'iSCSI par rapport à FCoE est qu'iSCSI offre la plupart des capacités et de la flexibilité de Fibre Channel, mais pour un moindre coût.
Chapitre 2. Caractéristiques des performances de Red Hat Enterprise Linux 6
2.1. Prise en charge 64 bits
- Huge pages et transparent huge pages
- Améliorations de l'accès mémoire non-uniforme (NUMA)
L'implémentation de « huge pages » dans Red Hat Enterprise Linux 6 permet au système de gérer l'utilisation de la mémoire efficacement sur de multiples charges de travail de mémoire. Les « Huge pages » utilisent dynamiquement des pages de 2 Mo au lieu de la taille de page standard de 4 Ko, permettant aux applications de bien s'adapter au traitement des gigaoctets et même aux téraoctets de mémoire.
De nombreux systèmes prennent maintenant en charge NUMA (« Non-Uniform Memory Access »). NUMA simplifie le design et la création de matériel pour des systèmes de grande taille ; cependant, une couche de complexité est aussi ajoutée au développement de l'application. Par exemple, NUMA implémente une mémoire locale et une mémoire distante, la mémoire distante peut prendre plusieurs fois plus de temps à accéder que la mémoire locale. Cette fonctionnalité (entre autres) comprend de nombreuses implications quant à la performance qui ont un impact sur les systèmes d'exploitation, les applications et les configurations de systèmes devant être déployés.
2.2. Ticket Spinlocks
2.3. Structure de liste dynamique
2.4. Noyau Tickless
2.5. Groupes de contrôle
- Une liste de tâches assignées au cgroup
- Des ressources allouées à ces tâches
- CPUsets
- Mémoire
- E/S
- Réseau (bande passante)
2.6. Améliorations du stockage et des systèmes de fichiers
Ext4 est le système de fichiers par défaut de Red Hat Enterprise Linux 6. Il est la version de quatrième génération de la gamme de systèmes de fichiers EXT, prenant en charge un système de fichiers d'une taille maximale théorique de 1 exaoctet, et un fichier unique d'une taille maximale de 16 To. Red Hat Enterprise Linux 6 prend en charge un système de fichiers d'une taille maximale de 16 To et un fichier unique d'une taille maximale de 16 To. Hormis sa capacité de stockage bien plus grande, ext4 inclut aussi plusieurs autres nouvelles fonctionnalités, comme :
- Des métadonnées basées sur extensions
- L'allocation différée
- Le checksum de journaux
XFS est un système de fichiers de journalisation de 64 bits, robuste et mature, qui prend en charge des fichiers et systèmes de fichiers de très grande taille sur un hôte unique. À l'origine, ce système de fichiers fût développé par SGI et possède une longue histoire d'exécution sur des serveurs et des matrices de stockage extrêmement grands. XFS inclut :
- L'allocation différée
- Des inodes alloués de manière dynamique
- Une indexation d'arborescence B pour l'évolutivité de la gestion de l'espace libre
- La défragmentation en ligne et l'agrandissement du système de fichiers
- Des algorithmes de lecture à l'avance de métadonnées sophistiqués
Un BIOS traditionnel prend en charge un disque d'une taille maximale de 2,2 To. Les systèmes Red Hat Enterprise Linux 6 qui utilisent BIOS peuvent prendre en charge des disques de plus de 2,2 To en utilisant une nouvelle structure de disque appelée GPT (« Global Partition Table », table de partitionnement global). GPT peut uniquement être utilisé pour les disques de données, il ne peut pas être utilisé pour les lecteurs de démarrage avec BIOS. Ainsi, les lecteurs de démarrage peuvent uniquement faire une taille maximale de 2,2 To. À l'origine, BIOS avait été créé pour le PC IBM ; tandis que BIOS a considérablement évolué afin de s'adapter au matériel moderne, UEFI (« Unified Extensible Firmware Interface ») a été conçu pour prendre en charge le matériel nouveau et émergent.
Important
Important
Chapitre 3. Contrôle et analyse des performances du système
3.1. Le système de fichiers proc
proc
est un répertoire contenant une hiérarchie de fichiers qui représentent l'état actuel du noyau Linux. Il permet aux applications et utilisateurs de voir la vue qu'a le noyau du système.
proc
contient aussi des informations sur le matériel du système et sur tout processus actuellement en cours d'exécution. La plupart de ces fichiers sont en lecture-seule, mais certains fichiers (principalement ceux en /proc/sys
) peuvent être manipulés par les utilisateurs et les applications afin de communiquer les changements de configuration au noyau.
proc
, veuillez consulter le Guide de déploiement, disponible sur http://access.redhat.com/site/documentation/Red_Hat_Enterprise_Linux/.
3.2. Moniteurs système GNOME et KDE
Le Moniteur système GNOME affiche les informations système de base et vous permet de contrôler les processus du système, ainsi que l'utilisation des ressources et du système de fichiers. Ouvrez-le avec la commande gnome-system-monitor
dans le Terminal, ou cliquez sur le menu Applications et sélectionnez Outils système > Moniteur système.
- Système
- Affiche des informations de base sur les logiciels et le matériel de l'ordinateur.
- Processus
- Affiche les processus actifs et les relations entre ces processus, ainsi que des informations détaillées sur chaque processus. Vous permet aussi de filtrer les processus affichés et d'effectuer certaines actions sur ces processus (« start », « stop », « kill », « change priority », etc...).
- Ressources
- Affiche le temps actuel d'utilisation du CPU, d'espace mémoire, d'espace swap et du réseau.
- Systèmes de fichiers
- Répertorie tous les systèmes de fichiers montés aux côtés d'informations de base sur chacun d'entre eux, comme le type de système de fichiers, le point de montage et l'utilisation de la mémoire.
Le KDE System Guard vous permet de contrôler la charge du système et les processus actuellement en cours. Il vous permet aussi d'effectuer des actions sur les processus. Ouvrez-le avec la commande ksysguard
dans le Terminal, ou cliquez sur le Kickoff Application Launcher et sélectionnez Applications > Système > Moniteur système.
- Table des processus
- Affiche une liste de tous les processus en cours d'exécution, cette liste est alphabétique par défaut. Vous pouvez aussi classer les processus selon un certain nombre d'autres propriétés, dont la totalité de l'utilisation du CPU, l'utilisation de mémoire physique ou partagée, le propriétaire et la priorité. Vous pouvez aussi filtrer les résultats visibles, rechercher des processus spécifiques ou effectuer certaines actions sur un processus.
- Charge du système
- Affiche des graphes historiques de l'utilisation du CPU, de la mémoire et de l'espace swap, ainsi que du réseau. Passez sur les graphes pour une analyse détaillée et les clés du graphe.
3.3. Outils de contrôle intégrés sur ligne de commande
top
L'outil top offre un affichage dynamique et en temps réel des processus dans un système en cours d'exécution. Il peut afficher tout un éventail d'informations, y compris un sommaire du système et les tâches actuellement gérées par le noyau Linux. Il possède aussi la capacité limitée de manipuler les processus. Son opération et les informations qu'il affiche sont hautement configurables et tous les détails de configuration peuvent être rendus persistants à travers les redémarrages.
man top
.
ps
L'outil ps prend un instantané d'un groupe sélectionné de processus actifs. Par défaut, ce groupe est limité aux processus appartenant à l'utilisateur actuel et associés au même terminal.
man ps
.
vmstat
vmstat (« Virtual Memory Statistics », statistiques de mémoire virtuelle) émets instantanément des rapports sur les processus de votre système, la mémoire, la pagination, les E/S de bloc, les interruptions et sur l'activité du CPU.
man vmstat
.
sar
sar (« System Activity Reporter », rapporteur d'activité système) collecte et rapporte des informations sur l'activité du système du jour jusqu'à présent. La sortie par défaut couvre l'utilisation du CPU pendant la journée à dix minutes d'intervalle, ce à partir du commencement de la journée.
12:00:01 AM CPU %user %nice %system %iowait %steal %idle 12:10:01 AM all 0.10 0.00 0.15 2.96 0.00 96.79 12:20:01 AM all 0.09 0.00 0.13 3.16 0.00 96.61 12:30:01 AM all 0.09 0.00 0.14 2.11 0.00 97.66 ...
man sar
.
3.4. Tuned et ktune
default
- Profil d'économie d'énergie par défaut. Ce profil est le profil d'économies d'énergie le plus basique. Il active uniquement les plugins du disque et du CPU. Remarquez qu'il ne s'agit pas de la même chose qu'éteindre tuned-adm, dans quel cas tuned et ktune seraient tous deux désactivés.
latency-performance
- Profil de serveur pour optimisation typique des performances de la latence. Les mécanismes d'économies d'énergie de tuned et ktune sont désactivés. Le mode
cpuspeed
bascule surperformance
. L'élévateur d'entrée et sorties est modifié surdeadline
pour chaque périphérique. Pour une meilleure qualité de service de la gestion de l'alimentation, la condition préalable0
decpu_dma_latency
est enregistrée. throughput-performance
- Profil de serveur pour une optimisation typique des performances de débit. Ce profil est recommandé si le système ne possède pas de stockage de classe entreprise. Ce profil est le même que
latency-performance
, à l'exception de :kernel.sched_min_granularity_ns
(granularité de préemption minimale de l'ordonnanceur), qui est paramétré que10
millisecondes,kernel.sched_wakeup_granularity_ns
(granularité de réveil de l'ordonnanceur), qui est paramétré sur15
millisecondes,vm.dirty_ratio
(ratio dirty de la machine virtuelle), qui est paramétré sur 40% et- les huge pages transparentes sont activées.
enterprise-storage
- Ce profil est recommandé pour les configurations de serveurs de taille entreprise avec un stockage de classe entreprise, incluant une protection de cache de contrôleur sur batterie et la gestion de caches sur disque. Ce profil est le même que le profil
throughput-performance
, mais inclut un ajout : les systèmes de fichiers sont montés à nouveau avecbarrier=0
. virtual-guest
- Ce profil est recommandé pour les configurations de serveurs de taille entreprise avec un stockage de classe entreprise, incluant une protection de cache de contrôleur sur batterie et la gestion de caches sur disque. Ce profil est le même que
throughput-performance
, à l'exception de :- La valeur
readahead
, qui est paramétrée sur4x
et - Les systèmes de fichiers non root/boot sont montés à nouveau avec
barrier=0
.
virtual-host
- Basé sur le profil
enterprise-storage
,virtual-host
réduit aussi le « swappiness » de la mémoire virtuelle et active une réécriture plus agressive des pages modifiées. Ce profil est disponible sur Red Hat Enterprise Linux 6.3 et ses versions supérieures et est le profil recommandé pour les hôtes de virtualisation, y compris KVM et les hôtes Red Hat Enterprise Virtualization.
3.5. Profileurs d'application
3.5.1. SystemTap
3.5.2. OProfile
- Les échantillons de contrôle des performances peuvent ne pas être précis. Comme le processeur peut exécuter des instructions issues d'un ordre, un échantillon peut être enregistré à partir d'une instruction avoisinante, au lieu d'à partir de l'instruction ayant avoisiné l'interruption.
- Comme OProfile est global et suppose que des processus démarrent et s'arrêtent de multiples fois, les échantillons de multiples exécutions sont autorisés à s'accumuler. Cela signifie que vous devrez probablement supprimer les données des échantillons des précédentes exécutions.
- Il se concentre sur l'identification des problèmes de processus limités par les CPU et ainsi, il n'identifie pas les processus qui sont en veille pendant l'attente de verrous pour d'autres événements.
/usr/share/doc/oprofile-<version>
.
3.5.3. Valgrind
man valgrind
lorsque le paquetage valgrind est installé. Des documents accompagnateurs peuvent aussi être trouvés dans :
/usr/share/doc/valgrind-<version>/valgrind_manual.pdf
/usr/share/doc/valgrind-<version>/html/index.html
3.5.4. Perf
perf stat
- Cette commande fournit des statistiques générales sur les événements communs des performances, y compris les instructions exécutées et les cycles d'horloge consommés. Vous pouvez utiliser les indicateurs d'option pour rassembler des statistiques sur des événements différents des événements de mesure par défaut. À partir de Red Hat Enterprise Linux 6.4, il est possible d'utiliser
perf stat
pour filtrer le contrôle en se basant sur un ou plusieurs groupe(s) de contrôle spécifié(s) (cgroups). Pour obtenir des informations supplémentaires, veuillez lire la page man :man perf-stat
. perf record
- Cette commande enregistre les données des performances dans un fichier qui peut être analysé ultérieurement à l'aide de
perf report
. Pour obtenir de détails supplémentaires, veuillez lire la page man :man perf-record
. perf report
- Cette commande lit les données des performances à partir d'un fichier et analyse les données enregistrées. Pour obtenir des détails supplémentaires, veuillez lire la page man :
man perf-report
. perf list
- Cette commande répertorie les événements disponibles sur une machine en particulier. Ces événements vont varier en se basant sur le matériel de contrôle des performances et sur la configuration logicielle du système. Pour obtenir des informations supplémentaires, veuillez lire la page man :
man perf-list
. perf top
- Cette commande effectue une fonction similaire à l'outil top. Elle génère et affiche un profil de compteur des performances en temps réel. Pour obtenir des informations supplémentaires, veuillez lire la page man :
man perf-top
.
3.6. Red Hat Enterprise MRG
- Les paramètres BIOS liés à la gestion de l'alimentation, à la détection d'erreurs et aux interruptions de gestion du système ;
- les paramètres réseau, comme la fusion d'interruptions et l'utilisation de TCP ;
- les activités de journalisation dans les systèmes de fichiers de journalisation ;
- les journalisations de système ;
- si les interruptions et les processus utilisateur sont gérés par un CPU ou une gamme de CPU spécifique ;
- si l'espace swap est utilisé ;
- et comment gérer les exceptions de mémoire saturée.
Chapitre 4. CPU
Topologie
Threads
Interruptions
4.1. Topologie de CPU
4.1.1. Topologie des CPU et de NUMA
- Bus sériels
- Topologies NUMA
- Quelle est la topologie du système ?
- Où se trouve l'application actuellement en cours d'exécution ?
- Où se trouve la banque mémoire la plus proche ?
4.1.2. Régler les performances CPU
- Un CPU (de 0 à 3) présente l'adresse mémoire au contrôleur de mémoire local.
- Le contrôleur de mémoire paramètre l'accès à l'adresse mémoire.
- Le CPU effectue des opérations de lecture ou d'écriture sur cette adresse mémoire.
Figure 4.1. Accès local et distant dans la topologie NUMA
- Un CPU (de 0 à 3) présente l'adresse mémoire distante au contrôleur de mémoire local.
- La requête du CPU pour cette adresse mémoire distante est passée à un contrôleur de mémoire distant, local au nœud contenant cette adresse mémoire.
- Le contrôleur de mémoire distant paramètre l'accès à l'adresse mémoire distante.
- Le CPU effectue des opérations de lecture ou d'écriture sur cette adresse mémoire distante.
- la topologie du système (de quelle manière sont connectés ses composants),
- le cœur sur lequel l'application s'exécute et
- l'emplacement de la banque de mémoire la plus proche.
4.1.2.1. Définir les affinités de CPU avec taskset
0x00000001
représente le processeur 0 et 0x00000003
représente les processeurs 0 et 1.
# taskset -p mask pid
# taskset mask -- program
-c
pour fournir une liste séparée par des virgules de différents processeurs, ou une gamme de processeurs, de la manière suivante :
# taskset -c 0,5,7-9 -- myprogram
man taskset
.
4.1.2.2. Contrôler la stratégie NUMA avec numactl
numactl
exécute les processus avec une stratégie d'ordonnancement ou de placement de mémoire spécifiée. La stratégie sélectionnée est définie pour ce processus et tous ses enfants. numactl
peut aussi définir une stratégie persistante pour des segments de mémoire ou des fichiers partagés et les affinités CPU de la mémoire d'un processus. Il utilise le système de fichiers /sys
pour déterminer la topologie du système.
/sys
contient des informations sur la manière par laquelle les CPU, la mémoire et les appareils périphériques sont connectés via des interconnexions NUMA. Plus spécifiquement, le répertoire /sys/devices/system/cpu
contient des informations sur la manière par laquelle les CPU d'un système sont connectés les uns aux autres. Le répertoire /sys/devices/system/node
contient des informations sur les nœuds NUMA dans le système et les distances relatives entre ces nœuds.
--show
- Affiche les paramètres de la stratégie NUMA du processus actuel. Ce paramètre ne requiert pas de paramètres supplémentaires et peut être utilisé comme ceci :
numactl --show
. --hardware
- Affiche un inventaire des nœuds disponibles sur le système.
--membind
- Alloue la mémoire des nœuds spécifiés uniquement. Lorsque ceci est en cours d'utilisation, l'allocation échouera si la mémoire sur ces nœuds est insuffisante. L'utilisation de ce paramètre se fait ainsi :
numactl --membind=nodes program
, où nodes est la liste des nœuds à partir desquels vous souhaitez allouer de la mémoire et program est le programme dont les conditions nécessaires de mémoire devraient être allouées à partir de ce nœud. Le nombre de nœuds peut être donné en tant que liste séparée par des virgules, en tant que gamme, ou avec une combinaison des deux. Des détails supplémentaires sont disponibles sur la page man numactl :man numactl
. --cpunodebind
- Exécute une commande (et ses processus enfants) sur les CPU appartenant au(x) nœud(s) spécifié(s) uniquement. L'utilisation de ce paramètre se fait ainsi :
numactl --cpunodebind=nodes program
, où nodes est la liste des nœuds dont les CPU devraient être liés au programme spécifié (program). Les numéros des nœuds peuvent être donnés en tant que liste séparée par des virgules, en tant que gamme, ou avec une combinaison des deux. Des détails supplémentaires sont disponibles sur la page man numactl :man numactl
. --physcpubind
- Exécute une commande (et ses processus enfants) sur les CPU spécifiés uniquement. L'utilisation de ce paramètre se fait ainsi :
numactl --physcpubind=cpu program
, où cpu est la liste séparée par des virgules des numéros des CPU physiques comme affichés dans les champs du processeur de/proc/cpuinfo
et program est le programme qui doit uniquement effectuer des exécutions sur ces CPU. Les CPU peuvent aussi être spécifiés de manière relative aucpuset
actuel. Veuillez consulter la page man numactl pour obtenir des informations supplémentaires :man numactl
. --localalloc
- Spécifie que la mémoire devrait toujours être allouée sur le nœud actuel.
--preferred
- Lorsque possible, la mémoire est allouée sur le nœud spécifié. Si la mémoire ne peut pas être allouée sur le nœud spécifié, elle le sera sur d'autres nœuds. Cette option prend uniquement un seul numéro de nœud, comme suit :
numactl --preferred=node
. Veuillez consulter la page man numactl pour obtenir des informations supplémentaires :man numactl
.
man numa(3)
.
4.1.3. numastat
Important
numastat
, sans options ni paramètres) maintient une stricte compatibilité avec la version précédente de l'outil, remarquez que fournir des options ou des paramètres à cette commande modifiera le contenu et le format de sa sortie de manière significative.
numastat
affiche combien de pages de mémoire sont occupées par les catégories d'événements suivantes sur chaque nœud.
numa_miss
et numa_foreign
basses.
Catégories de suivi par défaut
- numa_hit
- Nombre d'allocations tentées sur ce nœud ayant réussi.
- numa_miss
- Nombre de tentatives d'allocations sur un autre nœud qui ont été allouées à ce nœud en raison de la faible mémoire sur le nœud souhaité. Chaque événement
numa_miss
possède un événementsnuma_foreign
correspondant sur un autre nœud. - numa_foreign
- Nombre d'allocations initialement souhaitées pour ce nœud qui ont été allouées à un autre nœud. Chaque événement
numa_foreign
possède un événementnuma_miss
correspondant sur un autre nœud. - interleave_hit
- Nombre d'allocations de stratégie d'entrelacement réussies sur ce nœud.
- local_node
- Nombre de fois qu'un processus sur ce nœud a effectivement réussi à allouer de la mémoire sur ce nœud.
- other_node
- Nombre de fois qu'un processus sur un autre nœud a alloué de la mémoire sur ce nœud.
-c
- Condense horizontalement la table d'informations affichée. Ceci est utile sur des systèmes comportant un grand nombre de nœuds NUMA, mais la largeur des colonnes et l'espacement entre colonnes reste quelque peu imprévisible. Lorsque cette option est utilisée, la quantité de mémoire est arrondie au mégaoctet le plus proche.
-m
- Affiche les informations d'utilisation de la mémoire du système global sur une base « par nœud », de manière similaire aux informations trouvées dans
/proc/meminfo
. -n
- Affiche les mêmes informationa que la commande d'origine
numastat
(numa_hit, numa_miss, numa_foreign, interleave_hit, local_node et other_node), avec un format mis à jour utilisant les mégaoctets comme unité de mesure. -p pattern
- Affiche des informations de mémoire par nœud pour le schéma spécifié. Si la valeur de pattern comprend des chiffres, numastat suppose qu'il s'agit un identifiant de processus numérique. Sinon, numastat recherche le schéma spécifié dans les lignes de commande des processus.Les arguments de ligne de commande saisis après la valeur de l'option
-p
sont supposées être des schémas supplémentaires avec lesquels filtrer. Les schémas supplémentaires agrandissent le filtre, plutôt que le réduire. -s
- Arrange les données en ordre descendant de manière à ce que les plus gros consommateurs de mémoire (selon la colonne
total
) soient répertoriés en premier.Optionnellement, vous pouvez spécifier un nœud et le tableau sera ordonné selon la colonne nœuds. Lors de l'utilisation de cette option, la valeur nœud doit suivre l'option-s
immédiatement, comme décrit ici :numastat -s2
N'incluez pas d'espace blanc entre l'option et sa valeur. -v
- Affiche des informations plus détaillées (« verbose information »). C'est-à-dire des informations de processus sur de multiples processus afficheront des informations détaillées sur chaque processus.
-V
- Affiche les informations de version de numastat.
-z
- Omet les lignes et colonnes du tableau ne comportant que la valeur zéro du reste des informations affichées. Remarquez que les valeurs proches de zéro qui sont arrondies à zéro pour des raisons d'affichage ne seront pas omises de la sortie affichée.
4.1.4. numad (« NUMA Affinity Management Daemon »)
/proc
pour contrôler les ressources système disponibles sur une base « par nœud ». Le démon tente ensuite de placer des processus significatifs sur les nœuds NUMA possédant suffisamment de mémoire alignée et de ressources CPU pour des performances NUMA optimales. Les limites actuelles pour la gestion des processus sont d'au moins 50% d'un CPU et au moins 300 Mo de mémoire.numad tente de maintenir un niveau d'utilisation des ressources et ré-équilibre les allocations lorsque nécessaire en déplaçant les processus entre les nœuds NUMA.
-w
pour les conseils pré-placement : man numad
.
4.1.4.1. Bénéfices de numad
4.1.4.2. Modes d'opération
Note
- en tant que service
- en tant qu'exécutable
4.1.4.2.1. Utiliser numad en tant que service
# service numad start
# chkconfig numad on
4.1.4.2.2. Utiliser numad en tant qu'exécutable
# numad
/var/log/numad.log
.
# numad -S 0 -p pid
-p pid
- Ajoute le pid spécifié sur une liste d'inclusions spécifiques. Le processus spécifié ne sera pas géré jusqu'à ce qu'il atteigne la limite d'importance de processus numad.
-S mode
- Le paramètre
-S
spécifie le type de scan de processus. Le définir sur0
comme suit limite la gestion numad aux processus explicitement inclus.
# numad -i 0
man numad
.
4.2. Ordonnancement CPU
- Les stratégies en temps réel
- SCHED_FIFO
- SCHED_RR
- Les stratégies normales
- SCHED_OTHER
- SCHED_BATCH
- SCHED_IDLE
4.2.1. Stratégies d'ordonnancement en temps réel
SCHED_FIFO
- Cette stratégie est aussi appelée ordonnancement à priorité statique car elle définit une priorité fixe (de 1 à 99) pour chaque thread. L'ordonnanceur scanne une liste de threads SCHED_FIFO par ordre de priorité et programme le thread prêt avec la priorité plus élevée pour exécution. Ce thread est exécuté jusqu'à ce qu'il se bloque, qu'il échoue, ou qu'il soit préempté par un thread de plus haute priorité prêt à être exécuté.Même le thread en temps réel avec la plus basse priorité sera programmé avant tout thread possédant une stratégie qui n'est pas en temps réel, s'il n'existe qu'un seul thread en temps réel, la valeur de la priorité
SCHED_FIFO
n'importe pas. SCHED_RR
- Variante round-robin (tourniquet) de la stratégie
SCHED_FIFO
. Les threadsSCHED_RR
se voient aussi donner une priorité fixe entre 1 et 99. Cependant, les threads avec la même priorité sont programmés de manière round-robin (ou comme un tourniquet) avec un certain quantum, ou tranche, de temps. L'appel systèmesched_rr_get_interval(2)
retourne la valeur de la tranche de temps, mais la durée de la tranche de temps ne peut pas être définie par un utilisateur. Cette stratégie est utile si vous avez besoin que de multiples threads soient exécutés avec la même priorité.
SCHED_FIFO
sont exécutés jusqu'à ce qu'il soient bloqués, qu'ils échouent, ou qu'ils soient préemptés par un thread possédant une priorité plus élevée. Ainsi, définir une priorité de 99 n'est pas recommandé, cela placerait votre processus au même niveau de priorité que des threads de migration et de surveillance. Si ces threads sont bloqués parce que votre thread se retrouve dans une boucle de calcul, ils ne pourront pas être exécutés. Les systèmes à monoprocesseur se retrouveront éventuellement dans une telle situation.
SCHED_FIFO
inclut un mécanisme de limite de bande passante. Cela protège les programmeurs d'applications en temps réel des tâches en temps réel qui pourraient monopoliser le CPU. Ce mécanisme peut être ajusté via les paramètres du système de fichiers /proc
suivants :
/proc/sys/kernel/sched_rt_period_us
- Définit la période de temps devant être considérée comme cent pour cent de la bande passante du CPU, en microsecondes (« us » est le plus proche équivalent de « µs » en texte brut). La valeur par défaut est 1000000µs, ou 1 seconde.
/proc/sys/kernel/sched_rt_runtime_us
- Définit la période de temps devant être dévouée à l'exécution de threads en temps réel, en microsecondes (« us » est le plus proche équivalent de « µs » en texte brut). La valeur par défaut est 950000µs, ou 0.95 secondes.
4.2.2. Stratégies d'ordonnancement normal
SCHED_OTHER
, SCHED_BATCH
et SCHED_IDLE
. Cependant, les stratégies SCHED_BATCH
et SCHED_IDLE
, conçues pour des tâches à très basse priorité, ne présentent qu'un intérêt limité dans un guide de réglage des performances.
SCHED_OTHER
, ouSCHED_NORMAL
- Stratégie d'ordonnancement par défaut. Cette stratégie utilise l'ordonnanceur CFS (de l'anglais « Completely Fair Scheduler », ordonnanceur complètement équitable) afin de fournir des périodes d'accès équitables à tous les threads utilisant cette stratégie. CFS établit une liste de priorités dynamiques, en partie basée sur la valeur
niceness
de chaque thread de processus. (Reportez-vous au Guide de déploiement pour obtenir des détails sur ce paramètre et sur le système de fichiers/proc
.) Cela offre aux utilisateurs un certain niveau de contrôle indirect sur les priorités des processus, mais la liste des priorités dynamiques peut uniquement être directement modifiée par l'ordonnanceur CFS.
4.2.3. Sélection de la stratégie
SCHED_OTHER
et laissez le système gérer l'utilisation du CPU à votre place.
SCHED_FIFO
. Si vous possédez un petit nombre de threads, considérez la possibilité d'isoler un socket du CPU et de déplacer vos threads sur les cœurs de ce socket afin qu'aucun autre thread ne se mette en compétition pour du temps sur les cœurs.
4.3. Réglages des interruptions et des IRQ
/proc/interrupts
répertorie le nombre d'interruptions par CPU par périphérique d'E/S. Il affiche le numéro de l'IRQ, le numéro de cette interruption géré par chaque cœur de CPU, le type d'interruption et une liste séparée par des virgules des pilotes enregistrés pour recevoir cette interruption. (Pour obtenir des détailes supplémentaires, reportez-vous à la page man proc(5) : man 5 proc
)
smp_affinity
, qui définit les cœurs des CPU autorisés à exécuter l'ISR pour cette IRQ. Cette propriété peut être utilisée pour améliorer les performances de l'application en assignant l'affinité de l'interruption et celle du thread de l'application vers un ou plusieurs cœurs de CPU spécifiques. Ceci permet le partage de ligne de cache entre l'interruption spécifiée et les threads de l'application.
/proc/irq/NUMÉRO_IRQ/smp_affinity
, qui peut être affiché et modifié par l'utilisateur root. La valeur stockée dans ce fichier est un masque de bits représentant tous les cœurs des CPU dans le système.
# grep eth0 /proc/interrupts 32: 0 140 45 850264 PCI-MSI-edge eth0
smp_affinity
approprié :
# cat /proc/irq/32/smp_affinity f
f
, ce qui signifie que l'IRQ peut être servie sur n'importe quel CPU dans le système. Définir cette valeur sur 1
comme suit signifie que seul CPU 0 peut servir cette interruption :
# echo 1 >/proc/irq/32/smp_affinity # cat /proc/irq/32/smp_affinity 1
smp_affinity
pour des groupes discrets de 32 bits. Ceci est requis sur les systèmes avec polus de 32 cœurs. Par exemple, l'exemple suivant montre que l'IRQ 40 est servie sur tous les cœurs d'un système de 64 cœurs :
# cat /proc/irq/40/smp_affinity ffffffff,ffffffff
# echo 0xffffffff,00000000 > /proc/irq/40/smp_affinity # cat /proc/irq/40/smp_affinity ffffffff,00000000
Note
smp_affinity
d'une IRQ paramètre le matériel de manière à ce que la décision de servir une interruption avec un CPU en particulier soit prise au niveau du matériel, sans intervention de la part du noyau.
4.4. Améliorations de NUMA Red Hat Enterprise Linux 6
4.4.1. Optimisation de l'évolutivité et du bare-metal
4.4.1.1. Améliorations de la conscience de la topologie
- détection de topologie améliorée
- Ceci permet au système d'exploitation de détecter les détails du matériel de bas niveau (comme les CPU logiques, les hyper threads, les cœurs, sockets, nœuds NUMA et le temps d'accès entre les nœuds) au démarrage et d'optimiser le traitement sur votre système.
- completely fair scheduler (ordonnanceur complètement équitable)
- Ce nouveau mode de planification assure que le runtime est partagé de manière équitable entre les processus éligibles. Combiner celui-ci à la détection de topologie permet aux processus d'être planifiés sur des CPU dans le même socket afin d'éviter de développer le besoin d'un accès mémoire distant coûteux et d'assurer que le contenu du cache soit préservé lorsque possible.
malloc
malloc
est maintenant optimisé pour assurer que les régions de la mémoire qui sont allouées à un processus soient physiquement aussi proches que possible du cœur sur lequel le processus est en cours d'exécution. Ceci augmente la vitesse d'accès mémoire.- allocation du tampon d'E/S skbuff
- De la même manière que
malloc
, ceci est maintenant optimisé de manière à utiliser la mémoire qui est physiquement proche des opérations d'E/S de gestion de CPU, comme les interruptions de périphériques. - affinités des interruptions de périphériques
- Informations enregistrées par des pilotes de périphérique sur quels identificateurs de CPU effectuant des interruptions peuvent être utilisés pour restreindre la gestion des interruptions à des CPU situés dans le même socket physique, préservant les affinités du cache et limitant les communications haut volume à travers les sockets.
4.4.1.2. Améliorations de la synchronisation de multiples processeurs
- Verrous RCU (« Read-Copy-Update »)
- Habituellement, 90% des verrous sont acquis à des fins de lecture-seule.Le verrouillage RCU supprime le besoin d'obtenir un verrou d'accès exclusif lorsque les données accédées ne sont pas modifiées. Ce mode de verrouillage est maintenant utilisé dans l'allocation de mémoire du cache de page : le verrouillage est uniquement utilisé pour les opérations d'allocation ou de dés-allocation.
- Algorithmes « par CPU » et « par socket »
- De nombreux algorithmes ont été mis à jour pour réaliser une coordination des verrous parmi les CPU coopérant sur le même socket afin de permettre un meilleur verrouillage à grains fins. De nombreux verrous tournants globaux ont été remplacés par des méthodes de verrouillage « par socket » et la mise à jour des zones de l'allocateur de mémoire et des listes de pages mémoire liées permettent à la logique de l'allocation de mémoire de traverser un sous-ensemble des structures de données mappant la mémoire plus efficace lors des opérations d'allocation et de dés-allocation.
4.4.2. Optimisation de la virtualisation
- CPU pinning
- Les invités virtuels peuvent être tenus de s'exécuter sur un socket en particulier afin d'optimiser l'utilisation du cache local et de supprimer le besoin d'effectuer de coûteuses communications inter-sockets et d'effectuer des accès mémoire distants.
- transparent hugepages (THP)
- Lorsque THP est activé, le système effectue automatiquement des requêtes d'allocation de mémoire conscientes de NUMA pour des quantités de mémoire de grande taille, réduisant la contention de verrous et le nombre d'opérations de gestion de mémoire TLB (« Translation Lookaside Buffer ») requises et générant une augmentation des performances allant jusqu'à 20% quant aux invités virtuels.
- Implémentation des E/S basées sur le noyau
- Le sous-système des E/S de l'invité virtuel est maintenant implémenté dans le noyau, réduisant fortement le coût des communications inter-nœuds et des accès mémoire en évitant une quantité importante de basculements de contextes et de surcharges de la synchronisation et des communications.
Chapitre 5. Mémoire
5.1. HugeTLB (« Huge Translation Lookaside Buffer »)
/usr/share/doc/kernel-doc-version/Documentation/vm/hugetlbpage.txt
5.2. « Huge Pages » et « Transparent Huge Pages »
- Augmenter le nombre d'entrées de tables de pages dans l'unité de gestion de mémoire du matériel
- Augmenter la taille de page
5.3. Utiliser Valgrind pour établir un profil de l'utilisation de mémoire
valgrind --tool=toolname program
memcheck
, massif
, ou cachegrind
) et program par le programme que vous souhaitez profiler avec Valgrind. Soyez conscient que l'instrumentation de Valgrind causera à votre programme de fonctionner plus lentement que normalement.
man valgrind
lorsque le paquetage valgrind est installé ou trouvé dans les emplacements suivants :
/usr/share/doc/valgrind-version/valgrind_manual.pdf
, et/usr/share/doc/valgrind-version/html/index.html
.
5.3.1. Profiler l'utilisation de mémoire avec Memcheck
valgrind program
, sans spécifier --tool=memcheck
. Il détecte et rapporte un certain nombre d'erreurs de mémoire pouvant être difficiles à détecter et diagnostiquer, comme les accès mémoire qui n'auraient pas dû se produire, l'utilisation de valeurs non-définies ou non-initialisées, la libération incorrecte de la mémoire du tas, les pointeurs superposés et les fuites de mémoire. Avec Memcheck, les programmes fonctionnent dix à trente fois plus lentement que normalement.
/usr/share/doc/valgrind-version/valgrind_manual.pdf
.
--leak-check
- Lorsque activé, Memcheck recherches des fuites de mémoire quand le programme client se termine. La valeur par défaut est
summary
(sommaire), ce qui retourne le nombre de fuites découvertes. Les autres valeurs possibles sontyes
(oui) etfull
(plein), qui offrent toutes deux des détails sur chaque fuite individuelle etno
(non), qui désactive la vérification de fuites de mémoire. --undef-value-errors
- Quand activé (définit sur
yes
), Memcheck rapporte des erreurs lorsque des valeurs non-définies sont utilisées. Quand désactivé (définit surno
), les erreurs de valeurs non-définies ne sont pas rapportées. Cette option est activée par défaut. La désactiver accélère légèrement Memcheck. --ignore-ranges
- Permet à l'utilisateur de spécifier une ou plusieurs gammes que Memcheck devrait ignorer lors de la vérification de l'adressage. De multiples gammes sont délimitées par des virgules. Par exemple,
--ignore-ranges=0xPP-0xQQ,0xRR-0xSS
.
/usr/share/doc/valgrind-version/valgrind_manual.pdf
.
5.3.2. Profiler l'utilisation du cache avec Cachegrind
# valgrind --tool=cachegrind program
- lectures du cache des instructions de premier niveau (ou instructions exécutées) et échecs de lecture, ainsi que les échecs de lecture des instructions du cache du dernier niveau ;
- lectures du cache de données (ou lectures de mémoire), échecs des lectures et échecs des lectures de données du cache du dernier niveau ;
- écritures du cache de données (ou écritures de mémoire), échecs des écritures et échecs des écritures du cache du dernier niveau ;
- branches conditionnelles exécutées et mal prédites ;
- branches indirectes exécutées et mal prédites.
cachegrind.out.pid
, où pid est l'ID de processus du programme sur lequel vous avez exécuté Cachegrind). Ce fichier peut encore être traité par l'outil accompagnateur cg_annotate, ainsi :
# cg_annotate cachegrind.out.pid
Note
# cg_diff first second
--I1
- Spécifie la taille, l'associativité et la taille de ligne du cache d'instructions du premier niveau, séparé par des virgules :
--I1=size,associativity,line size
. --D1
- Spécifie la taille, l'associativité et la taille de ligne du cache de données du premier niveau, séparé par des virgules :
--D1=size,associativity,line size
. --LL
- Spécifie la taille, l'associativité et la taille de ligne du cache du dernier niveau, séparé par des virgules :
--LL=size,associativity,line size
. --cache-sim
- Active ou désactive la collection des accès au cache et du compte des échecs. La valeur par défaut est
yes
(activé).Remarquez que désactiver cette option ainsi que--branch-sim
laisse Cachegrind sans la moindre information à collecter. --branch-sim
- Active ou désactive la collection des instructions de branches et du compte des mauvaises prédictions. Cette option est définie sur
no
(désactivé) par défaut car elle ralentit Cachegrind d'environ 25 pour cent.Remarquez que désactiver cette option ainsi que--cache-sim
laisse Cachegrind sans la moindre information à collecter.
/usr/share/doc/valgrind-version/valgrind_manual.pdf
.
5.3.3. Profiler les espaces du tas et de pile avec Massif
massif
comme l'outil Valgrind que vous souhaitez utiliser :
# valgrind --tool=massif programme
massif.out.pid
, où pid est l'ID de processus du programme spécifié.
ms_print
, ainsi :
# ms_print massif.out.pid
--heap
- Spécifie s'il faut effectuer le profilage du tas. La valeur par défaut est
yes
(oui). Le profilage du tas peut être désactivé en définissant cette option surno
(non). --heap-admin
- Spécifie le nombre d'octets par bloc à utiliser pour l'administration lorsque le profilage du tas est activé. La valeur par défaut est de
8
octets par bloc. --stacks
- Spécifie s'il faut effectuer le profilage de la pile. La valeur par défaut est
no
(désactivé). Pour activer le profilage de la pile, définissez cette option suryes
, mais n'oubliez pas que cela va fortement ralentir Massif. Remarquez aussi que Massif suppose que la pile principale a une taille de zéro au démarrage afin de mieux indiquer la taille de la portion de la pile sur laquelle le programme en cours de profilage est en contrôle. --time-unit
- Spécifie l'unité de temps utilisée pour le profilage. Il existe trois valeurs valides pour cette option : les instructions exécutées (
i
), la valeur par défaut, qui est utile dans la plupart des cas ; le temps réel (ms
, en millisecondes), qui peut être utile dans certains cas ; et les octets alloués ou dés-alloués sur le tas et/ou sur la pile (B
), ce qui est utile pour des programmes exécutés de manière très rapide et pour effectuer des tests, car ceux-ci sont les plus facilement reproductibles sur différentes machines. Cette option est utile lors de l'impression du graphe de la sortie de Massif avecms_print
.
/usr/share/doc/valgrind-version/valgrind_manual.pdf
.
5.4. Réglage des capacités
overcommit_memory
temporairement sur 1
, exécutez :
# echo 1 > /proc/sys/vm/overcommit_memory
sysctl
. Pour obtenir des détails supplémentaires, veuillez consulter le Guide de déploiement, disponible sur http://access.redhat.com/site/documentation/Red_Hat_Enterprise_Linux/.
Réglages de mémoire liés aux capacités
/proc/sys/vm/
, dans le système de fichiers proc.
overcommit_memory
- Définit les conditions déterminant si une requête mémoire de grande taille est acceptée ou non. Trois valeurs sont possibles pour ce paramètre :
0
— Paramètre par défaut. Le noyau effectue la gestion de l'« overcommit » de mémoire heuristique en estimant la quantité de mémoire disponible et en refusant les requêtes qui sont manifestement invalides. Malheureusement, comme la mémoire est allouée avec une heuristique plutôt qu'avec un algorithme précis, ce paramètre peut parfois autoriser la surcharge de la mémoire disponible sur le système.1
— Le noyau n'effectue pas la gestion de l'« overcommit » de la mémoire. Sous ce paramètre, le potentiel pour la surcharge de la mémoire est augmenté, mais les performances aussi pour les tâches demandant beaucoup de mémoire.2
— Le noyau refuse les requêtes de mémoire supérieures ou égales à la somme du total de l'espace swap disponible et du pourcentage de RAM physique spécifié dansovercommit_ratio
. Ce paramètre est le meilleur si vous souhaitez réduire le risque d'« overcommit » de mémoire.Note
Ce paramètre est uniquement recommandé pour les systèmes avec des zones swap de plus grande taille que leur mémoire physique.
overcommit_ratio
- Spécifie le pourcentage de RAM physique considérée lorsque
overcommit_memory
est paramétré sur2
. La valeur par défaut est50
. max_map_count
- Définit le nombre maximal de zones de cartes mémoires qu'un processus peut utiliser. Dans la plupart des cas, la valeur par défaut
65530
est appropriée. Augmentez cette valeur si votre application doit cartographier plus que ce nombre de fichiers. nr_hugepages
- Définit le nombre de hugepages configurées dans le noyau. La valeur par défaut est 0. Il est uniquement possible d'allouer (ou de dés-allouer) des hugepages si suffisamment de pages libres physiquement contiguës se trouvent dans le système. Les pages réservées par ce paramètre ne peuvent pas être utilisées à d'autres fins. Des informations supplémentaires sont disponibles dans la documentation installée :
/usr/share/doc/kernel-doc-kernel_version/Documentation/vm/hugetlbpage.txt
Réglages noyau liés aux capacités
/proc/sys/kernel/
, dans le système de fichiers proc.
msgmax
- Définit la taille maximale autorisée en octets de tout message unique dans une file d'attente de messages. Cette valeur ne doit pas excéder la taille de la file (
msgmnb
). La valeur par défaut est65536
. msgmnb
- Définit la taille maximale en octets d'une seule file d'attente de messages. La valeur par défaut est
65536
. msgmni
- Définit le nombre maximal d'identifiants de files d'attente de messages (et donc le nombre maximal de files). La valeur par défaut sur les machines avec une architecture 64 bits est
1985
; pour les architectures 32 bits, la valeur par défaut est de1736
. shmall
- Définit la quantité totale en octets de mémoire partagée pouvant être utilisée sur le système à la fois. La valeur par défaut pour les machines avec une architecture de 64 bits est de
4294967296
; pour les architectures de 32 bits, la valeur est de268435456
. shmmax
- Définit le segment de mémoire partagée maximal autorisé par le noyau, en octets. La valeur par défaut sur les machines avec une architecture de 64 bits est
68719476736
; avec une architecture de 32 bits, la valeur par défaut est4294967295
. Remarquez cependant que le noyau prend en charge des valeurs bien plus élevées que celles-ci. shmmni
- Définit le nombre de segments de mémoire partagée maximal sur tout le système. La valeur par défaut est
4096
sur les architectures 32 et 64 bits. threads-max
- Définit le nombre maximal sur tout le système de threads (tâches) pouvant être utilisés par le noyau à la fois. La valeur par défaut est égale à la valeur
max_threads
du noyau. La formule utilisée est :max_threads = mempages / (8 * THREAD_SIZE / PAGE_SIZE )
La valeur minimale dethreads-max
est20
.
Réglages des systèmes de fichiers liés aux capacités
/proc/sys/fs/
, dans le système de fichiers proc.
aio-max-nr
- Définit le nombre maximal d'événements autorisés dans tous les contextes d'E/S asynchrones actifs. La valeur par défaut est
65536
. Remarquez que modifier cette valeur ne pré-allouera ou ne redimmensionnera aucune structure de données du noyau. file-max
- Répertorie le nombre maximal de gestionnaires de fichiers que le noyau alloue. La valeur par défaut correspond à la valeur de
files_stat.max_files
dans le noyau, qui est défini sur la valeur la plus élevée de(mempages * (PAGE_SIZE / 1024)) / 10
, ouNR_FILE
(8192 dans Red Hat Enterprise Linux). Augmenter cette valeur peut résoudre des erreurs causées par un manque de gestionnaires de fichiers disponibles.
Réglages « Kill » OOM
/proc/sys/vm/panic_on_oom
sur 0
instruit au noyau d'appeler la fonction oom_killer
lorsque se produit une saturation de mémoire OOM . Normalement, oom_killer
peut interrompre les processus et le système survit.
oom_killer
. Il se trouve sous /proc/pid/
dans le système de fichiers proc, où pid est le numéro d'ID du processus.
oom_adj
- Définit une valeur de
-16
à15
qui aide à déterminer l'oom_score
d'un processus. Plus la valeur deoom_score
est élevée, plus il est possible que le processus sera interrompu paroom_killer
. Définir une valeuroom_adj
de-17
désactiveraoom_killer
pour ce processus.Important
Tout processus engendré par un processus ajusté héritera de la valeuroom_score
de ce processus. Par exemple, si un processussshd
est protégé par la fonctionoom_killer
, tous les processus initiés par cette session SSH seront aussi protégés. Ceci peut affecter la capacité de la fonctionoom_killer
à sauver le système si une saturation de mémoire OOM se produit.
5.5. Réglages de la mémoire virtuelle
swappiness
- Une valeur de 0 à 100 qui contrôle le degré auquel le système effectue des swaps. Une valeur élevée donnera la priorité aux performances du système, effectuant des swaps de manière agressive pour pousser les processus hors de la mémoire physique lorsqu'ils ne sont pas actifs. Une valeur faible donne priorité à l'interactivité et évite de swapper les processus hors de la mémoire physique aussi longtemps que possible, ce qui réduit la latence des réponses. La valeur par défaut est
60
. min_free_kbytes
- Nombre minimum de kilooctets à garder libres à travers le système. Cette valeur est utilisée pour calculer une valeur limite pour chaque zone de mémoire basse, celles-ci se voient ensuite assigner un nombre de pages libres réservées proportionnel à leur taille.
Avertissement
Soyez prudent lorsque vous définissez ce paramètre, car des valeurs trop élevées ou trop basses peuvent endommager le système.Définir le paramètremin_free_kbytes
trop bas empêche le système de réclamer de la mémoire. Ceci peut résulter en la suspension du système et l'interruption pour cause de mémoire saturée de multiples processus.Cependant, définir ce paramètre sur une valeur trop élevée (5 à 10% de la mémoire système totale) causera à votre système de se retrouver avec une mémoire saturée immédiatement. Linux est désigné pour utiliser toute la mémoire vive disponible pour mettre en cache les données de système de fichiers. Définir une valeurmin_free_kbytes
élevée fera dépenser au système trop de temps à réclamer de la mémoire. dirty_ratio
- Définit une valeur de pourcentage. La réécriture des données modifiées débutera (via pdflush) lorsque les données modifiées comprendront ce pourcentage de mémoire système totale. La valeur par défaut est de
20
. dirty_background_ratio
- Définit une valeur de pourcentage. La réécriture des données modifiées débutera dans l'arrière-plan (via pdflush) lorsque les données modifiées comprendront ce pourcentage de mémoire totale. La valeur par défaut est de
10
. drop_caches
- Définir cette valeur sur
1
,2
, ou3
cause au noyau d'abandonner diverses combinaisons de caches de pages et de caches de dalles.- 1
- Le système effectue une invalidation et libère toute la mémoire du cache des pages.
- 2
- Le système libère toute la mémoire du cache de dalle non-utilisée.
- 3
- Le système libère toute la mémoire du cache de pages et du cache de dalle.
Ceci est une opération non-destructive. Comme les objets modifiés ne peuvent pas être libérés, exécutersync
avant de définir la valeur de ce paramètre est recommandé.Important
Utiliserdrop_caches
pour libérer la mémoire n'est pas recommandé dans un environnement de production.
swappiness
temporairement sur 50
, veuillez exécuter :
# echo 50 > /proc/sys/vm/swappiness
sysctl
. Pour obtenir davantage d'informations, veuillez consulter le Guide de déploiement, disponible sur http://access.redhat.com/site/documentation/Red_Hat_Enterprise_Linux/.
Chapitre 6. Entrées/Sorties
6.1. Fonctionnalités
- Les disques SSD sont maintenant officiellement reconnus automatiquement et les performances de l'ordonnanceur d'E/S sont réglées pour tirer profit du haut niveau d'E/S par secondes (« IOPS ») que ces périphériques peuvent effectuer.
- La prise en charge de l'annulation a été ajoutée au noyau pour signaler les gammes de blocs inutilisées au stockage sous-jacent. Ceci aide les disques SSD avec leurs algorithmes d'égalisation de l'usure. Cela aide aussi le stockage qui prend en charge l'approvisionnement des blocs logiques (une sorte d'espace d'adresse virtuelle pour le stockage) en suivant de plus près la quantité réelle de stockage en cours d'utilisation.
- L'implémentation de la barrière du système de fichiers a été révisée dans Red Hat Enterprise Linux 6.1 afin de la rendre plus performante.
pdflush
a été remplacé par des threads de vidage « par périphérique de sauvegarde », qui améliorent grandement l'évolutivité du système sur des configurations avec un nombre important de LUN.
6.2. Analyse
Figure 6.1. Sortie aio-stress pour 1 thread, 1 fichier
- aio-stress
- iozone
- fio
6.3. Outils
si
(swap in), so
(swap out), bi
(block in), bo
(block out) et wa
(temps d'attente des E/S). si
et so
sont utiles lorsque votre espace swap est situé sur le même périphérique que la partition de vos données et sont un indicateur de la pression mémoire générale. si
et bi
sont des opérations de lecture, tandis que so
et bo
sont des opérations d'écriture. Chacune de ces catégories est rapportée en kilo-octets. wa
est le temps d'inactivité, il indique quelle portion de la file d'attente d'exécution est bloquée, en train d'attendre que les E/S soient terminées.
free
, buff
et cache
. L'augmentation de la valeur cache
aux côtés de la valeur bo
, suivie par une baisse de cache
et une augmentation de free
indique que le système est en train d'effectuer une ré-écriture et une invalidation du cache de la page.
avgqu-sz
), vous pourrez effectuer quelques estimations sur la manière par laquelle le stockage devrait fonctionner en utilisant les graphes générés lors de la caractérisation des performances de votre stockage. Certaines généralisations s'appliquent, par exemple : si la taille de requête moyenne est de 4 Ko et que la taille de file d'attente moyenne est de 1, il est improbable que le débit soit très performant.
8,64 3 1 0.000000000 4162 Q RM 73992 + 8 [fs_mark] 8,64 3 0 0.000012707 0 m N cfq4162S / alloced 8,64 3 2 0.000013433 4162 G RM 73992 + 8 [fs_mark] 8,64 3 3 0.000015813 4162 P N [fs_mark] 8,64 3 4 0.000017347 4162 I R 73992 + 8 [fs_mark] 8,64 3 0 0.000018632 0 m N cfq4162S / insert_request 8,64 3 0 0.000019655 0 m N cfq4162S / add_to_rr 8,64 3 0 0.000021945 0 m N cfq4162S / idle=0 8,64 3 5 0.000023460 4162 U N [fs_mark] 1 8,64 3 0 0.000025761 0 m N cfq workload slice:300 8,64 3 0 0.000027137 0 m N cfq4162S / set_active wl_prio:0 wl_type:2 8,64 3 0 0.000028588 0 m N cfq4162S / fifo=(null) 8,64 3 0 0.000029468 0 m N cfq4162S / dispatch_insert 8,64 3 0 0.000031359 0 m N cfq4162S / dispatched a request 8,64 3 0 0.000032306 0 m N cfq4162S / activate rq, drv=1 8,64 3 6 0.000032735 4162 D R 73992 + 8 [fs_mark] 8,64 1 1 0.004276637 0 C R 73992 + 8 [0]
Total (sde): Reads Queued: 19, 76KiB Writes Queued: 142,183, 568,732KiB Read Dispatches: 19, 76KiB Write Dispatches: 25,440, 568,732KiB Reads Requeued: 0 Writes Requeued: 125 Reads Completed: 19, 76KiB Writes Completed: 25,315, 568,732KiB Read Merges: 0, 0KiB Write Merges: 116,868, 467,472KiB IO unplugs: 20,087 Timer unplugs: 0
- Q — une E/S de bloc est en attente
- G — obtenir une requêteUne nouvelle E/S de bloc en file d'attente n'était pas candidate pour une fusion avec toute requête existante, ainsi une requête pour une nouvelle couche de bloc est allouée.
- M — une E/S de bloc est fusionnée avec une requête existante.
- I — Une requête est insérée dans la file d'attente du périphérique.
- D — Une requête est délivrée au périphérique.
- C — Une requête est complétée par le pilote.
- P — La file d'attente du périphérique bloc est branchée (« Plugged ») afin d'autoriser l'agrégation des requêtes.
- U — La file d'attente du périphérique est débranchée (« Unplugged »), autorisant ainsi aux requêtes agrégées d'être délivrées au périphérique.
- Q2Q — temps écoulé entre les requêtes envoyées à la couche du bloc.
- Q2G — temps écoulé entre le moment où une E/S de bloc est mise en file d'attente et le moment où une requête y est allouée.
- G2I — temps écoulé entre le moment où une requête est allouée et le moment où elle est insérée à la file d'attente du périphérique.
- Q2M — temps écoulé entre le moment où une E/S de bloc est mise en file d'attente et le moment où elle est fusionnée avec une requête existante.
- I2D — temps écoulé entre le moment où une requête est insérée à la file d'attente du périphérique et le moment où elle est réellement délivrée au périphérique.
- M2D — temps écoulé à partir du moment où une E/S de bloc est fusionnée avec une requête sortante jusqu'au moment où la requête est délivrée au périphérique
- D2C — temps de service de la requête par le périphérique.
- Q2C — temps total écoulé dans la couche du bloc par une requête.
Figure 6.2. Exemple de sortie de « seekwatcher »
6.4. Configuration
6.4.1. CFQ (« Completely Fair Queuing »)
ionice
, ou assignée de manière programmée via l'appel système ioprio_set
. Par défaut, les processus sont placés dans la classe de programmation BE. Les classes de programmation RT et BE sont ensuite sous-divisées en huit priorités d'E/S dans chaque classe, la priorité 0 est la plus élevée et la priorité 7 est la plus basse. Les processus dans la classe RT sont programmés de manière bien plus agressive que les processus dans BE ou dans « idle », ainsi toute E/S RT programmée est effectuée avant les E/S BE ou « idle ». Cela signifie que les E/S de priorité RT peuvent dépasser les E/S BE et « idle ». La programmation BE est la classe de programmation par défaut et 4 est la priorité par défaut dans cette classe. Les processus dans la classe de programmation « idle » sont uniquement traités lorsqu'il ne reste aucune autre E/S en attente dans le système. Ainsi, il est très important de définir la classe de programmation des E/S d'un processus sur « idle » uniquement si les E/S du processus ne sont pas du tout requises pour progresser.
/sys/block/périphérique/queue/iosched/
:
slice_idle = 0 quantum = 64 group_idle = 1
group_idle
est défini sur 1, il peut tout de même se produire des ralentissements d'E/S (ainsi le stockage principal n'est pas occupé à cause de la mise en veille). Cependant, ces ralentissements seront moins fréquents que les mises en veille sur chaque file d'attente dans le système.
Réglages
back_seek_max
- Les recherches en arrière sont habituellement mauvaise pour la performance car elles provoquent de plus grands délais dans le repositionnement des têtes que les recherches en avant. Cependant, CFQ les effectuera quand même si elles sont assez petites. Ce réglage contrôle la distance maximale en Ko que l'ordonnanceur autorise en recherche arrière. La valeur par défaut est
16
Ko. back_seek_penalty
- À cause de l'inefficacité des recherches en arrières, une pénalité est associée à chacune d'entre elles. La pénalité est un multiplicateur ; par exemple, prenez en considération une position de tête de disque sur 1024 Ko. Supposez qu'il y a deux requêtes dans la file d'attente, une sur 1008 Ko et une autre sur 1040 Ko. Les deux requêtes sont équidistantes par rapport à la position actuelle de la tête. Cependant, après avoir appliqué la pénalité de la recherche en arrière (par défaut : 2), la requête sur la position suivante du disque est maintenant deux fois plus proche que la requête précédente. Ainsi, la tête pourra avancer.
fifo_expire_async
- Ce réglage contrôle combien de temps une requête async (écriture en mémoire tampon) peut rester sans être effectuée. Une fois le délai d'expiration (en millisecondes) dépassé, une seule requête async manquant de temps sera déplacée sur la liste d'expédition. La valeur par défaut est de
250
ms. fifo_expire_sync
- Ce réglage est le même que fifo_expire_async, mais pour les requêtes synchronisées (lectures et écritures O_DIRECT). La valeur par défaut est de
125
ms. group_idle
- Lorsqu'il est défini, CFQ deviendra inactif sur le dernier processus délivrant une E/S dans un cgroup. Il devrait être défini sur
1
lorsque des cgroups d'E/S de poids proportionnels sont utilisés et queslice_idle
est défini sur0
(ce qui est habituellement le cas sur les stockages rapides). group_isolation
- Si l'isolation de groupes est activée (définie sur
1
), elle fournit une meilleure isolation entre les groupes, au détriment du débit. Généralement, si l'isolation de groupes est désactivée, une certaine équité est offerte aux charges de travail séquentielles uniquement. L'activation de l'isolation de groupes offre une équité pour les charges de travail séquentielles et aléatoires. La valeur par défaut est0
(désactivé). Veuillez consulterDocumentation/cgroups/blkio-controller.txt
pour obtenir davantage d'informations. low_latency
- Lorsque « low latency » (latence basse) est activé (défini sur
1
), CFQ tente de fournir un temps d'attente maximal de 300 ms pour chaque processus délivrant des E/S sur un périphérique. Ceci facilite l'établissement d'une certaine équité avec le débit. La désactivation de « low latency » (en paramétrant sur0
) ignore la latence cible, permettant à chaque processus dans le système d'obtenir une tranche complète. « Low latency » est activé par défaut. quantum
- Quantum contrôle le nombre d'E/S que CFQ enverra au stockage à la fois, principalement limitant la profondeur de la file d'attente du périphérique. Par défaut, ceci est défini sur
8
. Le stockage peut supporter des files d'attente bien plus profondes, mais l'augmentation dequantum
aura aussi un impact négatif sur la latence, particulièrement en présence de charges de travail d'écriture séquentielles de grande taille. slice_async
- Ce réglage contrôle la tranche de temps allouée à chaque processus délivrant des E/S asynchrones (écritures en mémoire-tampon). Il est défini par défaut sur
40
ms. slice_idle
- Ceci spécifie combien de temps CFQ restera en veille en attente de requêtes supplémentaires. La valeur par défaut sur Red Hat Enterprise Linux 6.1 et ses versions précédentes est
8
ms. Sur Red Hat Enterprise Linux 6.2 et ses versions supérieures, la valeur par défaut est0
. La valeur zéro améliore la débit d'un stockage RAID externe en supprimant tout ce qui est en veille aux niveaux de la file d'attente et de l'arborescence des services. Cependant, une valeur de zéro peut dégrader le débit sur un stockage non-RAID interne, car elle augmente le nombre général de recherches. Pour un stockage non-RAID, nous recommandons une valeurslice_idle
plus élevée que 0. slice_sync
- Ce réglage dicte la tranche de temps allouée à un processus délivrant des E/S synchrones (lecture ou écriture directe). La valeur par défaut est de
100
ms.
6.4.2. Programmateur d'E/S « Deadline »
Réglages
fifo_batch
- Ceci détermine le nombre de lectures ou écritures à délivrer en un seul lot. La valeur par défaut est de
16
. Définir une valeur plus élevée peut améliorer le débit, mais cela augmentera aussi la latence. front_merges
- Vous pouvez définir ce réglage sur
0
si vous savez que votre charge de travail ne générera jamais de fusions frontales. À moins d'avoir mesuré l'en-tête de cette vérification, il est conseillé de la laisser avec son paramètre par défaut (1
). read_expire
- Ce réglage vous permet de définir le nombre de millisecondes pour qu'une requête de lecture soit traitée. Par défaut, ce nombre est défini sur
500
ms (une demi-seconde). write_expire
- Ce réglage vous permet de définir le nombre de millisecondes pour qu'une requête d'écriture soit traitée. Par défaut, ce nombre est défini sur
5000
ms ( cinq secondes). writes_starved
- Ce réglage contrôle combien de lots de lecture peuvent être traités avant qu'un seul lot d'écriture ne puisse être traité. Plus cette valeur est élevée, plus la préférence sera donnée aux lectures.
6.4.3. Noop
réglages /sys/block/sdX/queue
- add_random
- Dans certains cas, l'en-tête des événements d'E/S contribuant au pool d'entropie de
/dev/random
est mesurable. Dans certains cas, il peut être désirable de définir cette valeur sur 0. max_sectors_kb
- Par défaut, la taille de requête maximale envoyée sur disque est de
512
Ko. Ce réglage peut être utilisé pour élever ou abaisser cette valeur. La valeur minimale est limitée par la taille du bloc logique ; la valeur maximale est limitée parmax_hw_sectors_kb
. Il existe des disques SSD qui fonctionnent moins bien lorsque la taille des E/S dépasse la taille des blocs de suppression internes. Dans ces cas, il est recommandé de réglermax_hw_sectors_kb
vers le bas afin de correspondre avec la taille du bloc de suppression. Vous pouvez effectuer des tests à l'aide d'un générateur d'E/S tel que iozone ou aio-stress ; par exemple, en variant la taille d'enregistrement de512
octets à1
Mo. nomerges
- Ce réglage est principalement une aide au débogage. La plupart des charges de travail bénéficient des fusions de requêtes (même sur des stockages plus rapides, comme les SSD). Cependant, dans certains cas, il est préférable de désactiver la fusion, comme lorsque vous souhaitez voir combien d'IOPS (E/S par seconde) un backend de stockage peut traiter sans désactiver la lecture à l'avance ou sans effectuer d'E/S aléatoires.
nr_requests
- Chaque file d'attente de requêtes possède une limite du nombre total de descripteurs de requêtes pouvant être alloués à chaque E/S de lecture et d'écriture. Par défaut, ce nombre est
128
, ce qui signifie que 128 lectures et 128 écritures peuvent être mises en file d'attente à la fois avant de mettre un processus en veille. Le processus mis en veille sera le suivant à essayer d'allouer une requête et pas nécessairement le processus ayant alloué toutes les requêtes disponibles.Si vous possédez une application sensible à la latence, alors vous devriez considérer les possibilités d'abaisser la valeur denr_requests
dans la file d'attente de votre requête et de limiter la profondeur de la file d'attente de commandes sur le stockage à un chiffre bas (aussi bas que1
si vous le souhaitez), de manière à ce que les E/S de ré-écriture ne puissent pas allouer tous les descripteurs de requêtes disponibles et remplir la file d'attente du périphérique avec des E/S d'écriture. Une fois que lesnr_requests
ont été alloués, tous les autres processus tentant d'effectuer des E/S seront mis en veille en attendant que des requêtes deviennent disponibles. Cela rend le procédé plus équitable puisque les requêtes sont ensuite distribuées en tourniquet « round-robin » (plutôt que de laisser un seul processus toutes les consommer en de rapides successions). Remarquez qu'il s'agit uniquement d'un problème lors de l'utilisation des ordonnanceurs « Deadline » ou « Noop » car la configuration par défaut de CFQ sert de protection contre cette situation. optimal_io_size
- Sous certaines circonstances, le stockage sous-jacent rapportera une taille d'E/S optimale. Ceci est très commun dans les RAID logiciels et matériels, où la taille d'E/S optimale est la taille de bande. Si cette valeur est rapportée, les applications devraient délivrer des E/S correspondantes à la taille des E/S optimales et si possible en multiples de celles-ci.
read_ahead_kb
- Le système d'exploitation peut détecter lorsqu'une application lit des données de manière séquentielle depuis un fichier ou un disque. Dans de tels cas, il procède à un algorithme de lecture à l'avance intelligent, dans lequel plus de données du disque que celles requises par l'utilisateur sont lues. Ainsi, lorsque l'utilisateur tentera à nouveau de lire un bloc de données, elles se trouveront déjà dans le cache de la page du système d'exploitation. L'inconvénient potentiel de ce procédé est que le système d'exploitation pourrait lire plus de données que nécessaire, ce qui occupe de l'espace dans le cache de la page jusqu'au vidage résultant de la forte pression de mémoire. Sous ces circonstances, avoir de multiples processus effectuant de fausses lectures à l'avance augmenterait la pression sur la mémoire.Pour les périphériques mappeurs de périphériques, il est de bonne augure d'augmenter la valeur de
read_ahead_kb
à un nombre élevé, comme8192
par exemple. La raison derrière ceci est qu'un périphérique mappant des péripphériques est souvent composé de multiples périphériques sous-jacents. Définir cette valeur sur son défaut (128
Ko), multiplié par le nombre de périphériques que vous mappez est un bon début pour effectuer une optimisation. rotational
- Les disques durs traditionnels sont rotationnels (composés de plateaux effectuant des rotations). Les disques SSD ne le sont pas. La plupart des disques SSD publiciseront cela correctement. Cependant, si vous rencontriez un jour un périphérique n'expliquant pas clairement ce procédé, il pourrait se révéler nécessaire de définir « Rotational » sur
0
; lorsque « Rotational » est désactivé, l'élévateur des E/S n'utilise pas de logique servant à réduire les recherches puisqu'il n'existe que de petites pénalités pour les opérations de recherche sur des média non-rotationnels. rq_affinity
- Les complétions des E/S peuvent être traitées sur différents CPU à partir de celui qui a délivré l'E/S. Définir
rq_affinity
sur1
cause au noyau de délivrer des achèvements au CPU sur lequel l'E/S a été effectuée. Ceci peut améliorer l'efficacité de la mise en cache de données du CPU.
Chapitre 7. Systèmes de fichiers
7.1. Considérations pour optimiser des systèmes de fichiers
7.1.1. Options de formatage
La taille de bloc peut être sélectionnée au moment de mkfs
. La gamme de tailles valides dépend du système : la limite supérieure est la taille de page maximum du système hôte, tandis que la taille inférieure dépend du système de fichiers. La taille de bloc par défaut est appropriée dans la plupart des cas.
Si votre système utilise un stockage par bandes tel que RAID5, vous pouvez améliorer la performance en alignant les données et les métadonnées sur la géométrie sous-jacente du stockage lors de mkfs
. Pour RAID logiciel (LVM ou MD) et le stockage de matériel d'entreprise, cette information est recherchée et définie automatiquement, mais dans de nombreux cas l'administrateur doit spécifier cette géométrie manuellement avec mkfs
sur la ligne de commande.
Les charges de travail intensives de métadonnées signifient que la section « log » (journal) d'un système de fichiers de journalisation (tel que ext4 et XFS) est extrêmement fréquemment mise à jour. Pour minimiser le temps de recherche du système de fichiers au journal, vous pouvez placer le journal sur le stockage dédié. Remarquez cependant que placer le journal sur un stockage externe plus lent que le système de fichiers principal peut annuler tout avantage potentiellement associé à l'utilisation d'un stockage externe.
Avertissement
mkfs
et les périphériques journaux sont spécifiés lors du montage. Reportez-vous aux pages man mke2fs(8)
, mkfs.xfs(8)
et mount(8)
pour obtenir davantage d'informations.
7.1.2. Options de montage
Une barrière d'écriture est un mécanisme du noyau utilisé pour s'assurer que les métadonnées du système de fichiers soient écrites et ordonnées correctement sur un stockage persistant, même lorsque les périphériques de stockage avec des caches d'écriture volatiles subissent une perte de puissance. Les systèmes de fichiers avec des barrières d'écriture activées assurent aussi que toutes données transmises via fsync()
persistent lors de pannes de courant. Red Hat Enterprise Linux active les barrières par défaut sur tout le matériel qui les prend en charge.
fsync()
, ou qui créent et suppriment de nombreux fichiers de petite taille. Pour les stockages sans cache d'écriture volatile, ou dans le rare cas où les inconsistances et pertes de données d'un système de fichiers après une panne de courant sont acceptables, les barrières peuvent être désactivées en utilisant l'option de montage nobarrier
. Pour obtenir davantage d'informations, veuillez vous reporter au Guide d'administration du stockage.
Historiquement, lorsqu'un fichier est lu, le temps d'accès (atime
) de ce fichier doit être mis à jour dans les métadonnées de l'inode, ce qui implique des écritures d'E/S supplémentaires. Si des métadonnées atime
précises ne sont pas requises, montez le système de fichiers avec l'option noatime
afin d'éliminer ces mises à jour de métadonnées. Cependant, dans la plupart des cas, atime
n'est pas une grosse surcharge résultant du comportement « atime » relatif par défaut (ou relatime
) dans le noyau Red Hat Enterprise Linux 6. Le comportement relatime
met uniquement à jour atime
si le atime
précédent est plus ancuen que le temps de modification (mtime
) ou le temps de modification de statut (ctime
).
Note
noatime
active aussi le comportement nodiratime
; il n'est pas nécessaire de paramétrer noatime
ainsi que nodiratime
en même temps.
La lecture à l'avance accélère l'accès aux fichiers en récupérant les données à l'avance et en les chargeant dans le cache de la page de manière à ce qu'elles soient disponibles plus tôt dans la mémoire au lieu de depuis le disque. Certaines charges de travail, comme celles impliquant une diffusion importante d'entrées et sorties séquentielles, bénéficient de hautes valeurs de lecture à l'avance.
blockdev
pour afficher et modifier la valeur de lecture à l'avance. Pour afficher la valeur de la lecture à l'avance actuelle pour un périphérique bloc particulier, vuillez exécuter :
# blockdev -getra périphérique
# blockdev -setra N périphérique
blockdev
ne persistera pas lors de redémarrages. Nous recommandons de créer un script init.d
de niveau d'exécution pour définir cette valeur pendant le démarrage.
7.1.3. Maintenance de systèmes de fichiers
Les opérations d'abandon en ligne et d'abandon du lot sont des fonctionnalités des systèmes de fichiers montés qui abandonnent les blocs qui ne sont pas utilisés par le système de fichiers. Les opérations sont utiles pour les disques SSD et les allocations fines et dynamiques de stockage.
fstrim
. Cette commande abandonne tous les blocs inutilisés dans un système de fichiers qui correspondent aux critères de l'utilisateur. Les deux types d'opérations sont pris en charge avec les systèmes de fichiers XFS et ext4 dans Red Hat Enterprise Linux 6.2 et ses versions supérieures tant que le périphérique bloc sous-jacent au système de fichiers prend en charge les opérations d'abandon physique. Les opérations d'abandon physique sont prises en charge si la valeur de /sys/block/périphérique/queue/discard_max_bytes
n'est pas zéro.
-o discard
(soit dans /etc/fstab
ou en faisant partie de la commande mount
) et exécutées en temps réeal sans intervention de la part de l'utilisateur. Les opérations d'abandon en ligne abandonnent uniquement les blocs passant de « Utilisé » à « Libre ». Les opérations d'abandon en ligne sont prises en charge sur les systèmes de fichiers ext4 dans Red Hat Enterprise Linux 6.2 et ses versions supérieures, ainsi que sur les systèmes de fichiers XFS dans Red Hat Enterprise Linux 6.4 et ses versions supérieures.
7.1.4. Considérations pour l'application
Les systèmes de fichiers ext4, XFS et GFS2 prennent en charge la pré-allocation d'espace efficace via l'appel glibc fallocate(2)
. Dans les cas où les fichiers pouvaient être mal fragmentés à cause des schémas d'écriture, conduisant ainsi à de pauvres performances de lecture, la pré-allocation d'espace peut être une technique utile. La pré-allocation marque l'espace disque comme s'il a été alloué à un fichier, sans écrire de données dans cet espace. Jusqu'à ce que de véritables données soient écrites sur un bloc pré-alloué, les opérations de lecture retourneront des zéros.
7.2. Profils pour les performances de systèmes de fichiers
latency-performance
- Profil de serveur pour optimisation typique des performances de la latence. Les mécanismes d'économies d'énergie de tuned et ktune sont désactivés. Le mode
cpuspeed
bascule surperformance
. L'élévateur d'entrée et sorties est modifié surdeadline
pour chaque périphérique. Le paramètrecpu_dma_latency
est enregistré avec une valeur de0
(la latence la plus basse possible) pour que la qualité de service de la gestion de l'alimentation limite la latence quand possible. throughput-performance
- Profil de serveur pour une optimisation typique des performances de débit. Ce profil est recommandé si le système ne possède pas de stockage de classe entreprise. Ce profil est le même que
latency-performance
, à l'exception de :kernel.sched_min_granularity_ns
(granularité de préemption minimale de l'ordonnanceur), qui est paramétré que10
millisecondes,kernel.sched_wakeup_granularity_ns
(granularité de réveil de l'ordonnanceur), qui est paramétré sur15
millisecondes,vm.dirty_ratio
(ratio dirty de la machine virtuelle), qui est paramétré sur 40% et- les huge pages transparentes sont activées.
enterprise-storage
- Ce profil est recommandé pour les configurations de serveurs de taille entreprise avec un stockage de classe entreprise, incluant une protection de cache de contrôleur sur batterie et la gestion de caches sur disque. Ce profil est le même que
throughput-performance
, à l'exception de :- La valeur
readahead
, qui est paramétrée sur4x
et - Les systèmes de fichiers non root/boot sont montés à nouveau avec
barrier=0
.
man tuned-adm
), ou dans le Guide de gestion de l'alimentation, disponible sur http://access.redhat.com/site/documentation/Red_Hat_Enterprise_Linux/.
7.3. Systèmes de fichiers
7.3.1. Le système de fichiers Ext4
Note
Pour de très grands systèmes de fichiers, le processus mkfs.ext4
peut prendre très longtemps à initialiser toutes les tables d'inodes dans le système de fichiers. Ce processus peut être reporté avec l'option -E lazy_itable_init=1
. SI utilisé, les processus du noyau continueront à initialiser le système de fichiers après qu'il soit monté. La vitesse à laquelle cette initialisation se produit peut être contrôlée avec l'option -o init_itable=n
de la commande mount
, où le temps pris pour effectuer cette initialisation d'arrière-plan est d'environ 1/n. La valeur par défaut de n
est 10
.
Comme certaines applications n'effectuent pas correctement l'opération fsync()
après avoir renommé un fichier existant ou après une troncature et ré-écriture, ext4 adopte par défaut la synchronisation automatique des fichiers après des opérations « remplacer en renommant » et « remplacer en tronquant ». Ce comportement est en grande partie conforme au comportement de l'ancien système de fichiers ext3. Cependant, comme les opérations fsync()
peuvent prendre longtemps, si ce comportement n'est pas nécessaire, vous pouvez utiliser l'option -o noauto_da_alloc
avec la commande mount
pour le désactiver. Cela signifie que l'application doit explicitement utiliser fsync()
afin d'assurer la persistance des données.
Par défaut, les E/S committées sur le journal ont une priorité légèrement plus élevée que les E/S normales. Cette priorité peut être contrôlée avec l'option journal_ioprio=n
de la commande mount
. La valeur par défaut est 3
. Les valeurs valides vont de 0 à 7, la valeur 0 étant l'E/S avec la plus haute priorité.
mkfs
et options de réglage, veuillez voir les pages man mkfs.ext4(8)
et mount(8)
, ainsi que le fichier Documentation/filesystems/ext4.txt
dans le paquetage kernel-doc.
7.3.2. Le système de fichiers XFS
mkfs
font varier la largeur des arbres B, ce qui peut modifier les caractéristiques d'évolutivité des différents sous-systèmes.
7.3.2.1. Réglages de base pour XFS
mkfs.xfs
se configurera elle-même automatiquement avec la bonne unité de bande et la bonne largeur pour s'aligner sur le matériel. Ceci pourrait devoir être effectué manuellement si RAID logiciel est en cours d'utilisation.
inode64
est fortement recommandée pour les systèmes de fichiers multi-téraoctets, sauf lorsque le système de fichiers est exporté via NFS et que les clients NFS 32 bits hérités requièrent accès au système de fichiers.
logbsize
est recommandée pour les systèmes de fichiers qui sont fréquemment modifiés, ou qui sont modifiés en rafales. La valeur par défaut est MAX
(32 Ko, unité de bande journalisée) et la taille maximum est 256 Ko. Une valeur de 256 Ko est recommandée pour les systèmes de fichiers subissant de lourdes modifications.
7.3.2.2. Réglages avancés pour XFS
XFS impose une limite arbitraire sur le nombre de fichiers qu'un système de fichiers peut contenir. En général, cette limite est suffisamment élevée pour ne jamais être atteinte. Si vous savez à l'avance que la limite par défaut sera insuffisante, vous pouvez augmenter le pourcentage d'espace du système de fichiers autorisé aux inodes avec la commande mkfs.xfs
. Si vous atteignez la limite de fichiers après la création du système de fichiers (habituellement indiqué par des erreurs ENOSPC lors d'une tentative de création de fichier ou de répertoire alors qu'il existe de l'espace disponible), vous pouvez ajuster la limite avec la commande xfs_growfs
.
La taille de bloc d'un répertoire est fixée pour la durée de vie d'un système de fichiers et ne peut pas être modifiée, sauf lors du formatage initial avec mkfs
. Le bloc de répertoire minimum est la taille de bloc du système de fichiers, qui est par défaut MAX
(4 Ko, taille de bloc du système de fichiers). En générale, il n'y a pas de raison de réduire la taille de bloc du répertoire.
Contrairement aux autres systèmes de fichiers, XFS peut effectuer de nombreux types d'opérations d'allocation et de dé-allocation simultanément, à condition que les opérations se produisent sur des objets non-partagés. Les allocations et dé-allocations d'extensions peuvent se produire en même temps à condition que les opérations simultanées se produisent dans différents groupes d'allocation. De manière similaire, les allocations ou dé-allocations d'inodes peuvent se produire en même temps à condition que les opérations simultanées affectent différents groupes d'allocation.
XFS peut stocker des attributs de petite taille directement dans l'inode si l'espace est disponible dans l'inode. Si l'attribut peut être intégré dans l'inode, alors il peut être récupéré et modifié sans devoir faire recours à des E/S supplémentaires pour récupérer des blocs d'attributs séparés. Le différentiel de performance entre les attributs « en ligne » et « hors-ligne » peut aisément être d'un ordre de magnitude plus lent pour les attributs « hors-ligne ».
La taille du journal est le facteur principal déterminant le niveau réalisable de modifications prolongées de métadonnées. Le périphérique journal est circulaire et avant que les données de la queue puisse être écrasées, toutes les modifications dans le journal doivent être écrites sur les emplacements réels sur le disque. Cela implique un effort significatif de recherche pour réécrire toutes les métadonnées modifiées.
mkfs
effectue cela par défaut pour les périphériques MD et DM, mais pour le RAID logiciel, il se peut qu'il faille le spécifier. Paramétrer ceci correctement prévient toute possibilité d'E/S de journal provoquant des E/S non-alignées et des opérations de lecture-modification-écriture conséquentes lors de l'écriture de modifications sur disque.
logbsize
) augmente la vitesse à laquelle les modifications peuvent être écrites sur le journal. La taille de la mémoire tampon de journal par défaut est MAX
(32 Ko, unité de bande de journal) et la taille maximale est de 256 Ko. En général, une valeur plus importante se traduit par une performance plus rapide. Cependant, sous de lourdes charges de travail fsync, des mémoires tampon de journaux de petite taille sont visiblement plus rapides que des mémoires tampon de grande taille avec un alignement d'unité de bande de grande taille.
delaylog
améliore aussi les performances des modifications prolongées de métadonnées en réduisant le nombre de modifications apportées au journal. Ceci est réalisé en agrégeant des modifications individuelles en mémoire avant de les écrire sur le journal : les métadonnées fréquemment modifiées sont écrites sur le journal de manière périodique plutôt qu'à chaque fois qu'une modification est effectuée. Cette option augmente l'utilisation par la mémoire du suivi des métadonnées modifiées et augmente le nombre d'opérations potentiellement perdues lorsqu'un incident se produit, mais elle peut améliorer la vitesse et l'évolutivité des modifications de métadonnées par un ordre de magnitude ou plus. L'utilisation de cette option ne réduit pas l'intégrité des données ou métadonnées lorsque fsync
, fdatasync
ou sync
sont utilisés pour s'assurer que les données ou métadonnées soient bien écrites sur le disque.
7.4. Clustering
7.4.1. Global File System 2
- Pré-allouez des fichiers et répertoires avec
fallocate
quand possible afin d'optimiser le processus d'allocation et d'éviter de devoir verrouiller les pages sources. - Minimisez les zones du système de fichiers qui sont partagées entre de multiples nœuds pour minimiser les invalidations de cache à travers plusieurs nœuds et améliorer les performances. Par exemple, si de multiples nœuds montent le même système de fichiers, mais accèdent à différents sous-répertoires, vous obtiendrez probablement de meilleures performances en déplaçant un sous-répertoire sur un autre système de fichiers.
- Sélectionnez une taille et un nombre de groupes de ressource optimaux. Ceci dépend des tailles de fichiers typiques et de l'espace libre disponible sur le système et affecte la probabilité que de multiples nœuds tenteront d'utiliser un groupe de ressources simultanément. Trop de groupes de ressources peut ralentir l'allocation des blocs pendant que l'espace alloué est localisé, tandis que trop peu de groupes de ressources peut provoquer un conflit de verrouillage pendant la dé-allocation. Il est généralement recommandé de tester de multiples configurations afin de déterminer laquelle conviendra le mieux à charge de travail.
- Sélectionnez votre matériel de stockage en fonction des schémas d'E/S auxquels vous vous attendez de la part des nœuds des clusters et en fonction des conditions préalables de performance de votre système de fichiers.
- Utilisez le stockage SSD quand possible afin de diminuer le temps de recherche.
- Créez un système de fichiers de taille appropriée pour votre charge de travail, assurez-vous aussi que le système de fichiers ne soit jamais à plus de 80% de sa capacité. Les systèmes de fichiers plus petits mettront un temps proportionnellement plus court pour effectuer des copies de sauvegarde et nécessiteront moins de temps et de mémoire pour les vérifications du système de fichiers, mais ils seront sujets à une fragmentation plus importante s'ils sont trop petits pour leur charge de travail.
- Définissez des tailles de journaux plus importantes pour les charges de travail de métadonnées intensives ou lorsque des données journalisées sont en cours d'utilisation. Même si cela utilise plus de mémoire, les performances en sont améliorées car davantage d'espace de journalisation est disponible pour stocker des données avant qu'une écriture ne soit nécessaire.
- Assurez-vous que les horloges des nœuds GFS2 sont synchronisées pour éviter les problèmes avec des applications mises en réseau. Nous recommandons d'utiliser NTP (« Network Time Protocol »).
- À moins que les heures d'accès aux fichiers ou répertoires ne soient critiques à l'opération de votre application, montez le système de fichiers avec les options de montage
noatime
etnodiratime
.Note
Red Hat recommande fortement d'utiliser l'optionnoatime
avec GFS2. - Si vous devez utiliser des quotas, essayez de réduire la fréquence des transactions de synchronisation des quotas ou utilisez la synchronisation de quotas approximative afin de prévenir l'apparition de problèmes de performance résultant des mises à jour constantes de fichiers de quotas.
Note
La comptabilité des quotas approximatifs peut permettre aux utilisateurs et aux groupes de légèrement excéder leurs limites de quotas. Pour minimiser le problème, GFS2 réduit dynamiquement les périodes de synchronisation lorsqu'un utilisateur ou un groupe approche de son quota limite.
Chapitre 8. « Networking » (Réseau)
8.1. Améliorations des performances réseau
RPS (« Receive Packet Steering »)
rx
NIC pour que sa charge de travail softirq
de réception soit distribuée sur plusieurs CPU. Ceci aide à empêcher que le trafic réseau ne soit congestionné sur une seule file d'attente de matériel NIC.
/sys/class/net/ethX/queues/rx-N/rps_cpus
, remplaçant ethX
par le nom du périphérique correspondant à la NIC (par exemple, eth1
, eth2
) et rx-N
par la file de réception NIC spécifiée. Ceci permettra aux CPU spécifiés dans le fichier de traiter les données de la file d'attente rx-N
sur ethX
. Lorsque vous spécifiez les CPU, prenez en considération les affinités du cache [4]de la file d'attente.
RFS (« Receive Flow Steering »)
/proc/sys/net/core/rps_sock_flow_entries
- Ce réglage contrôle le nombre maximal de sockets ou de flux que le noyau peut diriger vers n'importe quel CPU spécifié. La limite définie est globale et partagée.
/sys/class/net/ethX/queues/rx-N/rps_flow_cnt
- Ce réglage contrôle le nombre maximal de sockets ou flux que le noyau peut diriger vers une file de réception spécifiée (
rx-N
) située sur une NIC (ethX
). Remarquez que la somme de toutes les valeurs par file de ce réglage sur toutes les NIC devrait être égale ou inférieure à/proc/sys/net/core/rps_sock_flow_entries
.
Prise en charge de getsockopt pour les flux de type « thin-stream » TCP
getsockopt
a été amélioré afin de prendre en charge deux options supplémentaires :
- TCP_THIN_DUPACK
- Ce booléen active le déclenchement dynamique des retransmissions après un « dupACK » pour les « thin-streams ».
- TCP_THIN_LINEAR_TIMEOUTS
- Ce booléen active le déclenchement dynamique des délais d'expirations linéaires pour les « thin-streams ».
file:///usr/share/doc/kernel-doc-version/Documentation/networking/ip-sysctl.txt
. Pour obtenir des informations supplémentaires sur les « thin-streams », veuillez consulter file:///usr/share/doc/kernel-doc-version/Documentation/networking/tcp-thin.txt
.
Prise en charge des TProxy (proxys transparents)
file:///usr/share/doc/kernel-doc-version/Documentation/networking/tproxy.txt
.
8.2. Paramètres réseau optimisés
- netstat
- Utilitaire sur la ligne de commande qui imprime des connexions réseau, tables de routage, statistiques d'interface, connexions fictives et adhésions à des multidiffusions. Il récupère des informations sur le sous-système « networking » à partir du système de fichiers
/proc/net/
. Ces fichiers incluent :/proc/net/dev
(informations sur le périphérique)/proc/net/tcp
(informations sur le socket TCP)/proc/net/unix
(informations sur le socket du domaine Unix)
Pour obtenir des informations supplémentaires surnetstat
et ses fichiers référencés depuis/proc/net/
, veuillez consulter la page mannetstat
:man netstat
. - dropwatch
- Utilitaire de surveillance qui suit les paquets laissés par le noyau. Pour obtenir davantage d'informations, veuillez consulter la page man
dropwatch
:man dropwatch
. - ip
- Utilitaire pour gérer et surveiller les itinéraires, les périphériques, les routages basés sur stratégie et les tunnels. Pour obtenir davantage d'informations, veuillez consulter la page man
ip
:man ip
. - ethtool
- Utilitaire pour afficher et modifier les paramètres de NIC. Pour obtenir davantage d'informations, veuillez consulter la page man
ethtool
:man ethtool
. - /proc/net/snmp
- Fichier affichant des données ASCII nécessaires pour les bases d'informations de gestion IP, ICMP, TCP et UDP pour un agent
snmp
. Il affiche aussi des statistiques UDP allégées en temps réel.
/proc/net/snmp
indique qu'une ou plusieurs des files de réception des sockets sont pleines lorsque la pile réseau tente de mettre des nouvelles trames dans la file d'attente d'un socket d'application.
Taille du tampon de réception du socket
sk_stream_wait_memory.stp
, suggèrent que le taux de vidage de la file du socket est trop lent, alors vous pouvez augmenter la profondeur de la file du socket de l'application. Pour ce faire, augmentez la taille des tampons utilisés par les sockets en configurant l'une des valeurs suivantes :
- rmem_default
- Paramètre du noyau qui contrôle la taille par défaut des tampons de réception utilisés par les sockets. Pour le configurer, veuillez exécuter la commande suivante :
sysctl -w net.core.rmem_default=N
RemplacezN
par la taille de tampon souhaitée, en octets. Pour déterminer la valeur de ce paramètre du noyau, affichez/proc/sys/net/core/rmem_default
. N'oubliez pas que la valeur dermem_default
ne doit pas être supérieure àrmem_max
(/proc/sys/net/core/rmem_max
) ; si besoin est, augmentez la valeur dermem_max
. - SO_RCVBUF
- Option de socket contrôlant la taille maximale d'un tampon de réception d'un socket, en octets. Pour obtenir davantage d'informations sur
SO_RCVBUF
, veuillez consulter la page man :man 7 socket
.Pour configurerSO_RCVBUF
, veuillez utiliser l'utilitairesetsockopt
. Vous pouvez récupérer la valeurSO_RCVBUF
actuelle avecgetsockopt
. Pour obtenir davantage d'informations sur l'utilisation de ces deyx utilitaires, veuillez consulter la page mansetsockopt
:man setsockopt
.
8.3. Aperçu des réceptions de paquets
Figure 8.1. Diagramme du chemin de réception réseau
- Réception du matériel : la carte d'interface réseau (ou NIC) reçoit la trame sur le fil. Selon la configuration de son pilote, la carte réseau transfère la trame à une mémoire-tampon de matériel interne ou à un tampon en anneau spécifié.
- IRQ matérielle : la NIC affirme la présence d'une trame net en interrompant le CPU. Ceci cause au pilote NIC de reconnaître l'interruption et de programmer une opération IRQ logicielle.
- IRQ logicielle : cette étape implémente le processus de réception de trames et est exécuté dans un contexte
softirq
. Cela signifie que l'étape empêche toutes les applications de s'exécuter sur le CPU spécifié, mais permet toujours à des IRQ matérielles d'être affirmées.Dans ce contexte (exécution sur le même CPU en tant qu'IRQ matérielle, minimisant ainsi l'en-tête de verrouillage), le noyau supprime la trame des tampons du matériel de la carte réseau et la traite via la pile réseau. À partir de là, la trame est transférée, abandonnée, ou passée à un socket d'écoute cible.Lorsque passée à un socket, la trame est ajoutée à l'application propriétaire du socket. Ce processus est effectué de manière itérative jusqu'à ce qu'il ne reste plus de trames au tampon du matériel de la NIC, ou jusqu'à ce que device weight (dev_weight
) soit atteint. Pour obtenir davantage d'informations sur « device weight », veuillez consulter la Section 8.4.1, « Mémoire tampon matérielle de la carte d'interface réseau (NIC) ». - Réception de l'application : l'application reçoit la trame et la sort de toute file d'attente de sockets possédés via des appels POSIX standards (
read
,recv
,recvfrom
). À ce moment, les données reçues sur le réseau n'existent plus sur la pile réseau.
CPU/cache affinity
8.4. Résoudre des problèmes communs de perte de file ou de trame
8.4.1. Mémoire tampon matérielle de la carte d'interface réseau (NIC)
softirq
, ce que la carte réseau affirme via une interruption. Pour interroger le statut de cette file, veuillez utiliser la commande suivante :
ethtool -S ethX
ethX
par le nom du périphérique correspondant de la carte réseau. Ceci affichera combien de trames ont été supprimées dans ethX
. Souvent, les suppressions se produisent lorsque la file ne possède plus d'espace dans la mémoire tampon pour stocker les trames.
- Trafic des entrées
- Vous pouvez aider à empêcher les débordements de files en ralentissant le trafic des entrées. Ceci peut être effectué en filtrant, en réduisant le nombre de groupes de multidiffusion rejoints, en réduisant le trafic de diffusion, et ainsi de suite.
- Longueur des files
- Alternativement, vous pouvez aussi augmenter la longueur des files. Ceci implique l'augmentation des tampons dans une file spécifiée au maximum autorisé par le pilote. Pour ce faire, modifiez les paramètres d'anneau
rx
/tx
deethX
en utilisant :ethtool --set-ring ethX
Ajoutez les valeursrx
outx
appropriées à la commande mentionnée ci-dessus. Pour obtenir davantage d'informations, veuillez consulterman ethtool
. - « Device weight » (Poids du périphérique)
- Vous pouvez aussi augmenter la vitesse à laquelle une file est vidée. Pour ce faire, veuillez ajuster device weight en conséquence. Cet attribut fait référence ay nombre maximal de trames que la carte réseau peut recevoir avant que le contexte
softirq
ne doive céder au CPU et se reprogrammer. Il est contrôlé par la variable/proc/sys/net/core/dev_weight
.
8.4.2. File de sockets
softirq
. Les applications vident ensuite les files de leurs sockets correspondants via des appels read
, recvfrom
et ainsi de suite.
netstat
; la colonne Recv-Q
affiche la taille de la file. De manière générale, les débordements dans la file des sockets sont gérés de la même façon que les débordements de mémoire tampon de matériel de carte d'interface réseau (voir la Section 8.4.1, « Mémoire tampon matérielle de la carte d'interface réseau (NIC) ») :
- Trafic des entrées
- La première option est de ralentir le trafic des entrées en configurant la vitesse à laquelle la file se remplit. Pour ce faire, filtrez les trames ou supprimez-les de manière préventive. Vous pouvez aussi ralentir le trafic des entrées en rabaissant le poids du périphérique de la carte d'interface réseau[6].
- Profondeur de file
- Vous pouvez aussi éviter les débordements de files de sockets en augmentant la profondeur des files. Pour ce faire, augmentez la valeur du paramètre de noyau
rmem_default
ou de l'option de socketSO_RCVBUF
. Pour obtenir davantage d'informations sur les deux, veuillez consulter la Section 8.2, « Paramètres réseau optimisés ». - Fréquence des appels d'application
- Lorsque possible, veuillez optimiser l'application afin qu'elle effectue des appels plus fréquemment. Cela implique la modification ou la reconfiguration de l'application réseau pour effectuer des appels POSIX (comme
recv
,read
) plus fréquemment. En conséquence, cela permettra à une application de vider la file plus rapidement.
8.5. Considérations sur la multidiffusion
softirq
.
softirq
. L'ajout d'un écouteur à un groupe de multidiffusion implique que le noyau doit créer une copie supplémentaire pour chaque trame reçue pour ce groupe.
softirq
peut conduire à des pertes de trame sur les files de la carte réseau et des sockets. Un temps d'exécution softirq
plus élevé se traduit par une réduction des possibilités pour l'exécution des applications sur des systèmes lourdement chargés. Ainsi, la vitesse à laquelle les trames de multidiffusion sont perdues augmente au même rythme que le nombre d'applications écoutant un groupe de multidiffusion volumineux augmente.
/proc/sys/net/core/dev_weight
. Pour obtenir davantage d'informations sur le poids d'un périphérique et les implications liées à son ajustement, veuillez consulter la Section 8.4.1, « Mémoire tampon matérielle de la carte d'interface réseau (NIC) ».
Annexe A. Historique des versions
Historique des versions | |||||
---|---|---|---|---|---|
Version 4.0-22.2.400 | 2013-10-31 | Rüdiger Landmann | |||
| |||||
Version 4.0-22.2 | Fri Jun 28 2013 | Sam Friedmann | |||
| |||||
Version 4.0-22.1 | Thu Apr 18 2013 | Chester Cheng | |||
| |||||
Version 4.0-22 | Fri Feb 15 2013 | Laura Bailey | |||
| |||||
Version 4.0-19 | Wed Jan 16 2013 | Laura Bailey | |||
| |||||
Version 4.0-18 | Tue Nov 27 2012 | Laura Bailey | |||
| |||||
Version 4.0-17 | Mon Nov 19 2012 | Laura Bailey | |||
| |||||
Version 4.0-16 | Thu Nov 08 2012 | Laura Bailey | |||
| |||||
Version 4.0-15 | Wed Oct 17 2012 | Laura Bailey | |||
| |||||
Version 4.0-13 | Wed Oct 17 2012 | Laura Bailey | |||
| |||||
Version 4.0-12 | Tue Oct 16 2012 | Laura Bailey | |||
| |||||
Version 4.0-9 | Tue Oct 9 2012 | Laura Bailey | |||
| |||||
Version 4.0-6 | Thu Oct 4 2012 | Laura Bailey | |||
| |||||
Version 4.0-3 | Tue Sep 18 2012 | Laura Bailey | |||
| |||||
Version 4.0-2 | Mon Sep 10 2012 | Laura Bailey | |||
| |||||
Version 3.0-15 | Thursday March 22 2012 | Laura Bailey | |||
| |||||
Version 3.0-10 | Friday March 02 2012 | Laura Bailey | |||
| |||||
Version 3.0-8 | Thursday February 02 2012 | Laura Bailey | |||
| |||||
Version 3.0-5 | Tuesday January 17 2012 | Laura Bailey | |||
| |||||
Version 3.0-3 | Wednesday January 11 2012 | Laura Bailey | |||
| |||||
Version 1.0-0 | Friday December 02 2011 | Laura Bailey | |||
|