Bull AIX 4.3 - Performance Manuel utilisateur

Ajouter à Mes manuels
354 Des pages
Bull AIX 4.3 - Performance Manuel utilisateur | Fixfr
Bull
AIX 4.3 Guide d’optimisation
AIX
REFERENCE
86 F2 72AP 04
Bull
AIX 4.3 Guide d’optimisation
AIX
Logiciel
Octobre 1999
BULL ELECTRONICS ANGERS
CEDOC
34 Rue du Nid de Pie – BP 428
49004 ANGERS CEDEX 01
FRANCE
REFERENCE
86 F2 72AP 04
The following copyright notice protects this book under the Copyright laws of the United States of America
and other countries which prohibit such actions as, but not limited to, copying, distributing, modifying, and
making derivative works.
Copyright
Bull S.A. 1992, 1999
Imprimé en France
Vos suggestions sur la forme et le fond de ce manuel seront les bienvenues. Une feuille
destinée à recevoir vos remarques se trouve à la fin de ce document.
Pour commander d’autres exemplaires de ce manuel ou d’autres publications techniques
Bull, veuillez utiliser le bon de commande également fourni en fin de manuel.
Marques déposées
Toutes les marques déposées sont la propriété de leurs titulaires respectifs.
AIXR est une marque déposée d’IBM Corp. et est utilisée sous licence.
UNIX est une marque déposée licenciée exclusivement par X/Open Company Ltd
An 2000
Le produit documenté dans ce manuel est prêt pour l’An 2000.
La loi du 11 mars 1957, complétée par la loi du 3 juillet 1985, interdit les copies ou reproductions destinées
à une utilisation collective. Toute représentation ou reproduction intégrale ou partielle faite par quelque
procédé que ce soit, sans consentement de l’auteur ou de ses ayants cause, est illicite et constitue une contrefaçon sanctionnée par les articles 425 et suivants du code pénal.
Ce document est fourni à titre d’information seulement. Il n’engage pas la responsabilité de Bull S.A. en cas
de dommage résultant de son application. Des corrections ou modifications du contenu de ce document
peuvent intervenir sans préavis ; des mises à jour ultérieures les signaleront éventuellement aux destinataires.
Table des matières
A propos de ce manuel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
xi
Chapitre 1. Performances . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Vitesse d’exécution . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Estimation de la charge . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Dynamique d’exécution des programmes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Dynamique système . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Procédure d’optimisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Identification des charges de travail . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Définition des objectifs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Identification des ressources critiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Réduction des contraintes de ressources critiques . . . . . . . . . . . . . . . . . . . . . . . . .
Modification de l’affectation des ressources en fonction des priorités . . . . . . . . .
Répétition des étapes d’optimisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Mise en œuvre de ressources supplémentaires . . . . . . . . . . . . . . . . . . . . . . . . . . .
Essais comparatifs – les données de performance sont inévitablement modifiées
1-1
1-1
1-2
1-2
1-6
1-8
1-8
1-8
1-9
1-10
1-10
1-10
1-11
1-12
Chapitre 2. Gestion des ressources AIX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Performances du programmateur CPU sous AIX . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Prise en charge des routines sous AIX version 4.1 . . . . . . . . . . . . . . . . . . . . . . . . .
Planification des routines de portée concurrentielle globale ou locale . . . . . . . . .
Priorité des processus et des routines . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
File d’attente d’exécution du programmateur d’AIX . . . . . . . . . . . . . . . . . . . . . . . . .
Tranche horaire CPU . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Voir aussi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Performances du gestionnaire de mémoire virtuelle (VMM) . . . . . . . . . . . . . . . . . . . .
Gestion de la mémoire réelle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Utilitaire de contrôle de l’occupation mémoire . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Affectation et réclamation d’emplacements dans l’espace de pagination . . . . . .
Gestion AIX du stockage sur disque fixe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Lecture séquentielle anticipée . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Ecriture différée . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Fichiers mappés et écriture différée . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Régulation des E/S . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Pile de disques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2-1
2-2
2-2
2-2
2-3
2-4
2-4
2-4
2-5
2-5
2-8
2-11
2-13
2-14
2-15
2-15
2-16
2-16
Chapitre 3. Introduction au multitraitement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Multitraitement symétrique (SMP) – concepts et architecture . . . . . . . . . . . . . . . . . .
Multiprocesseurs symétriques et asymétriques . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Sérialisation des données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Granularité du verrouillage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Charge liée au verrouillage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Cohérence des mémoires cache . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Affinité avec un processeur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Conflits d’utilisation de mémoire et de bus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Performances des systèmes SMS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Répartition de la charge de travail . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Débit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Temps de réponse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Adaptation des programmes à un environnement SMS . . . . . . . . . . . . . . . . . . . . . . .
3-1
3-2
3-2
3-3
3-4
3-4
3-5
3-5
3-5
3-6
3-6
3-6
3-6
3-7
Préface
iii
iv
Charge de travail d’un SMS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Multitraitement de la charge de travail . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Échelle de débit dans un système multiprocesseur . . . . . . . . . . . . . . . . . . . . . . . . .
Temps de réponse d’un système multiprocesseur . . . . . . . . . . . . . . . . . . . . . . . . . .
Programmation dans un système SMS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Traitement programmé de charges de travail migrées . . . . . . . . . . . . . . . . . . . . . .
Variables de l’algorithme de programmation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Planification des variables d’environnement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Affinité avec un processeur et liaisons . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3-8
3-8
3-8
3-10
3-11
3-11
3-11
3-12
3-14
Chapitre 4. Planification, conception et implantation . . . . . . . . . . . . . . . . . . . . . .
Identification des composants de la charge de travail . . . . . . . . . . . . . . . . . . . . . . .
Définition des objectifs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Évaluation des ressources requises par la charge de travail . . . . . . . . . . . . . . . . .
Conception et implantation de programmes performants . . . . . . . . . . . . . . . . . . . . . .
Programmes à CPU limitée . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Conception et codage pour l’exploitation optimale des mémoires cache . . . . . .
Registres et pipeline . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Cache et tampon TLB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Préprocesseurs et compilateurs XL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Niveaux d’optimisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Options XL C pour l’optimisation de la sous-routine string.h . . . . . . . . . . . . . . . . .
Style de codage optimisé C et C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Temps d’exécution des compilateurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Programmes à CPU limitée . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Conseils pour une installation performante . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Préinstallation d’AIX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Préinstallation de la CPU . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Préinstallation de la mémoire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Préinstallation du disque . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Préinstallation des cartes de communication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4-1
4-2
4-2
4-3
4-11
4-11
4-11
4-13
4-13
4-14
4-18
4-18
4-19
4-20
4-20
4-23
4-23
4-23
4-23
4-24
4-27
Chapitre 5. Contrôle système et diagnostics des performances . . . . . . . . . . . .
Contrôle continu des performances . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Commandes de contrôle iostat, netstat et vmstat . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5-1
5-2
5-3
Chapitre 6. Contrôle et optimisation de la CPU . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Contrôle de la CPU via vmstat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Mesure de la CPU via time . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Conseils relatifs à time et timex . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Contrôle de la CPU via xmperf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Identification des gros consommateurs de CPU via ps . . . . . . . . . . . . . . . . . . . . . . . .
Analyse des programmes via tprof . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Exemple théorique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Analyse du flux de commande via stem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Analyse de stem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Restructuration des exécutables via fdpr . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Contrôle des conflits pour la CPU . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Priorité des processus utilisateur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Exécution d’une commande à priorité non standard via nice . . . . . . . . . . . . . . . . .
Définition d’une priorité fixe via setpri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Affichage de la priorité des processus via ps . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Modification de la priorité d’un processus en cours via renice . . . . . . . . . . . . . . . .
Clarification de la syntaxe nice/renice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Optimisation du calcul de la priorité d’un processus via schedtune . . . . . . . . . . .
6-1
6-2
6-3
6-4
6-5
6-6
6-10
6-10
6-17
6-17
6-19
6-20
6-20
6-20
6-20
6-21
6-21
6-22
6-23
AIX 4.3 Guide d’optimisation
Modification de la tranche horaire du programmateur . . . . . . . . . . . . . . . . . . . . . . . . .
Administration des ID utilisateur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
6-25
6-26
Chapitre 7. Contrôle et optimisation de la mémoire . . . . . . . . . . . . . . . . . . . . . . . .
Quantité de mémoire utilisée . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
vmstat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
ps . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
svmon . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Exemples de sortie vmstat, ps et svmon . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Programmes à perte de mémoire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Voir aussi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Analyse de l’exploitation de la mémoire via BigFoot . . . . . . . . . . . . . . . . . . . . . . . . . .
Estimation de la mémoire requise via rmss . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Méthodes d’exploitation de rmss . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Optimisation du contrôle de charge mémoire VMM . . . . . . . . . . . . . . . . . . . . . . . . . . .
Optimisation du contrôle de charge mémoire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Optimisation du remplacement de page VMM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Paramètres minfree et maxfree . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Paramètres minperm et maxperm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Voir aussi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
7-1
7-2
7-2
7-2
7-3
7-3
7-4
7-4
7-5
7-6
7-6
7-14
7-14
7-16
7-16
7-17
7-18
Chapitre 8. Contrôle et optimisation des E/S disque . . . . . . . . . . . . . . . . . . . . . . .
Préinstallation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Élaboration d’une base d’optimisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Évaluation des performances disque après installation . . . . . . . . . . . . . . . . . . . . .
Évaluation du placement physique des données sur disque . . . . . . . . . . . . . . . . .
Réorganisation d’un groupe ou d’un volume logique . . . . . . . . . . . . . . . . . . . . . . .
Réorganisation d’un système de fichiers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Performances et espaces de pagination . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Mesure des E/S disque globales via vmstat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Analyse détaillée des E/S via filemon . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Programmes à disque limité . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Extension de la configuration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Voir aussi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Optimisation des lectures séquentielles anticipées . . . . . . . . . . . . . . . . . . . . . . . . . . .
Régulation des E/S disque . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Exemple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Performances et répartition des volumes logiques . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Conception d’un volume logique réparti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Optimisation des E/S d’un volume logique réparti . . . . . . . . . . . . . . . . . . . . . . . . . .
Performances et taille de fragment du système de fichiers . . . . . . . . . . . . . . . . . . . .
Performances et compression . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Performances et E/S disque asynchrones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Performances et E/S disque brutes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Performances et sync/fsync . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Modification du paramètre max_coalesce du pilote SCSI . . . . . . . . . . . . . . . . . . . . . .
Limites de la file d’attente de l’unité de disque et de la carte SCSI . . . . . . . . . . . . . .
Unité de disque non BULL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Pile de disques non BULL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Limitation des requêtes externes sur une carte disque . . . . . . . . . . . . . . . . . . . . . .
Contrôle du nombre de pbufs système . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
8-1
8-1
8-2
8-2
8-3
8-5
8-6
8-7
8-7
8-8
8-9
8-10
8-10
8-11
8-13
8-13
8-15
8-16
8-16
8-17
8-18
8-19
8-20
8-21
8-22
8-23
8-23
8-23
8-24
8-25
Chapitre 9. Contrôle et optimisation des E/S de communication . . . . . . . . . . . .
Performances UDP/TCP/IP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Gestion de la mémoire du sous-système de communication (mbuf) . . . . . . . . . .
9-1
9-2
9-3
Préface
v
Couche socket . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Fonctions UDP et TCP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Couche UDP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Couche TCP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Couche IP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Couche IF (couche Demux sous AIX version 4.1) . . . . . . . . . . . . . . . . . . . . . . . . . .
Cartes réseau local et pilotes d’unité . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Optimisation de TCP et UDP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Recommandations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Optimisation des files de transmission et de réception de la carte . . . . . . . . . . . .
Optimisation de la taille maximum de segment (MSS) TCP . . . . . . . . . . . . . . . . .
Optimisation des performances du protocole IP . . . . . . . . . . . . . . . . . . . . . . . . . . .
Optimisation des performances Ethernet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Optimisation des performances anneau à jeton (4 Mo) . . . . . . . . . . . . . . . . . . . . .
Optimisation des performances anneau à jeton (16 Mo) . . . . . . . . . . . . . . . . . . . .
Optimisation des performances FDDI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Optimisation des performances ATM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Optimisation des performances SOCC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Optimisation des performances HIPPI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Optimisation du pool mbuf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Fonction de gestion des mbuf : généralités . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Optimisation des polls mbuf : quand ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Optimisation des polls mbuf : comment ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Récapitulatif des paramètres d’optimisation UDP, TCP/IP et mbuf . . . . . . . . . . . . . .
thewall . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
sockthresh . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
sb_max . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
rfc1323 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
udp_sendspace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
udp_recvspace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
tcp_sendspace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
tcp_recvspace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
ipqmaxlen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
xmt_que_size . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
rec_que_size . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
MTU . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Voir aussi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Optimisation de NFS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Nombre de biod et de nfsd requis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Performances et montages logiciels et matériels de NFS . . . . . . . . . . . . . . . . . . .
Optimisation des retransmissions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Optimisation du cache d’attribut de fichier NFS . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Désactivation du support ACL NFS inutilisé . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Optimisation de la mise en cache des données NFS . . . . . . . . . . . . . . . . . . . . . . .
Optimisation des autres couches pour améliorer les performances NFS . . . . . .
Augmentation de la taille du tampon du socket NFS . . . . . . . . . . . . . . . . . . . . . . . .
Configuration du disque du serveur NFS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Accélérateurs matériels . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Du bon usage de NFS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Service des stations de travail sans disque . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Particularités d’un système sans disque . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Remarques sur NFS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Exécution d’un programme sur une station de travail sans disque . . . . . . . . . . . .
Pagination . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Ressources requises pour les stations de travail sans disque . . . . . . . . . . . . . . .
vi
AIX 4.3 Guide d’optimisation
9-3
9-5
9-5
9-6
9-10
9-11
9-11
9-12
9-12
9-13
9-21
9-23
9-23
9-24
9-24
9-24
9-25
9-25
9-25
9-26
9-26
9-27
9-29
9-31
9-31
9-31
9-32
9-32
9-32
9-32
9-33
9-33
9-33
9-34
9-34
9-35
9-35
9-36
9-36
9-37
9-38
9-38
9-39
9-39
9-39
9-39
9-40
9-40
9-40
9-41
9-41
9-41
9-42
9-44
9-45
Optimisation des performances . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Performance des commandes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Etude de cas 1 – Environnement de bureau . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Etude de cas 2 – Environnement de développement de logiciels . . . . . . . . . . . . .
Voir aussi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Optimisation des connexions asynchrones pour transferts haut débit . . . . . . . . . . .
Configurations et objectifs des mesures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Résultats . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Carte asynchrone 8/16 ports . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Carte asynchrone 64 ports . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Carte asynchrone 128 ports . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Techniques d’optimisation du port asynchrone . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Transfert rapide de fichiers avec fastport . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Evaluation des performances réseau avec netpmon . . . . . . . . . . . . . . . . . . . . . . . . . .
Analyse des problèmes de performance avec iptrace . . . . . . . . . . . . . . . . . . . . . . . . .
9-46
9-48
9-49
9-51
9-53
9-54
9-54
9-55
9-55
9-55
9-56
9-57
9-58
9-59
9-61
Chapitre 10. Optimisation des performances DFS . . . . . . . . . . . . . . . . . . . . . . . . .
Cache DFS sur disque ou en mémoire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Taille du cache DFS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Taille de la tranche de mémoire cache DFS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Nombre de tranches de cache DFS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Emplacement du cache disque DFS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Taille du tampon d’état du cache DFS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Taille des articles et lectures/écritures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Paramètres de communication DFS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Optimisation du serveur de fichiers DFS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Optimisation LFS DCE pour les performances DFS . . . . . . . . . . . . . . . . . . . . . . . . . .
10-1
10-1
10-2
10-2
10-2
10-2
10-3
10-3
10-3
10-4
10-4
Chapitre 11. Analyse des performances avec l’utilitaire de suivi . . . . . . . . . . . .
Présentation de l’utilitaire de suivi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Limitation de la quantité de données collectées . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Lancement et contrôle du suivi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Formatage des données de suivi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Consultation des données de suivi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Exemple d’utilisation de l’utilitaire de suivi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Obtention d’un fichier de suivi échantillon . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Formatage de l’échantillon de suivi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Interprétation d’un compte rendu de suivi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Filtrage du compte rendu de suivi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Lancement et contrôle du suivi depuis la ligne de commande . . . . . . . . . . . . . . . . . .
Contrôle du suivi en mode sous-commande . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Contrôle du suivi par commandes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Lancement et contrôle du suivi depuis un programme . . . . . . . . . . . . . . . . . . . . . . . .
Contrôle du suivi via les sous-routines de suivi . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Contrôle du suivi via des appels ioctl . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Ajout d’événements de suivi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Formes d’un article événement de suivi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Canaux de suivi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Macros d’enregistrement des événements de suivi . . . . . . . . . . . . . . . . . . . . . . . . .
ID d’événements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Exemples de codage et de formatage d’événements . . . . . . . . . . . . . . . . . . . . . . .
Syntaxe des strophes du fichier de format de suivi . . . . . . . . . . . . . . . . . . . . . . . . .
11-1
11-2
11-2
11-2
11-3
11-3
11-4
11-4
11-4
11-5
11-5
11-6
11-6
11-6
11-7
11-7
11-7
11-9
11-9
11-9
11-10
11-10
11-11
11-13
Préface
vii
viii
Chapitre 12. Outil de diagnostic PDT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Structure de PDT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Portée de l’analyse PDT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Exemple de compte rendu PDT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Installation et activation de PDT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Personnalisation de PDT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Réponse aux messages PDT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Boîte à outils PTX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Diagnostics en fonction d’un symptôme particulier . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Ralentissement d’un programme particulier . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Ralentissement général à un moment donné . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Ralentissement général et imprévisible . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Ralentissement des programmes d’un utilisateur particulier . . . . . . . . . . . . . . . . .
Ralentissement simultané de certains systèmes du réseau local . . . . . . . . . . . . .
Ralentissement général intermittent sur une unité ou un service . . . . . . . . . . . . .
Diagnostics à l’aide de PerfPMR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Contrôle avant modification . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Identification des ressources limitatives . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Aperçu des performances du système . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Détermination du facteur limitatif sur un programme . . . . . . . . . . . . . . . . . . . . . . . .
Disque ou mémoire ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Gestion de la charge de travail . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
12-1
12-1
12-2
12-4
12-5
12-6
12-10
12-16
12-17
12-17
12-18
12-18
12-19
12-19
12-20
12-21
12-22
12-23
12-23
12-25
12-25
12-29
Chapitre 13. Gestion d’un possible défaut de performance AIX . . . . . . . . . . . . .
Base de mesure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Compte rendu du problème . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Obtention et installation de PerfPMR (AIX version 3.2.5) . . . . . . . . . . . . . . . . . . . . . .
Installation de PerfPMR à partir du Web (inclut la version 4) . . . . . . . . . . . . . . . . . . .
Données d’analyse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Capture des données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
13-1
13-1
13-1
13-2
13-3
13-3
13-4
Annexe A. Commandes de contrôle et d’optimisation des performances AIX
Commande emstat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Commande schedtune . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Commande vmtune . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Script pdt_config . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Script pdt_report . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
A-1
A-5
A-6
A-9
A-12
A-13
Annexe B. Sous-routines liées aux performances . . . . . . . . . . . . . . . . . . . . . . . . .
B-1
Annexe C. Mémoire cache et adressage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Préliminaire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Adressage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Consultation du cache . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Consultation du TLB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Accès RAM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Implications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
C-1
C-1
C-1
C-3
C-4
C-4
C-5
Annexe D. Commande ld . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Exécutables rééditables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Bibliothèques de sous-routines prééditées . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Exemples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
D-1
D-1
D-1
D-2
Annexe F. Gestion de la mémoire des applications . . . . . . . . . . . . . . . . . . . . . . . .
F-1
AIX 4.3 Guide d’optimisation
Annexe G. Bibliothèques partagées . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Avantages et inconvénients . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Définition d’exécutables partagés ou non . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Choix de l’option appropriée . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
G-1
G-1
G-1
G-1
Annexe H. Accès à l’horloge du processeur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Accès à l’horloge unique d’une architecture POWER . . . . . . . . . . . . . . . . . . . . . . . . .
Accès aux registres d’horloge dans les systèmes PowerPC . . . . . . . . . . . . . . . . . . .
Exemple d’utilisation de la routine second . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
H-1
H-2
H-3
H-3
Annexe I. Support NLS (National Language Support) . . . . . . . . . . . . . . . . . . . . . .
Remarques sur la programmation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Quelques règles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Contrôle de l’environnement local . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
I-1
I-1
I-2
I-2
Annexe J. Récapitulatif des paramètres AIX optimisables . . . . . . . . . . . . . . . . .
Augmentation de la tranche horaire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
arpt_killc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Calcul de la priorité d’un processus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Compte biod . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Décompte nfsd . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
dog_ticks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Intervalle de réessai fork() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Intervalle syncd . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
ipforwarding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
ipfragttl . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
ipqmaxlen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
ipsendredirects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Limites des requêtes en sortie sur une carte disque . . . . . . . . . . . . . . . . . . . . . . . . . .
Longueur de file d’attente d’unité disque . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
loop_check_sum (version 3.2.5 seulement) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
lowclust (version 3.2.5 seulement) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
lowmbuf (version 3.2.5 seulement) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
lvm_bufcnt (AIX version 4.1 seulement) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
maxrandwrt (AIX version 4.1.3 et ultérieure) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
maxbuf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
max_coalesce . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
maxfree . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
maxperm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
maxpgahead . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
maxpin (AIX version 4.1 seulement) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
maxpout . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
maxttl . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
mb_cl_hiwat (version 3.2.5 seulement) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
minfree . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
minperm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
minpgahead . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
minpout . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
MTU . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
nfs_chars (version 3.2.5), nfs_socketsize (AIX version 4.1) . . . . . . . . . . . . . . . . . . . .
nfs_gather_threshold (AIX version 4.1 seulement) . . . . . . . . . . . . . . . . . . . . . . . . . . . .
nfs_portmon (version 3.2.5), portcheck (AIX version 4.1) . . . . . . . . . . . . . . . . . . . . . .
nfs_repeat_messages (AIX version 4.1 seulement) . . . . . . . . . . . . . . . . . . . . . . . . . . .
nfs_setattr_error (AIX version 4.1 seulement) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
nfsudpcksum (version 3.2.5), udpchecksum (AIX version 4.1) . . . . . . . . . . . . . . . . .
J-1
J-1
J-1
J-2
J-2
J-3
J-3
J-3
J-4
J-4
J-4
J-5
J-5
J-5
J-6
J-6
J-6
J-7
J-7
J-7
J-8
J-8
J-8
J-9
J-9
J-9
J-10
J-10
J-10
J-11
J-11
J-11
J-12
J-12
J-13
J-13
J-13
J-14
J-14
J-14
Préface
ix
x
nonlocsrcroute . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
npskill (AIX version 4.1 seulement) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
npswarn (AIX version 4.1 seulement) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
numclust (AIX version 4.1 seulement) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
numfsbuf (AIX version 4.1 seulement) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Paramètres de contrôle de charge mémoire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
pd_npages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
rec_que_size . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
rfc1122addrchk . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
rfc1323 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
sb_max . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
subnetsarelocal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Taille de l’espace de pagination . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
tcp_keepidle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
tcp_keepintvl . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
tcp_mssdflt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
tcp_recvspace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
tcp_sendspace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
tcp_ttl . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
thewall . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
udp_recvspace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
udp_sendspace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
udp_ttl . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
xmt_que_size . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
J-15
J-15
J-15
J-16
J-16
J-16
J-17
J-17
J-17
J-18
J-18
J-18
J-19
J-19
J-19
J-20
J-20
J-20
J-21
J-21
J-21
J-22
J-22
J-22
Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
X-1
AIX 4.3 Guide d’optimisation
A propos de ce manuel
Avertissement: Dans ce manuel, ce qui s’applique au DPX/20 s’applique également aux
systèmes Unix suivants : ESCALA et ESTRELLA.
Ce manuel, AIX - Guide d’optimisation, donne des informations sur les concepts, les outils
et les techniques d’évaluation et d’optimisation d’AIX sur les systèmes ESCALA. Il traite de
la conception et de l’implantation du système et des applications, ainsi que de l’optimisation
post-implantation de l’utilisation de la CPU et de la mémoire, et des E/S disque et de
communication. La plupart des conseils d’optimisation ont été testés ou validés sur la
version 3.2.5. Des précisions sur AIX version 4.1 sont également fournies. Les informations
qui ne s’appliquent qu’à AIX version 4.1 sont signalées dans le texte.
Destiné aux administrateurs système, programmeurs et utilisateurs finals concernés par
l’optimisation des systèmes AIX. Ce manuel suppose une bonne connaissance de
l’environnement d’exploitation AIX. Des sections de présentation permettent aux utilisateurs
moins chevronnés d’acquérir les notions indispensables et aux autres de se familiariser
avec la terminologie propre à l’optimisation.
Ce manuel est une version totalement revue du manuel AIX version 3.2 Performance
Monitoring and Tuning Guide, tant au niveau de la structure que des conseils fournis.
Notons notamment les modifications intervenues au niveau du conditionnement et du
contenu des outils d’analyse de performances dans AIX version 4.1.
Gestion des performances AIX : structure
Il existe des outils pour chaque phase de la gestion de l’optimisation d’AIX. Certains sont
fournis par Bull, d’autres par des fournisseurs tiers. La figure suivante illustre les phases de
cette analyse dans un environnement réseau local simple et indique les outils applicables à
chaque phase. Ce manuel donne également des informations sur chaque phase.
extension
planification installation
(inoccupé)
BEST/1
Predict
AIX SMIT
contrôle
optimisation
(déséquilibré)
(équilibré)
AIX BOS
Perf. Toolbox
AIX PDT
BEST/1 Monitor
AIX BOS
BEST/1 Acquire
(surchargé)
BEST/1
Predict
Phases d’analyse des performances et outils correspondants
Préface
xi
Outils et documentation
Le conditionnement des outils de performance permet à l’analyste de n’installer sur un
système que les outils requis pour contrôler et optimiser ce système. Les modules et leurs
principales fonctions sont décrits ci-après.
BEST/1
BEST/1 est un outil de planification de la capacité qui exploite des modèles de mise en file
d’attente pour préévaluer les performances d’une configuration donnée lors du traitement
d’une charge donnée. Les prévisions peuvent être fondées sur :
• les descriptions de charge issues d’une application,
• les données de la charge collectées par surveillance des systèmes existants.
BEST/1 est constitué de trois modules principaux :
Collect
Collecte des informations détaillées sur le traitement d’une charge par
un système existant.
Analyze
Transforme les informations détaillées en comptes rendus et en un
modèle de mise en file d’attente de l’activité de traitement de la charge.
Predict
Utilise le modèle de mise en file d’attente pour estimer les effets de
modification de la charge ou de la configuration sur les performances.
BEST/1 pour UNIX est un produit de BGS Systems, Inc. Vous pouvez contacter BGS
Systems au 1–800–891–0000 (aux Etats–Unis).
Outil de diagnostic des performances AIX (PDT)
L’outil Performance Diagnostic Tool (PDT), élément installable en option d’AIX version 4.1,
évalue la configuration du système et détermine les principaux axes d’utilisation des
ressources. Si PDT détecte un problème de performance, réel ou potentiel, il l’indique à
l’administrateur système. Ce manuel traite des fonctions de PDT.
Système d’exploitation de base AIX (BOS)
Le système d’exploitation de base AIX propose un certain nombre d’outils de contrôle et
d’optimisation, historiquement intégrés aux systèmes UNIX ou requis pour gérer les
caractéristiques d’implantation propres à AIX. Voici les fonctions et commandes BOS
essentielles à l’analyse des performances :
xii
iostat
Rapporte les statistiques relatives à la CPU et aux E/S.
lsattr
Affiche les attributs des unités.
lslv
Affiche des informations sur un volume logique ou les affectations de volumes
logiques sur un volume physique.
netstat
Affiche le contenu des structures de données relatives au réseau.
nfsstat
Affiche des statistiques sur les activités NFS (Network File System) et RPC
(Remote Procedure Call).
nice
Exécute une commande à un niveau de priorité supérieur ou inférieur à son
niveau normal.
no
Affiche ou définit des options réseau.
ps
Affiche l’état des processus.
renice
Modifie la priorité d’un ou de plusieurs processus.
reorgvg
Réorganise l’affectation des partitions physiques dans un groupe de volumes.
sar
Collecte et rend compte ou enregistre des informations sur l’activité du
système.
AIX 4.3 Guide d’optimisation
time
Imprime la durée d’exécution écoulée et les temps de traitement utilisateur et
système attribués à une commande.
trace
Enregistre et rend compte d’événements système sélectionnés.
vmstat
Rend compte de l’activité de la mémoire virtuelle et d’autres statistiques
système.
Les commandes BOS AIX sont décrites en détail dans les manuels de référence de
commandes d’AIX.
Boîte à outils Performance Toolbox (PTX)
La boîte à outils Performance Toolbox for AIX (PTX) propose des outils de contrôle et
d’optimisation de l’activité de systèmes locaux et distants. Ce produit sous licence est
constitué de deux composants principaux : PTX Manager et PTX Agent. PTX Agent est
disponible sous licence distincte sous l’appellation Performance Aide for AIX. La figure
illustre une configuration de réseau local simplifié où PTX Manager contrôle l’activité de
plusieurs systèmes.
Agent
Agent
Manager
Agent
xmperf
Display
Agent
Agent
Configuration de réseau local exploitant Performance Toolbox
L’objectif principal de PTX Manager est de collecter et d’afficher les données issues de
différents systèmes de la configuration. xmperf est le principal programme dédié à cet
objectif. Le principal programme utilisé par l’Agent pour collecter et transmettre les données
au Manager est xmservd.
Sous AIX version 4.1, outre les composants de base PTX, les produits sous licence
Performance Toolbox for AIX et Performance Aide for AIX proposent un ensemble d’outils
de contrôle et d’optimisation distinct, dont l’essentiel fait partie de BOS version 3.2.5 :
fdpr
Optimise un programme exécutable pour une charge de travail donnée.
filemon
Exploite l’utilitaire de suivi pour contrôler et rendre compte de l’activité
du système de fichiers AIX.
fileplace
Affiche la position des blocs d’un fichier dans des volumes physiques
ou logiques.
lockstat
Affiche des statistiques relatives aux verrouillages de noyau.
netpmon
Exploite l’utilitaire de suivi pour rendre compte de l’utilisation de CPU
par les E/S réseau et les activités relatives au réseau.
rmss
Simule des systèmes dotés de mémoires de tailles différentes pour
tester les performances.
svmon
Capture et analyse les informations concernant l’exploitation de la
mémoire virtuelle.
syscalls
Enregistre et compte les appels système.
Préface
xiii
tprof
Exploite l’utilitaire de suivi pour rendre compte de l’utilisation de CPU au
niveau module et instructions du code source.
bf
Rend compte des schémas d’accès mémoire des processus (AIX
version 4.1 seulement).
stem
Autorise l’instrumentation des entrées/sorties au niveau sous-routine
des exécutables existants (AIX version 4.1 seulement).
La principale documentation relative aux commandes et fonctions de PTX est le manuel
Performance Toolbox 1.2 and 2.1 for AIX: User’s Guide, bien que la syntaxe des outils cités
plus haut soit documentée dans le manuel AIX Commands Reference. L’utilisation des
commandes de la liste est intégrée aux divers scénarios de diagnostics et d’optimisation de
ce manuel.
Outil de collecte des données de performance PMR AIX (PerfPMR)
L’outil de collecte des données de performance PMR AIX (PerfPMR) sert à collecter les
données de performances et de configuration, à joindre à un rapport signalant un défaut
supposé au niveau des performances AIX. Ce manuel contient une description des
fonctions de PerfPMR.
Outils non pris en charge sous AIX version 4.1
Le programme rmap de compte rendu et de réduction des données de suivi n’est pas pris
en charge par AIX version 4.1.
Mode d’emploi du manuel
Contenu
Ce manuel est composé des chapitres et annexes suivants :
• Chapitre 1 : Performances : introduction à l’analyse des performances. Pour les
utilisateurs déjà familiers des techniques d’optimisation, ce chapitre a surtout l’intérêt de
présenter la terminologie propre à ce type d’opération.
• Chapitre 2 : Gestion des ressources AIX : structures et algorithmes de base des
principaux composants de gestion des ressources AIX.
• Chapitre 3 : Introduction au multitraitement : présentation des performances des
systèmes multi-traitement.
• Chapitre 4 : Planification, conception et implantation : éléments relatifs aux performances
à prendre en compte lors de la préparation d’une application.
• Chapitre 5 : Contrôle système et diagnostics des performances : étapes préliminaires de
détection d’un problème de performance.
• Chapitre 6 : Contrôle et optimisation de la CPU : techniques de vérification de l’utilisation
optimale des ressources CPU.
• Chapitre 7 : Contrôle et optimisation de la mémoire : détermination de la quantité de
mémoire réelle et virtuelle effectivement utilisée, et techniques pour éviter ou détecter les
insuffisances courantes.
• Chapitre 8 : Contrôle et optimisation des E/S disque : description de la dynamique des
E/S disque sous AIX et effet des choix utilisateur sur cette dynamique.
• Chapitre 9 : Contrôle et optimisation des E/S de communication : techniques
d’optimisation des différents types d’E/S de communication.
• Chapitre 10 : Optimisation des performances DFS : description des paramètres DFS
ayant une incidence sur les performances.
• Chapitre 11 : Analyse des performances avec l’utilitaire de suivi : explication détaillée de
l’exploitation de l’utilitaire de suivi, puissant outil d’optimisation et base de nombreux
autres outils décrits dans le manuel.
xiv
AIX 4.3 Guide d’optimisation
• Chapitre 12 : Outil de diagnostic PDT : description d’un nouvel outil d’AIX version 4.1, qui
évalue les configurations au niveau de leur équilibre et tient à jour un historique des
données de performance pour en identifier les tendances.
• Chapitre 13 : Gestion d’un possible défaut de performance AIX : description de la marche
à suivre pour signaler un possible défaut de performance au niveau d’AIX et du mode de
collecte et de transmission des données requises.
• Annexe A : Commandes de contrôle et d’optimisation des performances AIX : liste des
commandes AIX les plus utiles pour le contrôle et l’optimisation d’AIX et détail de la
syntaxe et des fonctions des commandes schedtune, vmtune, pdt_config et
pdt_report.
• Annexe B : Sous-routines liées aux performances : description de plusieurs sous-routines
liées aux performances.
• Annexe C : Mémoire cache et adressage : aperçu de l’impact des caches sur les
performances des programmes.
• Annexe D : Commande Id : techniques d’utilisation de l’éditeur de liens AIX.
• Annexe E : Outils de performance : consommation de ressources et temps de réponse
des outils de performance.
• Annexe F : Gestion de la mémoire des applications : distinction entre les versions
d’origine et courante des sous-routines malloc et realloc.
• Annexe G : Bibliothèques partagées : avantages et inconvénients des bibliothèques
partagées au niveau des performances.
• Annexe H : Accès à l’horloge du processeur : méthodes d’utilisation de l’horloge du
processeur pour calculer des durées.
• Annexe I : Support NLS (National Language Support) : effet de l’utilisation du
support NLS (National Language Support) d’AIX sur les performances.
• Annexe J : Récapitulatif des paramètres AIX optimisables : liste des paramètres d’AIX
modifiables par l’utilisateur, ayant une incidence directe ou indirecte sur les
performances.
Conventions typographiques
Voici les conventions typographiques adoptées dans ce manuel :
Gras
Commandes, sous-routines, mots-clés, fichiers, répertoires et autres
éléments dont le nom est prédéfini par le système. Objets graphiques à
sélectionner (boutons, étiquettes, icônes, etc.).
Italique
Paramètres dont le nom ou la valeur est fourni par l’utilisateur.
Espacement
fixe
Exemples (de valeurs spécifiques, de texte affiché, de code
programme), messages système ou données entrées par l’utilisateur.
ISO 9000
Ce produit répond aux normes qualité ISO 9000.
Bibliographie
Les manuels suivants concernent le contrôle des performances :
• AIX - Bibliographie, référence 86 F2 71WE.
• AIX 4.3 Guide de l’utilisateur : système d’exploitation et unités,
référence 86 F2 97HX.
• AIX 4.3 Guide d’administration : système d’exploitation et unités,
référence 86 F2 99HX.
Préface
xv
• AIX 4.3 Guide d’administration : communications et réseaux,
référence 86 F2 31JX.
• AIX Commands Reference, référence 86 A2 38JX à 86 A2 43JX.
• AIX General Programming Concepts : Writing and Debugging Programs,
référence 86 A2 34JX.
• AIX Technical Reference, Volume 1: Base Operating System and Extensions,
référence 86 A2 81AP.
• AIX Technical Reference, Volume 2: Base Operating System and Extensions,
référence 86 A2 82AP.
• Performance Toolbox 1.2 and 2.1 for AIX: User’s Guide, référence 86 A2 10AQ.
• Optimization and Tuning Guide for XL Fortran, XL C and XL C++,
référence 86 A2 99WG
• Comer, D., Internetworking with TCP/IP Vol I, 2nd ed., Englewood Cliffs:
Prentice-Hall, 1991.
• Ferrari, D., Serazzi, G., and Zeigner, A., Measurement and Tuning of Computer Systems,
New York: Prentice-Hall, 1983.
• Lazowska, D., Zahorjan, J., Graham, G., and Sevchik, K., Quantitative System
Performance, New York: Prentice-Hall, 1984.
• Leffler, McKusick, Karels, and Quarterman, The Design and Implementation of the
4.3 BSD Unix Operating System, Reading: Addison-Wesley, 1989.
• Smith, C. U., Performance Engineering of Software Systems, Reading:
Addison-Wesley, 1990.
• Stern, H., Managing NFS and NIS, Sebastopol, CA: O’Reilly & Associates, Inc., 1992.
Commande de manuels
Vous pouvez commander ces publications auprès de votre représentant commercial.
Si vous disposez du manuel AIX - Bibliographie, consultez–le.
xvi
AIX 4.3 Guide d’optimisation
Chapitre 1. Performances
Toute personne exploitant un ordinateur a son opinion sur ses performances.
Malheureusement, ces opinions sont souvent basées sur des idées simplistes quant à la
dynamique de l’exécution des programmes. Des intuitions non étayées peuvent conduire à
des interprétations erronées et coûteuses, sur les capacités d’un système et des solutions
aux problèmes de performance perçus.
Ce chapitre décrit le fonctionnement dynamique des programmes et les concepts utiles à
l’évaluation des performances d’un système. Elle comporte les sections suivantes :
• Vitesse d’exécution : introduction à la mesure des performances.
• Estimation de la charge : détermination des objectifs de performances.
• Dynamique d’exécution des programmes : identification des points de ralentissement
durant l’exécution des programmes.
• Dynamique système : description de l’interaction des programmes.
Vitesse d’exécution
Les termes de ”vitesse” et de ”rapidité”, que l’on continue d’employer pour décrire les
ordinateurs, font référence à une réalité aujourd’hui dépassée. Le temps n’est plus en effet
où il était possible de lire un programme, de calculer la somme des durées d’exécution de
ses instructions pour évaluer son temps d’exécution. Le travail de milliers de programmeurs
et d’ingénieurs depuis trente ans a rendu ce type de calcul sinon impossible, du moins
dénué de sens.
Les machines d’aujourd’hui sont plus puissantes que leurs ancêtres. Le remplacement des
lampes à vide par des circuits intégrés et le raccourcissement significatif des cycles
d’exécution ont certes contribué à cette évolution, mais les innombrables nouveautés en
matière d’architecture matérielle et logicielle ont été décisives. Chaque avancée en terme
de densité de circuit intégré fait progresser d’autant les performances, non seulement parce
qu’une même opération est alors exécutable sur une surface moindre à une vitesse
d’horloge supérieure, mais aussi parce que le gain d’espace induit offre aux ingénieurs un
nouvel espace d’expérimentation. Bref, les machines ont vu leur capacité s’accroître en
gagnant à la fois en complexité et en rapidité.
La complexité des machines modernes et des systèmes d’exploitation va de pair avec celle
de leur environnement. Outre l’exécution de programmes individuels, les ordinateurs ont
aujourd’hui à gérer un nombre variable d’interruptions imprévisibles issues des unités d’E/S
et de communication. Au point que les meilleures idées des ingénieurs, basées sur
l’hypothèse d’un seul programme exécuté sur une machine autonome, sont aujourd’hui
largement rattrapées et dépassées par les impondérables du monde réel. Dès lors qu’il est
tenu compte de ce caractère aléatoire, certaines erreurs peuvent être compensées. Les
gains et les pertes varient ainsi d’un programme à l’autre au cours du temps.
Le solde net entre les gains et les pertes au niveau logiciel et matériel donne la
performance du système. La ”rapidité” d’un système est le débit avec lequel il traite une
séquence spécifique de demandes. Si les demandes s’imbriquent bien aux architectures
matérielle et logicielle du système, on peut dire : ”Le système exécute rapidement cette
charge de travail.” Nous ne pouvons pas dire ”Le système est rapide”—ou du moins, nous
ne le devrions pas.
Performances
1-1
Estimation de la charge
L’évaluation complète et exacte de la charge d’un système est déterminante pour la
prévision et l’analyse de ses performances. Toute variation de la charge a en effet
davantage d’incidence sur la mesure des performances qu’une différence au niveau de la
vitesse d’horloge CPU ou de la taille de la RAM. La charge du système doit tenir compte
non seulement du type et du débit des demandes soumises, mais aussi de l’ensemble des
modules logiciels et des programmes d’application internes impliqués.
Il convient de suivre au mieux l’activité des utilisateurs des applications existantes pour
disposer d’une évaluation exacte et dynamique de leur interaction avec les stations de
travail et les terminaux.
Veillez à inclure dans votre évaluation l’activité ”sous–jacente” du système. Par exemple, si
le système est doté de systèmes de fichiers NFS fréquemment sollicités par d’autres
systèmes, vous devez considérer ces accès comme une portion significative de la charge
globale, même si le système ne joue pas officiellement le rôle de ”serveur”.
Un raccourci risqué : les bancs d’essai standard
Un banc d’essai est une charge normalisée destinée à servir de référence dans la
comparaison de systèmes dissemblables. Tout banc d’essai suffisamment éprouvé, devenu
”standard de facto de l’industrie”, est bien entendu étudié de façon exhaustive par les
développeurs : systèmes d’exploitation, compilateurs et, dans certains cas, matériels ont
été optimisés pour exploiter ce banc d’essai dans des temps record.
Mais, dans la réalité, les charges de travail concordent rarement avec les algorithmes et
l’environnement d’un banc d’essai. En effet, ces bancs d’essai standard, issus
d’applications réelles, ont généralement été simplifiés et homogénéisés pour s’adapter à
une grande variété de plates–formes matérielles. Par ailleurs, leur environnement
d’exploitation a été restreint afin d’offrir des conditions de mesure reproductibles.
Autrement dit, un raisonnement du type ”le système A offre un débit en méga–x de 50 %
supérieur au système B, donc le système A doit exécuter mon programme 50 % plus vite
que le système B” est tentant mais faux. Aucun banc d’essai n’offre une telle applicabilité
universelle. La seule utilité réelle d’un banc d’essai est de réduire le champ des systèmes
candidats à une évaluation sérieuse. Il n’existe pas de substitut pour réaliser une analyse
claire de votre charge de travail et des performances systèmes impliquées.
Objectifs de performances
Une fois la charge de travail évaluée, vous pouvez définir vos critères de performances et
fixer vos objectifs en conséquence. Les principaux critères de performances globales des
systèmes informatiques sont le temps de réponse et le débit. Le temps de réponse est le
laps de temps écoulé entre le lancement d’une opération et l’obtention des informations
utiles pour la reprise du travail, alors que le débit est le nombre d’opérations comprises
dans la charge de travail et pouvant être accomplies par unité de temps. La relation entre
ces mesures est complexe. Dans certains cas, vous devez modifier les deux mesures. Dans
d’autres, une seule modification suffit à améliorer la situation.
Pour une optimisation planifiée, vous devez déterminer clairement vos objectifs en termes
de temps de réponse et de débit pour une charge de travail précise. Faute de quoi, vous
risquez de perdre temps et argent pour l’amélioration d’un aspect secondaire du système.
Dynamique d’exécution des programmes
Généralement, un programmeur conçoit son programme comme une séquence continue
d’instructions exécutant une fonction spécifique. Beaucoup d’efforts et de créativité ont été
déployés, au niveau du système d’exploitation et du matériel, pour conserver aux
programmeurs cette vision idéalisée, leur évitant trop de questions sur les notions d’espace,
de vitesse et de multiprogrammation/multitraitement. Les programmes reposant sur cette
vision illusoire risquent d’être inutilement coûteux (en temps) et inefficaces en termes de
performances.
1-2
AIX 4.3 Guide d’optimisation
Une analyse claire des performances liées à une charge de travail doit s’appuyer sur un
modèle dynamique et non statique de l’exécution d’un programme, comme illustré à la
figure Hiérarchie d’exécution d’un programme ci–dessous.
Matériel
Pipeline processeur
Cache
TLB
Mémoire
réelle
Système d’exploitation
Instruction courante
Routine en cours de diffusion
Routines diffusables
Routines en attente/
Gestionnaires
d’interruption
Disque
Programmes
exécutables
Hiérarchie d’exécution d’un programme
Lors de son exécution, un programme traverse, de façon plus ou moins parallèle, la
hiérarchie matérielle et logicielle. Plus l’on s’élève dans la hiérarchie matérielle, plus les
éléments sont rares et coûteux. La transition d’un niveau à l’autre prend du temps, d’autant
que, pour chaque ressource, le programme se trouve en concurrence avec d’autres. Pour
analyser la dynamique d’un programme, il faut en appréhender le fonctionnement à chaque
niveau hiérarchique.
Hiérarchie matérielle
En général, le temps requis pour passer d’un niveau matériel à l’autre correspond
approximativement au délai de latence de niveau inférieur – laps de temps entre l’émission
d’une requête et la réception des premières données.
Disques fixes
Lors de l’exécution d’un programme, l’opération la plus coûteuse en temps (hormis une
entrée manuelle au clavier) est la récupération de code ou de données stockés sur disque :
• le contrôleur de disque doit savoir à quels blocs accéder (temps d’attente en file) ;
• le bras du disque doit trouver le cyclindre concerné (temps de recherche) ;
• les têtes de lecture et d’écriture doivent attendre le positionnement et la rotation des
blocs recherchés (délai de rotation) ;
• les données doivent être transmises au contrôleur (temps de transmission) et transférées
au programme d’application (temps de traitement des interruptions).
Les opérations sur disque ont des origines diverses qui ne se limitent pas aux demandes
explicites d’E/S effectuées par un programme. Une grande part de l’optimisation du système
consiste souvent à éliminer les E/S disque inutiles.
Mémoire réelle
La RAM est plus rapide que le disque, mais elle consomme davantage par octet. Les
systèmes d’exploitation tentent de conserver dans la RAM les codes et données
fréquemment utilisés et de transférer les données en sus sur le disque (ou du moins de ne
pas les transférer initialement sur la RAM).
Cependant, la RAM n’est pas nécessairement plus rapide que le processeur. Sur un
ESCALA, un délai de latence RAM de plusieurs cycles processeurs s’écoule entre le
Performances
1-3
moment où le matériel détecte la nécessité d’un accès RAM et celui où les données ou les
instructions sont mises à disposition du processeur.
Si l’accès se fait sur une page de mémoire virtuelle stockée qui a été sur disque (ou
destinée à l’être), un défaut de page se produit et le programme est suspendu jusqu’à ce
que la page soit lue depuis le disque.
Tampons TLB (Translation Lookaside Buffer)
La mémoire virtuelle est l’un des moyens permettant de libérer les programmeurs de tout
souci quant aux limites physiques du système. Ils peuvent concevoir et coder des
programmes sans se préoccuper de la capacité mémoire effective : c’est le système qui se
charge de traduire les adresses virtuelles des données et instructions du programme en
adresses réelles, requises pour récupérer ces données et instructions en RAM. Pour limiter
ces opérations de traduction, coûteuses en temps, les adresses réelles des pages de
mémoire virtuelle récemment sollicitées sont conservées dans une mémoire cache appelée
tampon TLB (Translation Lookaside Buffer). Ainsi, tant que le programme sollicite un même
jeu réduit de pages de données et de programmes, il est inutile de retraduire les adresses à
chaque accès à la RAM. En revanche, si le système tente d’accéder à une page de
mémoire virtuelle qui ne bénéficie pas d’une entrée TLB (absence en TLB), des dizaines de
cycles processeurs (attente pour absence en TLB) sont généralement nécessaires pour
traduire les adresses.
Mémoires cache
Pour limiter la fréquence des délais de latence RAM, les ESCALA sont équipés de
mémoires cache destinées aux instructions et aux données. Si l’instruction ou les données
requises se trouvent déjà en mémoire cache (présence en cache), elles sont mises à
disposition du processeur dès le cycle suivant (sans délai d’attente) ; sinon (absence en
cache), un temps d’attente RAM se produit.
Certains systèmes disposent de deux niveaux de mémoire cache, appelés généralement L1
et L2. Si une recherche est infructueuse sur le niveau L1, elle se poursuit sur le niveau L2.
En cas de nouvel échec, la recherche est reportée sur la RAM.
Sur les ESCALA, la taille et la structure des mémoires cache varient en fontion du modèle
mais leur principe d’exploitation est identique. Reportez–vous à l’annexe C, Mémoire cache
et adressage pour une présentation détaillée de l’architecture des mémoires cache et TLB pour information ou pour optimiser un programme de niveau inférieur.
Pipeline et registres
L’architecture en pipeline, très évolutive, du ESCALA rend possible, dans certains cas, le
traitement simultané de plusieurs instructions. De vastes ensembles de registres généraux
et de registres à virgule flottante permettent de conserver une quantité considérable de
données de programme dans les registres, au lieu de les stocker et de les recharger
continuellement.
Les compilateurs d’optimisation du ESCALA sont conçus pour exploiter au mieux ces
fonctionnalités. Il est conseillé de recourir aux compilateurs à chaque génération d’un
programme exécutable (même court). Le manuel Optimization and Tuning Guide for XL
Fortran, XL C and XL C++ explique comment optimiser les programmes.
Hiérarchie logicielle
Lors de son exécution, un programme doit également traverser diverses étapes dans la
hiérarchie logicielle.
Programmes exécutables
Lorsqu’un utilisateur demande l’exécution d’un programme, AIX accomplit un certain
nombre d’opérations pour rendre opérationnel le programme exécutable sur disque. Tout
d’abord, le système recherche dans les répertoires spécifiés à la variable d’environnement
courante PATH de l’utilisateur la copie correcte du programme. Ensuite, le programme de
1-4
AIX 4.3 Guide d’optimisation
chargement du système (à ne pas confondre avec l’éditeur de liens ld) résout toutes les
références externes du programme aux bibliothèques partagées.
Le système d’exploitation soumet la requête de l’utilisateur sous forme d’un processus,
c’est–à–dire d’un ensemble de ressources, tel qu’un segment d’adresse virtuelle privée,
comme le requiert tout programme exécutable.
Sous AIX version 4.1, le système d’exploitation crée en outre automatiquement une routine
unique à l’intérieur de ce processus. Une routine est l’état d’exécution actuel d’une seule
instance d’un programme. Sous AIX version 4.1, l’accès au processeur et à d’autres
ressources est affecté sur la base de routines et non de processus. Un programme
d’application peut créer plusieurs routines au sein d’un processus. Ces routines partagent
les ressources du processus dont elles dépendent.
Enfin, le système se branche sur le point d’entrée du programme. Si la page de programme
contenant ce point d’entrée n’est pas encore chargée en mémoire (cas notamment d’un
programme récemment compilé, exécuté ou copié), l’interruption pour défaut de page
provoque la lecture de la page.
Gestionnaires d’interruption
Lorsqu’un événement externe se produit, le système d’exploitation en est averti par une
interruption de la routine en cours et le contrôle est transféré à un gestionnaire
d’interruptions. Au préalable, l’essentiel de l’état matériel doit être sauvegardé pour que le
contexte de la routine puisse être restauré une fois l’interruption traitée. Les gestionnaires
d’interruption appelés pour la première fois subissent tous les temps d’attente liés au
passage dans la hiérarchie matérielle (excepté ceux causés par des défauts de page). Sauf
exécution très récente du gestionnaire d’interruption (ou programmes impliqués
particulièrement économiques), il est peu probable que les codes ou les données soient
conservés dans les tampons TLB ou les mémoires cache.
Lorsque la routine interrompue est relancée, son contexte d’exécution (contenu des
registres par exemple) est logiquement restauré pour que la routine fonctionne
normalement. En revanche, le contenu des tampons TLB et des mémoires cache doit être
reconstitué à partir des demandes de programme qui ont suivi. Le gestionnaire
d’interruption et la routine d’exécution subissent généralement des temps d’attente
importants du fait des absences en mémoire cache et en TLB résultant de l’interruption.
Routines en attente
Chaque fois qu’une requête soumise par un programme ne peut être satisfaite
immédiatement (par exemple, opération d’E/S explicite ou consécutive à un défaut de
page), la routine est mise en attente jusqu’à l’exécution de la requête. Généralement, des
temps d’attente dans les tampons TLB et en mémoire cache s’ajoutent au temps requis
pour l’exécution de la requête.
Routines diffusables
Une routine diffusable mais non encore exécutée est plus préjudiciable qu’utile. En effet, si
parallèlement, des routines sont en cours d’exécution, les lignes de mémoire cache (zones
du cache contenant les instructions et/ou les données de la routine – voir annexe C :
”Mémoire cache et adressage”) peuvent être réutilisées et les pages de mémoire virtuelle
appelées, retardant davantage la diffusion de la routine.
Routine en cours de diffusion
Le programmateur choisit la routine dont la demande de processeur est la plus forte. (Les
considérations qui affectent ce choix sont discutées dans ”Performance du programmateur
de CPU AIX”, page 2-2.) Une fois la routine diffusée, l’état logique du processeur au
moment de l’interruption de la routine est restauré.
Instructions courantes
Sur les ESCALA, la plupart des instructions machine sont à même d’exécuter un cycle
processeur unique, à condition de ne pas rencontrer d’absence en cache ou en TLB. En
Performances
1-5
revanche, si un programme se branche rapidement sur différentes zones de l’exécutable
et/ou accède à des données issues de zones très diverses (générant un taux d’absence en
cache et TLB élevé), le nombre moyen de cycles processeur par instruction exécutée peut
être bien supérieur à un. On dit alors que le programme montre un faible ”regroupement
référentiel”. Il peut utiliser le nombre minimum d’instructions nécessaires pour accomplir le
travail mais consommer un nombre excessif de cycles. Cette disparité entre le nombre
d’instructions et le nombre de cycles explique en partie qu’il n’est plus possible d’obtenir
directement une valeur de temps en calculant simplement la ”longueur du parcours” sur le
listing du programme. Si un parcours réduit est généralement plus rapide qu’un long
parcours, le rapport de vitesse peut différer sensiblement du rapport de longueur de
parcours.
Les compilateurs XL réorganisent les codes selon des mécanismes très sophistiqués pour
réduire le nombre de cycles nécessaires à l’exécution du programme. Le premier souci du
programmeur désireux d’optimiser les performances doit être de fournir au compilateur
toutes les informations requises et non de tenter de deviner et d’appliquer ses techniques.
(Reportez–vous à ”Utilisation des préprocesseurs et des compilateurs XL”, page 4-14.) Le
seul moyen de vérifier l’efficacité de l’optimisation est de mesurer les performances d’une
charge de travail réelle.
Dynamique système
Créer des programmes individuels les plus efficaces possible ne suffit pas. Généralement,
la personne responsable des performances n’a pas participé à la création des programmes
effectivement exécutés. En outre, la plupart des niveaux de la hiérarchie décrits
précédemment sont gérés par une ou plusieurs parties d’AIX. Dans tous les cas, dès lors
que des programmes d’application ont été acquis et optimisés au mieux, le seul moyen
d’améliorer les performances globales du système est d’intervenir au niveau du système.
Les principaux éléments concernés sont :
Disques fixes
Le gestionnaire de volume logique (LVM) contrôle l’emplacement
des systèmes de fichiers et des espaces de pagination sur le
disque, or l’emplacement peut avoir un impact important sur le
temps de recherche nécessaire au système.
Les pilotes d’unité de disque contrôlent l’ordre de traitement des
requêtes d’E/S.
Mémoire réelle
Le gestionnaire de mémoire virtuelle (VMM) contrôle le pool des
trames de mémoire virtuelle disponibles et détermine quand et à
qui voler des trames pour réalimenter le pool.
Routine en cours
Le programmateur détermine l’entité diffusable qui prendra le
contrôle ensuite. (Sous AIX version 4.1, l’entité diffusable n’est
plus un processus mais une routine. Reportez–vous à ”Prise en
charge des routines sous AIX version 4.1”, page 2-2).
E/S de
communication
Selon le type de charge et de liaison de communication, il peut
être nécessaire de moduler la configuration des pilotes d’unité de
communication, TCP/IP ou NFS.
Classes de charge de travail
Les charges de travail se répartissent généralement en un nombre limité de classes. Les
types ci–dessous servent le plus souvent à classifier des systèmes. Mais, un seul système
étant généralement sollicité pour traiter plusieurs classes, le terme ”charge de travail”
semble plus approprié dans un contexte de performance.
1-6
AIX 4.3 Guide d’optimisation
Station de
travail
Charge de travail constituée d’un seul utilisateur qui soumet des
travaux via le clavier natif du système et en reçoit les résultats sur la
console native. En règle générale, l’objectif de performance prioritaire
est, dans ce cas, un temps de réponse minimal pour le demandeur.
Multi–
utilisateur
Charge de travail constituée de plusieurs utilisateurs qui soumettent
des travaux via leurs terminaux respectifs. En règle générale, l’objectif
de performance prioritaire est, dans ce cas, un débit maximum avec un
temps de réponse assorti d’un seuil maximal, ou un temps de réponse
optimal pour une charge de travail relativement constante.
Serveur
Charge de travail constituée de requêtes issues d’autres systèmes. Par
exemple, la charge de travail d’un serveur de fichiers se compose en
majorité de requêtes de lecture/écriture sur disque. Il s’agit, en
substance, du composant E/S disque d’une charge multiutilisateur
(avec en sus l’activité NFS ou DFS), le même objectif de débit maximal
avec un temps de réponse limite s’applique. Les charges de serveur
peuvent également se composer de programmes de calcul intensifs,
transactions de bases de données, travaux d’impression, etc.
Lorsqu’un seul système traite des charges de travail de plusieurs types, utilisateurs et
analyste des performances doivent s’être préalablement concertés sur les priorités relatives
des objectifs en cas de conflit entre diverses charges de travail.
Performances
1-7
Procédure d’optimisation
L’optimisation est avant tout une question de gestion des ressources et de configuration du
système. Voici les étapes de la procédure préconisée :
1. Identification des charges de travail sur le système.
2. Définition des objectifs :
a. Détermination de la méthode d’évaluation des résultats.
b. Quantification et hiérarchisation des objectifs.
3. Identification des ressources critiques limitant les performances du système.
4. Réduction des contraintes de ressources critiques :
a. Utilisation de la ressource la plus appropriée, si le choix est possible.
b. Réduction des contraintes de ressources critiques au niveau des programmes et des
fonctions système.
c. Utilisation parallèle des ressources.
5. Modification de l’affectation des ressources en fonction des priorités :
a. Modification de la priorité ou des limites de ressources au niveau des programmes.
b. Modification de la configuration des paramètres de gestion des ressources système.
6. Répétition des étapes 3 à 5 jusqu’à ce que les objectifs soient atteints (ou les ressources
saturées).
7. Mise en œuvre de ressources supplémentaires, le cas échéant.
Identification des charges de travail
Identification des charges de travail Il est essentiel d’identifier tous les travaux exécutés sur
le système. Sur les systèmes connectés à un réseau local notamment, un ensemble
complexe de systèmes de fichiers montés en croisements peut facilement se développer,
avec un simple accord informel des utilisateurs des systèmes. Ces éléments doivent être
identifiés et pris en compte lors de l’optimisation.
Dans le cas de charges multiutilisateur, l’analyste doit quantifier le volume moyen et
maximal des requêtes. Il est essentiel de faire une évaluation réaliste de la durée
d’utilisation effective du terminal par un utilisateur.
Il convient de déterminer le système sur lequel effectuer les mesures et l’optimisation :
système de production ou autre (ou hors des périodes d’exploitation) avec une version
simulée de la charge effective. Il incombe à l’analyste de choisir entre, d’une part, les
résultats issus d’un environnement de production – par nature, plus proches de
la réalité – et, d’autre part, la productivité maximale réalisable dans un environnement non
productif (conditions permettant de pratiquer des tests sans risquer de nuire aux
performances du système).
Définition des objectifs
Les objectifs doivent être définis quantitativement, même si le résultat souhaité est souvent
exprimé en termes subjectifs (par exemple, un temps de réponse ”satisfaisant”). De plus,
l’analyste doit viser à améliorer ce qui est important même s’il est plus tentant d’intervenir
sur ce qui est mesurable. Si aucune mesure fournie par le système ne correspond aux
améliorations recherchées, il vous incombe d’en fixer une.
Quantifier les objectifs a certes pour finalité d’orienter l’optimisation vers la réalisation des
valeurs fixées, mais a surtout un rôle essentiel quant à la liberté d’action de l’analyste.
Il s’agit en effet de définir, en concertation avec les utilisateurs, les priorités à respecter.
Faute de cette entente préalable, l’analyste se verra sans cesse contraint de consulter les
1-8
AIX 4.3 Guide d’optimisation
intéressés, de justifier les mesures qu’il prend, etc. Perte de temps et d’énergie :
l’optimisation du travail de l’analyste laisserait beaucoup à désirer. Si l’exploitation et la prise
en charge du système sortent du cadre de l’entreprise, il convient de recourir à un accord
de service écrit entre utilisateurs et fournisseurs pour s’assurer que les objectifs de
performance et les priorités ont été clairement compris.
Identification des ressources critiques
En général, les performances d’une charge donnée sont déterminées par la disponibilité et
la rapidité d’une ou deux ressources système critiques. L’analyste se doit de les identifier
précisément pour ne pas s’enfermer dans une boucle sans fin de tests et d’erreurs.
Les systèmes sont dotés de ressources réelles et logiques. Les ressources critiques réelles
sont généralement plus faciles à identifier, grâce aux nombreux outils de performances
système disponibles qui en testent l’utilisation. Voici les ressources réelles dont l’impact sur
les performances est le plus fréquent :
• cycles CPU,
• mémoire,
• bus d’E/S,
• cartes diverses,
• bras de disque,
• espace disque,
• accès réseau.
L’identification des ressources logiques est moins évidente. Il s’agit généralement
d’abstractions de programmation qui partitionnent les ressources réelles. Le partitionnement
permet le partage et la gestion des ressources réelles.
Voici des exemples de ressources réelles partionnées en ressources logiques :
CPU
• Tranche horaire CPU
Mémoire
• Trames de page
• Piles
• Tampons
• Files d’attentes
• Tables
• Verrous et sémaphores
Espace disque
• Volumes logiques
• Systèmes de fichiers
• Fichiers
• Partitions
Accès réseau
• Paquets
• Canaux
Il est essentiel de tenir compte des deux types de ressources. En effet, des routines
peuvent être bloquées faute de ressources logiques comme de ressources réelles.
Performances
1-9
Augmenter la ressource réelle impliquée ne garantit pas la création de ressources logiques
supplémentaires. Prenons, par exemple, un démon d’E/S de bloc NFS (biod,
reportez-vous à ”Optimisation de NFS”, page 9-36). Un biod est requis sur le client pour
traiter chaque requête NFS d’E/S distante en attente. Le nombre d’opérations d’E/S NFS
simultanées est donc limité par le nombre de biod. En cas de pénurie de biod, les
indicateurs de mesure du système signalent que les liaisons CPU et de communications
sont relativement peu utilisées. Vous pouvez ainsi avoir l’impression fausse que le système
est sous-utilisé (et trop lent). Or, il s’agit simplement d’un manque de biod qui limite
l’activité du reste des ressources. Un biod utilise des cycles processeur et de la mémoire,
mais vous ne pouvez résoudre ce problème en ajoutant simplement de la mémoire réelle ou
en passant à une CPU plus rapide. La solution consiste à créer davantage de ressources
logiques (biod).
Des ressources logiques et des goulots d’étranglement peuvent être créés par inadvertance
pendant la développement d’applications. Une méthode de transmission des données ou de
contrôle d’une unité peut en effet être à l’origine de la création d’une ressource logique.
Dans ce cas, vous ne disposez généralement d’aucun outil pour gérer l’utilisation des
ressources créées ni d’interface pour contrôler leur affectation. Par ailleurs, leur existence
n’est souvent révélée que lorsque survient un problème spécifique.
Réduction des contraintes de ressources critiques
Choix de la ressource
Privilégier une ressource doit être le fruit d’une analyse minutieuse guidée par des objectifs
précis. Par exemple, pour le développement d’une application, il peut être décidé d’opter
pour une consommation CPU mininale, au détriment de la consommation de mémoire.
De même, lors de la configuration du système, il faut décider du lieu de stockage des
fichiers : localement sur une station de travail ou à distance sur un serveur.
Réduction des contraintes
Les applications développées localement doivent être étudiées pour déterminer la
possibilité d’augmenter l’efficacité d’une fonction ou de supprimer des fonctions inutiles.
Au niveau de la gestion du système, il peut être envisagé de transférer sur d’autres
systèmes ou de différer les charges peu prioritaires demandant l’accès à des ressources
critiques.
Utilisation parallèle des ressources
Pour leur exécution, les charges de travail requièrent plusieurs ressources système. Il faut
donc exploiter le fait que celles-ci soient séparées et utilisables en parallèle. Par exemple,
les algorithmes de lecture anticipée sous AIX détectent qu’un programme accède à un
fichier séquentiellement et planifient la lecture parallèlement au traitement par l’application
des données précédentes. Ce traitement en parallèle s’applique également à la gestion du
système. Par exemple, si une application accède à plusieurs fichiers simultanément, ajouter
une unité de disque et répartir les fichiers concernés sur plusieurs disques ne peut
qu’améliorer le taux d’E/S disque.
Modification de l’affectation des ressources en fonction des priorités
AIX offre plusieurs méthodes pour affecter des niveaux de priorités aux activités. Certaines,
telles que la régulation disque, sont définies au niveau système. D’autres, telles que la
priorité des processus, peuvent être définies par chaque utilisateur en fonction de
l’importance attribuée à une tâche donnée.
Répétition des étapes d’optimisation
Dans l’analyse des performances, il faut toujours partir du principe qu’un autre goulot
d’étranglement va se produire. Diminuer l’exploitation d’une ressource se traduit
nécessairement par la réduction du débit ou l’augmentation du temps de réponse d’une
autre ressource. Prenons un exemple.
1-10
AIX 4.3 Guide d’optimisation
CPU: 90%
Disk: 70%
Memory 60%
La charge de ce système est concentrée sur la CPU. Si l’on régule la charge de façon à
ramener le taux d’utilisation de la CPU à 45 %, il est probable que les performances soient
doublées. En contrepartie, la charge est limitée au niveau des E/S, comme suit :
CPU: 45%
Disk: 90%
Memory 60%
L’amélioration côté CPU permet aux programmes de soumettre plus rapidement les
requêtes de disque mais la capacité maximale de l’unité de disque est alors atteinte.
L’amélioration effective des performances est en fait de l’ordre de 30 % au lieu des 100 %
escomptés.
Il y a toujours une nouvelle ressource critique. La question est de savoir si les objectifs ont
été atteints avec les ressources disponibles.
Mise en œuvre de ressources supplémentaires
Si toutes les méthodes précédentes n’ont pas permis d’atteindre les objectifs de
performancee du système, il faut envisager d’améliorer ou d’augmenter la ressource
critique. S’il s’agit d’une ressource logique et que la ressource réelle correspondante
convient, la ressource logique peut être augmentée sans surcoût. S’il s’agit d’une ressource
réelle, plusieurs questions se posent :
• De combien la ressource critique doit-elle être augmentée pour mettre fin au goulot
d’étranglement ?
• Cette extension sera-t-elle suffisante pour atteindre les objectifs de performance du
système ?
• Ou une autre ressource sera-t-elle saturée avant cela ? Dans le cas où plusieurs
ressources critiques successives se présentent, est-il plus économique de les augmenter
toutes ou de transférer une partie de la charge actuelle sur un autre système ?
Performances
1-11
Essais comparatifs – les données de performance sont
inévitablement modifiées
Lorsque l’on compare les performances d’un logiciel donné dans plusieurs environnements
différents, un certain nombre d’erreurs, techniques et conceptuelles, sont possibles. La
présente section est une simple mise en garde. D’autres sections de ce manuel traitent des
différents moyens de mesure des temps écoulés et des temps spécifiques aux processus.
Lorsque l’on mesure le temps (mesuré sur l’horloge murale) nécessaire au traitement d’un
appel système, on obtient un nombre qui constitue la somme des éléments suivants :
• Temps réel d’exécution des instructions de traitement du service.
• Plusieurs périodes de temps pendant lesquelles le processeur a été bloqué dans l’attente
d’instructions ou de données en provenance de la mémoire (coût des absences en
mémoire cache et/ou en TLB).
• Temps requis pour accéder à ”l’horloge” en début et en fin d’appel.
• Temps utilisé par les événements réguliers tels que les interruptions de l’horloge
système.
• Temps utilisé par les événements plus ou moins aléatoires tels que les interruptions
d’entrée-sortie.
Pour minimiser les risques d’erreur, nous mesurons généralement plusieurs fois la charge
de travail. Dans la mesure où tous les facteurs externes s’ajoutent au temps réel,
l’ensemble des mesures produit généralement la courbe suivante :
Valeur “réelle”
Moyennes des valeurs mesurées
Répartition des
valeurs mesurées
Le faible niveau de la courbe en son extrémité peut indiquer une mise en mémoire cache
optimale de faible probabilité ou résulter de l’arrondissement des valeurs.
Un événement externe régulier peut entraîner la présence de deux maxima sur la courbe.
Exemple :
Valeur “réelle”
1-12
AIX 4.3 Guide d’optimisation
Moyenne
Une ou deux interruptions longues peuvent modifier encore davantage le tracé de la
courbe :
Valeur “réelle”
Moyenne
La répartition des mesures autour de la valeur ”réelle” n’est pas aléatoire. Il convient donc
d’appliquer avec précaution les tests classiques de statistiques par déduction. En outre,
dans certains cas, ni la moyenne, ni la valeur ”réelle” ne caractérisent correctement les
performances.
Voir aussi
CPU
• ”Performances du programmateur de CPU sous AIX” : traite de la gestion de la CPU
sous AIX.
• ”Contrôle et optimisation de la CPU” : présente les outils et techniques de gestion de la
CPU.
Mémoire
• ”Performances du gestionnaire de mémoire virtuelle (VMM)” : décrit l’architecture de
gestion de mémoire AIX.
• ”Contrôle et optimisation de la mémoire” : présente les outils et techniques de gestion de
la mémoire.
Disques
• ”Gestion AIX du stockage sur disque fixe” : décrit la structure du support disque fixe sous
AIX.
• ”Préinstallation du disque” : traite de la planification des informations sur les
performances relatives des disques fixes de ESCALA.
• ”Contrôle et optimisation des E/S disque” : traite du contrôle de la réorganisation et de
l’extension du stockage sur disque.
Performances
1-13
1-14
AIX 4.3 Guide d’optimisation
Chapitre 2. Gestion des ressources AIX
Ce chapitre décrit les composants AIX de gestion des ressources ayant le plus d’impact sur
les performances du système et indique comment les optimiser. Pour des conseils
d’optimisation sur une ressource spécifique, reportez-vous au chapitre correspondant.
• ”Performances du programmateur CPU sous AIX”
• ”Performances du gestionnaire de mémoire virtuelle (VMM)”
• ”Performances de gestion AIX du stockage sur disque fixe”
Pour des conseils d’optimisation spécifiques, reportez-vous à :
• ”Contrôle et optimisation de la CPU”
• ”Contrôle et optimisation de la mémoire”
• ”Contrôle et optimisation des E/S disque”
Gestion des ressources AIX
2-1
Performances du programmateur CPU sous AIX
Le programmateur CPU a été largement remanié du fait de la nouvelle prise en charge des
routines sous AIX version 4.1. D’un point de vue conceptuel, l’algorithme de planification et
la politique d’attribution des priorités n’ont pas changé par rapport à la version 3.2.5, mais
dans le détail, nombre de modifications ont été apportées. Pour les applications non
modifiées et exécutées sur des monoprocesseurs, l’impact net des modifications est très
faible. Cependant, toute personne concernée par l’optimisation des performances doit être
à même de comprendre les modifications et les nouvelles opportunités qui sont offertes.
Prise en charge des routines sous AIX version 4.1
Une routine est comparable à un processus système de niveau inférieur : il s’agit d’une
entité diffusable qui exige pour sa création moins de ressources qu’un processus AIX. Dans
le programmateur d’AIX version 4.1, la routine constitue l’entité diffusable de base.
Cela ne signifie pas que les routines ont entièrement supplanté les processus. En fait, les
charges de travail qui ont subi une migration directement à partir de versions précédentes
d’AIX créent des processus comme auparavant. Chaque nouveau processus est créé avec
une seule routine qui est en concurrence avec les routines des autres processus pour
l’accès aux ressources CPU. Si le processus possède les ressources utilisées lors de
l’exécution, la routine, quant à elle, ne possède que son état courant.
Lorsque des applications nouvelles ou modifiées créent des routines supplémentaires à la
faveur du nouveau support de routines d’AIX, cette création a lieu dans le cadre du
processus. Les ressources partagent de ce fait le segment privé et les autres ressources du
processus.
Une routine utilisateur dans un processus est dotée d’une portée concurrentielle. Si la
portée concurrentielle est globale, la routine est en conccurrence avec toutes les autres
routines du système pour l’accès aux ressources CPU. (La routine créée en même temps
qu’un processus est dotée d’une portée concurrentielle globale.) Si la portée est locale, la
routine est en concurrence uniquement avec les routines de son processus pour le partage
du temps CPU accordé aux processus.
L’algorithme qui permet de désigner la routine suivante à exécuter est appelé politique de
planification.
Planification des routines de portée concurrentielle globale ou locale
Trois politiques de planification sont disponibles sous AIX version 4 :
2-2
FIFO
La routine est exécutée jusqu’à son terme, sauf si un blocage se produit. Elle
utilise la CPU ou une routine dotée d’une priorité supérieure devient
diffusable. Seules les routines à priorité fixe peuvent être exécutées en mode
FIFO.
RR
Cette période est définie selon le même mécanisme de répartition par
permutation circulaire (RR) que celui utilisé sous AIX version 3 (répartition
par tranches horaires de 10 ms). La routine se place à la fin de la file
d’attente des routines diffusables de même priorité lorsqu’elle s’exécute au
bout d’une période de temps spécifiée. Seules les routines à priorité fixe
peuvent être exécutées en mode RR.
OTHER
Ce mode est ”défini par implantation” selon POSIX1003.4a. Sous AIX
version 4.1, le mode OTHER est déclaré équivalent au mode RR, à ceci près
qu’il s’applique aux routines à priorité variable. Dans ce cas, la priorité de la
routine en cours est recalculée à chaque interruption d’horloge si bien que la
routine peut être amenée à passer le contrôle à une autre routine diffusable.
C’est le mécanisme appliqué sous AIX version 3.
AIX 4.3 Guide d’optimisation
Les routines sont particulièrement utiles pour les applications composées de plusieurs
processus asynchrones : ces applications peuvent soumettre au système une moindre
charge dès lors qu’elles sont converties en structures multiroutines.
Priorité des processus et des routines
Les outils de gestion des priorités disponibles sous la version 3.2.5 manipulent les priorités
au niveau des processus. Sous AIX version 4.1, la priorité d’un processus ne fait
qu’annoncer celle de la routine. Appeler fork() entraîne la création d’un processus
contenant une routine. C’est la routine qui reçoit le niveau de priorité auparavant attribué au
processus sous la version 3.2.5 d’AIX. La présente description est applicable aux deux
versions.
Le noyau tient à jour pour chaque routine une valeur de priorité (aussi appelée priorité de
planification). La priorité est définie par un entier positif, inversement proportionnel à
l’importance de la routine associée. Autrement dit, une valeur de priorité faible désigne une
routine importante. Lorsque le programmateur cherche la routine suivante à diffuser, il
choisit celle dont la priorité a la valeur la plus basse.
Une priorité peut être fixe ou variable. Une priorité fixe a une valeur constante tandis que la
priorité d’une routine à priorité variable est la somme de la priorité minimale des routines
utilisateur (constante 40), de la valeur nice (20 par défaut ou valeur définie par la
commande nice ou renice) et de la pénalité d’utilisation CPU. La figure ”Evolution de la
valeur de priorité” illustre cette évolution.
A l’initiation Au bout d’un temps
de la routine d’exécution
pénalité CPU
Valeur
priorité
(valeur
faible –
priorité
élevée)
valeur nice
20 par défaut
priorité de
base à 40 par
défaut
valeur nice
reste égale
à 20
priorité de
base
constante
à 40
Après
renice –5
Après
setpri()
à 50
pénalité CPU
valeur nice
à 15
priorité de
base
constante
à 40
Priorité fixe
de 50 –
valeur nice et
utilisation
CPU
sans objet
Evaluation de la valeur de priorité
La valeur nice d’une routine, définie lors de la création de la routine, est constante pendant
toute la durée de vie de la routine, sauf changement explicite par un utilisateur via la
commande renice ou les appels système setpri, setpriority ou nice.
La pénalité CPU est un nombre entier calculé d’après l’utilisation récente de la CPU par une
routine. Cette valeur est incrémentée de 1 chaque fois que la routine utilise la CPU pendant
une tranche horaire (10 ms), jusqu’à une valeur maximale de 120. Une fois par seconde, les
valeurs d’utilisation récente de la CPU de toutes les routines sont réduites. Le résultat
obtenu est :
• La priorité d’une routine à priorité variable décroît au fur et à mesure que l’utilisation
récente de la CPU s’accroît, et inversement. Il en découle que, en moyenne, plus une
routine a récemment bénéficié de tranches horaires, moins elle a de chance d’être
d’affectée à la tranche horaire suivante.
• La priorité d’une routine à priorité variable décroît au fur et à mesure que la valeur nice
s’accroît, et inversement.
Gestion des ressources AIX
2-3
La priorité d’une routine peut être fixée via la sous-routine setpri. La commande ps permet
d’afficher la priorité, la valeur nice et les valeurs d’utilisation CPU à court terme d’un
processus.
Pour en savoir plus sur les commandes nice et renice, reportez-vous à ”Contrôle des
conflits pour CPU”, page 6-20.
Pour en savoir plus sur le calcul de la pénalité CPU et la diminution des valeurs d’utilisation
de la CPU à court terme, reportez vous à ”Optimisation du calcul des priorités d’un
processus via schedtune, page 6-23.
File d’attente d’exécution du programmateur d’AIX
Le programmateur maintient une file d’attente d’exécution de toutes les routines prêtes à
être diffusées. La figure ”File d’attente d’exécution” en est une illustration symbolique.
priorité n
routine aaa
routine bbb
priorité n+1
routine iii
routine jjj
priorité n+2
routine xxx
routine yyy
routine ccc
File d’attente d’exécution
Les routines diffusables d’un niveau de priorité donné se suivent dans la file d’attente
d’exécution.
Lorsqu’une routine est placée ”en fin de file d’attente d’exécution” (par exemple, lorsqu’elle
s’exécute à la fin d’une tranche horaire), elle est positionnée après la dernière routine en
attente dotée de la même priorité.
Tranche horaire CPU
La tranche horaire CPU est l’intervalle entre deux recalculs de la priorité. En temps normal,
ce calcul est effectué à chaque impulsion de l’horloge système, c’est-à-dire toutes les
10 millisecondes. L’option –t de la commande schedtune (voir page A-6) permet
d’augmenter cet intervalle par incréments de 10 millisecondes. Rappelons qu’une tranche
horaire ne correspond pas à une quantité garantie de temps processeur. Il s’agit de la durée
maximale pendant laquelle une routine peut s’exécuter sans risquer d’être remplacée par
une autre. Il existe plusieurs cas de figure où une routine peut être supplantée par une autre
avant de bénéficier d’une tranche horaire complète.
Voir aussi
”Gestion des ressources AIX”
”Contrôle et optimisation de la CPU”
Commandes nice, ps et renice
Sous-routine setpri
Sous-routines getpriority, setpriority et nice.
2-4
AIX 4.3 Guide d’optimisation
Performances du gestionnaire de mémoire virtuelle (VMM)
L’espace d’adresse virtuelle du ESCALA est partitionné en segments (pour une description
détaillée de la structure d’adressage virtuelle, reportez vous à l’annexe C, ”Mémoire cache
et adressage”). Un segment est une portion contiguë de 256 Mo de l’espace d’adresse
virtuelle dans laquelle un objet de données peut être mappé. L’adressage
processus-données est géré au niveau du segment (ou objet) de sorte qu’un segment peut
être partagé par des processus ou rester privé. Par exemple, des processus peuvent
partager des segments de codes, mais disposer de segments de données privés distincts.
Le gestionnaire de mémoire virtuelle (VMM) est décrit dans les sections suivantes :
• ”Gestion de la mémoire réelle”
• ”Utilitaire de contrôle de l’occupation mémoire”
• ”Affectation et réclamation d’emplacements dans l’espace de pagination”
Gestion de la mémoire réelle
Les segments de mémoire virtuelle sont partitionnés en unités de taille fixe appelées pages.
La taille d’une page sous AIX est de 4 096 octets. Chaque page d’un segment peut être
implantée dans la mémoire réelle (RAM) ou stockée sur disque tant qu’elle n’est pas
utilisée. De même, la mémoire réelle est divisée en trames de page de 4 096 octets. Le rôle
de VMM est de gérer l’affectation des trames de page de mémoire virtuelle et de résoudre
les références dans le programme aux pages de mémoire virtuelle qui ne se trouvent pas
en mémoire réelle ou n’existent pas encore (c’est par exemple le cas lorsqu’un processus
fait référence pour la première fois à une page de son segment de données).
La quantité de mémoire virtuelle utilisée à un instant donné pouvant être supérieure à la
capacité de la mémoire réelle, VMM se charge de stocker le surplus sur disque. En terme
de performances, VMM doit remplir deux objectifs, quelque peu contradictoires :
• Réduire le coût global en temps processeur et largeur de bande induit par l’utilisation de
la mémoire virtuelle.
• Réduire le coût en temps de réponse des défauts de page.
Dans cette optique, le gestionnaire VMM tient à jour une liste des disponibilités de trames
de page en cas de défaut de page. Il utilise un algorithme de repositionnement de page
pour déterminer les pages de mémoire virtuelle actuellement en mémoire dont les trames
doivent être réaffectées à la liste des disponibilités. Le mécanisme de l’algorithme de
repositionnement de page est le suivant :
• Les segments de mémoire virtuelle sont répartis en segments persistants et segments de
travail.
• Les segments de mémoire virtuelle sont répartis en deux autres catégories selon qu’ils
contiennent de la mémoire de calcul ou de la mémoire de fichier.
• Les pages de mémoire virtuelle à l’origine d’un défaut de page sont recherchées.
• Parmi les défauts de page, l’algorithme distingue les défauts de nouvelle page initiale et
les défauts de page déjà référencée.
• Les statistiques sont tenues à jour sur la base des défauts de pages déjà référencées au
niveau de chaque segment de mémoire virtuelle.
• Les limites inférieures définies par l’utilisateur sont prises en compte par l’algorithme.
Le mécanisme de l’algorithme et du système de liste des disponibilités est détaillé ci-après.
Gestion des ressources AIX
2-5
Liste des disponibilités
Le gestionnaire VMM tient à jour la liste des trames de pages disponibles pour faire face
aux défauts de page. Dans la plupart des environnements, VMM doit mettre à jour cette
liste en réaffectant les trames de page des processus en cours. C’est l’algorithme de
repositionnement de page de VMM qui décide des pages de mémoire virtuelle dont les
trames doivent être réaffectées. Le nombre de trames concernées dépend des seuils définis
dans VMM.
Sous AIX version 3, le contenu des trames de page réaffectées dans la liste des
disponibilités n’est pas perdu. Si une page de mémoire virtuelle référencée avant la trame
qu’elle occupe est utilisée pour compenser un défaut de page, la trame en question est
supprimée de la liste et réaffectée au processus défaillant. Ce phénomène est appelé une
réclamation. Les réclamations ne sont pas prises en charge par AIX version 4.1.
Segments persistants et segments de travail
Les pages d’un segment persistant bénéficient d’emplacements de stockage permanents
sur disque. Les fichiers contenant des données ou des exécutables sont mappés à des
segments persistants. Ainsi, lorsqu’une telle page est modifiée et ne peut plus être
conservée en mémoire réelle, VMM la réinstalle à l’emplacement qui lui est réservé. Si la
page n’a pas été modifiée, sa trame est simplement réaffectée dans la liste des
disponibilités. Enfin, si elle est de nouveau référencée, VMM en crée une copie à partir de
l’emplacement permanent.
Les segments de travail sont des segments temporaires qui ne bénéficient pas
d’emplacements de stockage permanents et dont la durée de vie est limitée à leur temps
d’utilisation par un processus. Les piles de processus et les zones de données sont
mappées à ces segments de travail, de même que les segments de texte du noyau et de
l’extension du noyau, ainsi que les segments de données et de texte des bibliothèques
partagées. Lorsqu’elles ne peuvent être conservées en mémoire réelle, les pages des
segments de travail sont également stockées sur le disque. Le stockage a lieu dans
l’espace de pagination du disque.
La figure ”Segments de stckockage de travail et persistants” illustre les relations entre
certains types de segment et l’emplacement de leurs pages sur le disque. Elle indique
également les emplacements réels (arbitraires) des pages se trouvant en mémoire réelle.
0 . . . intervalle d’adressage . . . . 256 Mo
Processus
Segment de texte de
programme (persistant)
Fichier segment de données
et de piles (de travail)
Routine(s)
0 . . . . . .trames de page de 4 ko . . . . . . . . . n
Mémoire
réelle
Espace de
pagination
Segment de bibliothèque
partagée (de travail)
Pages
touchées
Fichier
exécutable
E/S
réelles
Segments persistants et segments de travail
Il existe différents types de segments persistants. Les segments client sont utilisés pour
mapper les fichiers distants (tels que les fichiers accessibles via NFS) parmi lesquels les
fichiers exécutables. Les pages des segments client sont sauvegardées et restaurées via le
réseau, à leur emplacement de fichier permanent et non dans l’espace de pagination du
disque local. Les segments journalisés et différés sont des segments persistants qui doivent
être mis à jour de façon atomique. Si une page d’un segment journalisé ou différé est
sélectionnée pour être ôtée de la mémoire réelle (déchargée), elle doit être copiée dans
2-6
AIX 4.3 Guide d’optimisation
l’espace de pagination du disque (à moins que son état n’autorise sa validation, c’est-à-dire
son inscription à l’emplacement de fichier permanent).
Mémoire de calcul et mémoire de fichier
La mémoire de calcul est constituée des pages appartenant aux segments de stockage de
travail ou aux segments de texte de programme. (Un segment est considéré comme texte
de programme si une absence en cache d’instructions se produit sur n’importe laquelle de
ses pages.) La mémoire de fichier est constituée par les autres pages.
Repagination
Il existe deux catégories de défaut de page : défaut de nouvelle page et défaut de page
déjà référencée. Les défauts qui relèvent de la première catégorie se produisent
lorsqu’aucun article de la page concernée n’a été référencé récemment. Ceux de la
seconde catégorie concernent les pages déjà référencées qui le sont à nouveau, mais ne
se trouvent pas en mémoire car elles ont été déplacées depuis (éventuellement sur disque).
Une politique idéale de repositionnement de page serait d’éliminer entièrement les défauts
de page déjà référencée (en admettant que la mémoire réelle soit suffisante) par le vol
systématique des trames des pages qui ne sont pas appelées à être de nouveau
référencées. Ainsi, le nombre de ces défauts de page est inversement proportionnel à
l’efficacité de l’algorithme de repositionnement, du fait du vol continu des pages en mémoire
(réduisant d’autant le volume global des E/S au profit des performances du système).
Pour estimer la catégorie du défaut de page, VMM tient un tampon historique des pages
référencées où sont consignés les ID des pages ayant fait l’objet des N défauts de page les
plus récents (N étant le nombre maximum de trames que la mémoire peut contenir). Par
exemple, une mémoire de 16 Mo requiert un tampon de 4 096 entrées pour l’historique des
pages référencées. Si l’ID de la page en entrée figure déjà dans le tampon, la page est
considérée comme déjà référencée. VMM évalue également les taux de défauts de page
référencée en mémoire de calcul et en mémoire de fichier séparément, en tenant un
compte distinct pour chaque type de mémoire. Ces taux sont multipliés pas 0,9 à chaque
exécution de l’algorithme pour donner une image de l’activité récente de repagination plus
fidèle que l’historique.
Seuils VMM
Plusieurs seuils numériques définissent les objectifs de VMM. Lorsqu’un de ces seuils est
dépassé, VMM prend les mesures nécessaires pour ramener l’état de la mémoire à
l’intérieur des limites définies. Cette section traite des seuils modifiables par l’administrateur
système via la commande vmtune.
Le nombre de trames de page figurant dans la liste des disponibilités est contrôlé par les
paramètres :
minfree
Nombre minimum de trames de page mémoire réelle admissibles dans
la liste des disponibilités. Lorsque la taille de la liste des disponibilités
passe en dessous de ce seuil, VMM commence à voler des pages. Il
continue à en voler jusqu’à ce que la taille de la liste des disponibilités
atteigne maxfree.
maxfree
Taille maximale que la liste des disponibilités peut atteindre sous l’effet
du vol de pages effectué par VMM. Il peut arriver que la liste dépasse
cette taille, lorsque les processus se terminent et libèrent les pages des
segments de travail ou que des fichiers possédant des pages en
mémoire sont supprimés.
VMM tente de maintenir la liste à une taille au moins égale à minfree. Si, du fait des défauts
de page et/ou des requêtes système, la taille descend en-deçà de minfree, l’algorithme de
repositionnement de page s’exécute. Il est nécessaire de respecter une taille minimale
(valeur minfree, par défaut) pour plusieurs raisons. Par exemple, l’algorithme de
prérecherche séquentielle d’AIX requiert plusieurs trames simultanément pour chaque
processus effectuant une lecture séquentielle. De même, VMM doit veiller à ce que
Gestion des ressources AIX
2-7
suffisamment d’espace soit disponible pour charger une page nécessaire à la libération
d’une trame de page, faute de quoi un blocage du système risque de se produire.
Les seuils suivants sont exprimés en pourcentages. Ils représentent la fraction de la
mémoire réelle totale occupée par des pages de fichiers (n’appartenant pas à un segment
de mémoire de calcul).
minperm
Si le pourcentage de mémoire réelle occupée par les pages de fichiers
est inférieur à ce niveau, l’algorithme de repositionnement de page vole
à la fois les pages de mémoire de calcul et de mémoire de fichier sans
tenir compte des taux de repagination.
maxperm
Si le pourcentage de mémoire réelle occupée par les pages de fichiers
dépasse ce niveau, l’algorithme de repositionnement de page ne vole
que les pages de fichiers.
Lorsque le pourcentage de mémoire réelle occupée par les pages de fichier est compris
entre minperm et maxperm, VMM ne vole généralement que les pages de fichiers, mais si
le taux de repagination des pages de fichiers est supérieur à celui des pages de mémoire
de calcul, il vole également ces dernières.
L’algorithme de repositionnement de page s’assure que les pages de mémoire de calcul
sont correctement traitées. Par exemple, la lecture séquentielle d’un fichier de données
volumineux stocké en mémoire ne doit pas entraîner la perte de pages de texte d’un
programme susceptibles d’être sollicitées à court terme. Par le truchement des seuils et des
taux de repagination, l’algorithme contrôle le traitement des deux types de page (en
accordant une légère préférence aux pages de mémoire de calcul).
Utilitaire de contrôle de l’occupation mémoire
Lorsqu’un processus fait référence à une page de mémoire virtuelle non stockée sur le
disque (qu’elle ait été déchargée ou jamais chargée), la page concernée doit être chargée
et, le plus souvent, une ou plusieurs pages doivent être déchargées. Ces opérations
génèrent un flux d’E/S et retardent la progression du processus.
AIX tente, via l’algorithme de repositionnement de page, de voler de la mémoire réelle des
pages peu susceptibles d’être référencées à court terme. Un algorithme efficace permet au
système d’exploitation de conserver en mémoire suffisamment de processus actifs pour
maintenir la CPU en activité. Mais, à un certain niveau de sollicitation de mémoire (fonction
de la capacité mémoire totale du système, du nombre de processus, de l’évolution des
besoins en mémoire de chaque processus et de l’algorithme de repositionnement de page),
aucune page ne peut être déchargée sur le disque car elles sont toutes susceptibles d’être
réutilisées à court terme par les processus actifs.
Dans ce cas, les pages sont continuellement chargées et déchargées. Ce phénomène est
appelé emballement. L’emballement génère une activité incessante d’E/S sur le disque de
pagination et répond dès la diffusion d’un processus par un défaut de page quasi
systématique. Mais l’aspect le plus pernicieux de l’emballement est qu’il entraîne le système
dans une boucle infinie alors même qu’il n’a été provoqué que par un excès bref et fortuit de
la charge (par exemple, si tous les utilisateurs du système appuient sur la touche Entrée à
la même seconde).
AIX dispose d’un algorithme de contrôle de la charge mémoire qui, lorsqu’il détecte un
emballement du système, interrompt des processus actifs et retarde quelque temps le
lancement de nouveaux processus. Cinq paramètres définissent les taux et les seuils pour
l’algorithme. Les valeurs par défaut de ces paramètres ont été choisies pour s’adapter à un
vaste éventail de types de charges de travail. Dans certains cas, il est possible de recourir à
un mécanisme de modulation (ou de désactivation) du contrôle de charge (reportez-vous à
”Optimisation du contrôle de charge mémoire VMM”, page 7-14).
2-8
AIX 4.3 Guide d’optimisation
Algorithme de contrôle de la charge mémoire
Le mécanisme de contrôle de charge mémoire évalue, toutes les secondes, si la mémoire
disponible est suffisante pour le jeu de processus actifs. Lorsqu’une surcharge mémoire est
détectée, certains processus sont interrompus, ce qui réduit le nombre de processus actifs
et le taux de surcharge de la mémoire : dès que leur état le permet, l’exécution de leurs
routines est suspendue. Les pages des processus interrompus deviennent rapidement
obsolètes et sont déchargées par l’algorithme de repositionnement de page. Cette
opération libère suffisamment de trames de page pour permettre aux processus actifs
restants de continuer. Dans l’intervalle de suspension des processus, les nouveaux
processus créés sont également interrompus, empêchant toute nouvelle arrivée de travaux
sur le système. Les processus interrompus ne sont réactivés qu’au bout d’un certain laps de
temps - où aucun risque d’emballement ne s’est manifesté. Une fois cet intervalle de
sécurité écoulé, les routines des processus interrompus sont progressivement réactivées.
Les paramètres de contrôle de la charge mémoire spécifient : le seuil de surcharge de la
mémoire système, la durée (en secondes) de l’intervalle de sécurité, le seuil de surcharge
d’un processus au-delà duquel son interruption est jugée possible, le nombre minimum de
processus actifs lors de l’interruption de processus et le délai minimum (en secondes) entre
la suspension d’un processus et sa réactivation.
Ces paramètres et leur valeur par défaut (entre parenthèses) sont les suivants :
h
Seuil haut de surcharge mémoire (6)
w
Attente avant la réactivation des processus suspendus (1 seconde)
p
Seuil de surcharge de la mémoire pour un processus (4)
m
Degré minimum de multiprogrammation (2)
e
Délai écoulé sans interruption (2 secondes)
Les valeurs de tous ces paramètres sont des entiers positifs.
Paramètre h
Le paramètre h définit le seuil de surcharge de la mémoire. Le système de contrôle de
charge mémoire tente d’interrompre les processus lorsque ce seuil est dépassé pendant
une seconde. Ce seuil est issu de deux mesures directes : le nombre de pages inscrites
dans l’espace de pagination pendant la dernière seconde, et le nombre de vols de pages
ayant eu lieu durant cette même dernière seconde. Le nombre d’écritures de pages est
généralement nettement inférieur au nombre de vols de page. La mémoire est considérée
surchargée lorsque :
nombre de pages écrites lors de la dernière seconde
nombre de pages volées lors de la dernière seconde
>
1
h
Plus ce rapport augmente, plus le risque d’emballement est grand. La valeur par défaut de
h est 6, ce qui signifie qu’il y a risque d’emballement du système lorsque le rapport entre le
nombre de pages écrites et le nombre de pages volées est supérieur à 17 %. Une valeur de
h inférieure (pouvant aller jusqu’à 0, le test étant effectué sans effectuer une division réelle)
augmente le seuil de détection du phénomène d’emballement. Autrement dit, le système est
autorisé à s’approcher davantage des conditions d’emballement avant que ne se déclenche
l’interruption des processus. Le rapport ci-dessus a été choisi car il est relativement peu
dépendant de la configuration. Quels que soient la capacité de pagination du disque et le
nombre de mégaoctets de mémoire installée sur le système, un rapport faible diminue les
risques d’emballement. Un rapport avoisinnant la valeur 1 signifie un emballement certain.
Tout laps de temps pendant lequel la mémoire n’est pas surchargée peut être défini comme
période sûre.
Paramètre w
Le paramètre w contrôle le nombre d’intervalles de 1 seconde durant lesquels le rapport
ci-dessus doit être inférieur à 1/h – avant réactivation des processus interrompus. La valeur
Gestion des ressources AIX
2-9
par défaut, 1 seconde, est proche de la valeur minimale admise (zéro). Une valeur de
1 seconde tente de réactiver les processus dès expiration du délai de sécurité de
1 seconde. Si une valeur plus élevée est attribuée à w, les temps de réponse pour les
processus interrompus risquent d’être inutilement longs, le processeur étant inactif faute de
processus.
Paramètre p
Le paramètre p détermine si un processus peut être interrompu. Analogue au paramètre h,
le paramètre p permet de définir un seuil applicable au rapport entre deux mesures
concernant tous les processus : le nombre de pages déjà référencées (défini à la section
relative à l’algorithme de repositionnement de page) et le nombre de défauts de page
cumulés par le processus durant la dernière seconde. Un rapport élevé indique que le
processus s’emballe. Un processus est candidat à la suspension (soit parce qu’il s’emballe
soit parce qu’il contribue à l’emballement de l’ensemble) si :
nombre de pages référencées au cours de la dernière seconde
nombre de défauts de page au cours de la dernière seconde
>
1
p
Par défaut, p prend la valeur 4, ce qui signifie qu’un processus est considéré comme
s’emballant (et donc candidat à la suspension) dès lors que le rapport entre les pages
référencées et les défauts de page cumulés au cours de la dernière seconde est supérieur
à 25 %. Une valeur faible de p (pouvant atteindre zéro, le test n’effectuant pas réellement la
division) autorise le système à s’approcher davantage des conditions d’emballement avant
que ne se déclenche l’interruption des processus. La valeur zéro signifie qu’aucun
processus ne peut être interrompu par le système de contrôle de charge mémoire.
Paramètre m
Le paramètre m détermine la limite inférieure du degré de multiprogrammation. Le degré de
multiprogrammation est défini comme le nombre de processus actifs (non suspendus).
(Chaque processus compte pour un, quel que soit le nombre de routines qu’il exécute.) Ne
sont pas comptabilisés le processus noyau et les processus à priorité fixe inférieure à
60 (1), à mémoire fixe (2) ainsi que les événements en attente (3), aucun processus de
cette catégorie ne pouvant être interrompu. La valeur 2 par défaut garantit qu’au moins
deux processus utilisateur sont toujours activables. Une valeur inférieure dem, lorsqu’elle
est autorisée, indique que par moments un seul processus utilisateur peut être actif. Des
valeurs supérieures de m retirent au système de contrôle de charge la possibilité
d’interrompre des processus. Ce paramètre dépend fortement de la configuration et de la
charge. Une valeur trop faible de m dans une configuration étendue déclenche trop
aisément la suspension des processus, une valeur trop élevée de m dans une configuration
réduite ne confère pas au système de contrôle une sensibilité suffisante. La valeur 2
(par défaut) est le meilleur compromis pour une configuration réduite mais risque d’être trop
faible pour une configuration plus étendue, pouvant et devant prendre en charge des
dizaines de processus pour exploiter les ressources disponibles.
Par exemple, si une configuration et une charge données peuvent gérer l’exécution
simultanée d’environ 25 processus, mais qu’au-delà, il y a risque d’emballement, il est
conseillé de fixer à 25 la valeur de m.
Paramètre e
Chaque fois qu’un processus interrompu est réactivé, il est exempt de toute interruption
pendant une période de e secondes. Ce laps de temps est ménagé pour assurer que le
coût élevé (en E/S disque) que représente le chargement des pages d’un processus
interrompu est compensé par une progression raisonnable des processus. La valeur par
défaut de e est 2 secondes.
Une fois par seconde, le programmateur (processus 0) examine toutes les grandeurs citées
ci-dessus, collectées pendant l’intervalle d’une seconde précédent. Cet examen lui permet
de déterminer si les processus doivent être suspendus ou activés. Tous les processus
désignés aptes à être suspendus par les paramètres p et e sont marqués comme tels.
2-10
AIX 4.3 Guide d’optimisation
Lorsqu’un de ces processus reçoit la CPU en mode utilisateur, il est interrompu (sauf si la
suspension réduit à moins de m le nombre de processus actifs). Le critère de mode
utilisateur est appliqué pour empêcher qu’un processus soit interrompu alors que des
opérations système critiques sont exécutées sur son compte. Si les conditions
d’emballement perdurent au cours des intervalles d’une seconde suivants, les autres
processus répondant aux critères de p et e sont marqués pour être interrompus. Lorsque le
programmateur détermine que les conditions d’intervalle de sécurité sont remplies, chaque
seconde, un certain nombre de processus interrompus sont remis dans la file d’exécution
(réactivés).
Les processus interrompus sont réactivés : (1) par ordre de priorité, (2) par ordre
d’interruption. Ils ne sont pas tous activés en même temps. Leur nombre est calculé selon
une formule qui établit le nombre de processus actifs à ce moment-là et en réactive 1/5ème
ou augmente selon une progression régulière croissante le nombre minimum (c’est l’option
la plus élevée qui est choisie). Par cette stratégie prudente, l’accroissement du degré de
multiprogrammation est réalisé par tranche d’environ 20 % par seconde. Ainsi, la
réactivation s’effectue à un rythme relativement lent pendant la première seconde qui suit la
période de sécurité, puis à un rythme plus soutenu au cours des secondes suivantes. Si la
surcharge mémoire se reproduit pendant la réactivation, l’opération s’interrompt et les
processus marqués pour la réactivation sont de nouveau marqués comme étant
interrompus. Les autres processus sont interrompus conformément aux règles précédentes.
Les six paramètres de l’utilitaire de contrôle de charge mémoire peuvent être définis par
l’administrateur système via la commande schedtune. Les techniques d’optimisation de
l’utilitaire sont décrites au chapitre 7 : ”Contrôle et optimisation de la mémoire”.
Affectation et réclamation d’emplacements dans l’espace de pagination
AIX prend en charge deux schémas d’affectation des emplacements dans l’espace de
pagination. Avec l’algorithme normal, de post-affectation, un emplacement de pagination
n’est affecté à une page de mémoire virtuelle que lorsque cette page a été lue ou qu’une
écriture y a été effectuée. C’est la première fois que le contenu de la page a un rôle pour le
programme en cours.
Un grand nombre de programmes exploite ce type d’affectation en attribuant des intervalles
d’adresses de mémoire virtuelle aux plus grandes structures, celles-ci étant par la suite
utilisées en fonction des besoins. Les pages des intervalles d’adresses de mémoire virtuelle
qui ne sont jamais sollicitées ne requièrent ni trames de mémoire réelle ni emplacements
dans l’espace de pagination.
Cette technique n’est cependant pas sans risque. Si tous les programmes exécutés sur une
machine se trouvent simultanément dans une situation de taille maximale, l’espace de
pagination peut être saturé. Certains programmes riquent de ne pas être menés à terme.
Le second schéma utilisé par AIX a été spécialement conçu pour ce type de situation ou
pour les installations sur lesquelles le non-aboutissement d’un programme représente un
coût prohibitif. Cet algorithme dit d’affectation anticipée permet d’affecter le nombre
approprié d’emplacements dans l’espace de pagination en même temps que l’intervalle
d’adresse de mémoire virtuelle, par exemple à l’aide de malloc. Si le nombre
d’emplacements est insuffisant pour le malloc, un code d’erreur est généré. La ligne
d’appel de cet algorithme est :
export PSALLOC=early
Dès lors, tous les programmes exec dans l’environnement utiliseront l’algorithme
d’affectation anticipée. Cette ligne n’a aucune incidence sur le shell courant.
L’affectation anticipée est particulièrement intéressante pour l’analyse des performances, du
fait de ses implications sur la taille de l’espace de pagination. Nombreux sont les
programmes qui utilisent fréquemment malloc pour une utilisation de l’espace ”à la carte”.
Activer l’algorithme d’affectation anticipée pour ces programmes entraîne une multiplication
des besoins en espace de pagination. S’il est normalement conseillé d’utiliser un espace de
pagination de taille double de celle de la mémoire réelle du système, dans le cas de
Gestion des ressources AIX
2-11
systèmes utilisant PSALLOC=early, la taille préconisée doit être au moins quadruple de
celle de la mémoire réelle. Et ceci n’est qu’une base de départ. Il vous faut en fait analyser
les besoins en mémoire virtuelle de la charge de travail et affecter les espaces de
pagination correspondants. Par exemple, le serveur AIX windows peut requérir, avec
l’affectation anticipée, 250 Mo d’espace de pagination.
Rappelons également que ces emplacements ne sont libérés qu’à la fin du processus (et
non des routines) ou par l’appel système disclaim. Ils ne peuvent pas être libérés via free.
Pour en savoir plus sur le contrôle et l’affectation de l’espace de pagination, reportez-vous à
”Position et taille des espaces de pagination”, page 4-26.
2-12
AIX 4.3 Guide d’optimisation
Gestion AIX du stockage sur disque fixe
La figure ”Organisation des données sur disque fixe (sans option miroir)” illustre la
hiérarchie des structures utilisées par AIX pour gérer le stockage sur disque fixe. Chaque
unité de disque, appelée volume physique (PV), porte un nom du type /dev/hdisk0. Si le
volume est en cours d’utilisation, il appartient à un groupe de volumes (VG). Tous les
volumes physiques membres d’un groupe de volumes sont divisés en partitions physiques
(PP) de même taille (par défaut, 2 Mo pour des groupes comportant des volumes physiques
inférieurs à 300 Mo et 4 Mo dans les autres cas). Pour faciliter l’affectation d’espace,
chaque volume physique est divisé en cinq régions (outer_edge, outer_middle, center,
inner_middle et inner_edge). Le nombre de partitions physiques implantées dans chaque
région varie en fonction de la capacité totale de l’unité de disque.
...
...
/op/nom–fichier
Fichier
/op
1
... p
q
...
r
hd11
1
2
3
...
o
om m im
n
FS
hd2 LV
LP
PP
o
om m im
i
o
om m im
i
i
PV
/dev/hdisk0
/dev/hdisk2
/dev/hdisk1
autre VG
VG
root vg
Organisation des données sur disque fixe (sans option miroir)
Dans chaque groupe de volumes sont définis un ou plusieurs volumes logiques (LV).
Chaque volume logique est constitué d’une ou de plusieurs partitions logiques. Chaque
partition logique correspond à au moins une partition physique. Si le volume logique est mis
en miroir, des partitions physiques supplémentaires sont affectées pour stocker les copies
supplémentaires de chaque partition logique. Les partitions logiques sont numérotées
séquentiellement, mais les partitions physiques sous-jacentes ne sont pas nécessairement
consécutives ou contiguës.
Gestion des ressources AIX
2-13
Les volumes logiques peuvent assurer certaines fonctions système, telle la pagination. S’ils
renferment des données système ou utilisateur ou des programmes, ils disposent chacun
d’un système de fichiers journalisés (JFS) unique. Ce dernier est composé d’un pool de
blocs de la taille d’une page (4 096 octets). Lorsque des données sont inscrites dans un
fichier, un ou plusieurs blocs lui sont affectés. Les blocs peuvent être contigus ou non (et
contigus ou non à ceux déjà affectés au fichier).
Sous AIX version 4.1, un système de fichiers donné peut être défini avec une taille de
fragment inférieure à 4 096 octets. La taille de fragment est de 512, 1 024 ou 2 048 octets.
Ce qui permet de stocker plus efficacement les fichiers peu volumineux.
La figure ”Organisation des données sur disque fixe (sans option miroir)” illustre ce qui peut
se produire lorsqu’un système de fichiers n’a pas été réorganisé depuis longtemps. Le
fichier /op/filename est réparti sur un grand nombre de blocs physiquement distants les uns
des autres : la lecture séquentielle de ce fichier exige plusieurs opérations de recherche,
coûteuses en temps.
Au niveau conceptuel, un fichier AIX est une chaîne contiguë et séquentielle d’octets, mais
la réalité physique est parfois bien différente : le fichier peut avoir été fragmenté à la suite
de multiples extensions des volumes logiques ou d’opérations d’affectation/ libération/
réaffectation au sein du système de fichiers. Un système de fichiers est dit fragmenté
lorsque son espace disponible est composé de multiples parcelles qui rendent impossible
l’écriture d’un nouveau fichier sur des blocs contigus.
L’accès aux fichiers implantés sur un système de fichiers très fragmenté exige de multiples
opérations de recherche et induit des temps de réponse en E/S bien supérieurs, du fait des
délais de recherche. Par exemple, l’accès séquentiel demande plus d’opérations de
recherche si le fichier est dispersé sur des parcelles physiquement éloignées que s’il est
concentré sur une ou quelques parcelles contiguës. Il en va de même pour l’accès aléatoire
à un fichier.
L’impact de la dispersion d’un fichier sur les performances d’E/S est moindre si le fichier est
en mémoire tampon. Lorsqu’un fichier est ouvert sous AIX, il est mappé à un segment de
donnée persistant en mémoire virtuelle. Ce segment joue le rôle de tampon virtuel, les blocs
du fichier renvoient directement aux pages du segment. VMM gère les pages de segment
en lisant à la demande les blocs du fichier qui y sont contenus (au fur et à mesure de leur
ouverture). Il arrive que VMM réécrive une page sur le bloc correspondant du fichier sur
disque ; mais, en général, il conserve en mémoire les pages récemment appelées. Ces
pages restent donc plus longtemps en mémoire et l’accès des fichiers logiques aux blocs
correspondants s’effectue sans passer par le disque physique.
A un certain stade, l’utilisateur ou l’administrateur système peut décider de réorganiser la
position des fichiers dans les volumes logiques et la position des volumes logiques dans les
volumes physiques, de façon à réduire la fragmentation et à répartir plus uniformément la
charge totale des E/S. Pour en savoir plus sur la détection et la correction des problèmes
liés à la répartition sur disque et à la fragmentation, reportez–vous à ”Contrôle et
optimisation des E/S disque”, page 8-1.
Lecture séquentielle anticipée
Le gestionnaire VMM tente d’anticiper les besoins en pages d’un fichier séquentiel en
observant le mécanisme d’accès des programmes à ce fichier. Si le programme accède à
deux pages successives, VMM en déduit que l’accès au fichier est séquentiel et anticipe les
lectures suivantes. Ces lectures s’effectuent parallèlement à l’exécution du programme, de
sorte que celui-ci dispose des données plus rapidement, VMM n’ayant pas à attendre qu’il
accède à la page suivante pour lancer une opération d’E/S. Le nombre de pages lues par
anticipation dépend de deux seuils VMM :
2-14
AIX 4.3 Guide d’optimisation
minpgahead
Nombre de pages lues par anticipation dès que VMM suppose que
l’accès est séquentiel. Si le programme continue d’accéder au fichier
séquentiellement, la lecture suivante portera sur le double de pages
défini à minpgahead, puis la suivante sur quatre fois le nombre de
pages défini à minpgahead, etc., jusqu’à atteindre le nombre de pages
défini à maxpgahead.
maxpgahead
Nombre maximum de pages du fichier séquentiel que VMM lit par
anticipation.
Si le programme s’écarte du mécanisme d’accès séquentiel et accède à une page du fichier
dans un autre ordre, la lecture anticipée s’interrompt. Elle reprend, avec le nombre de
pages défini à minpgahead, si VMM constate que le programme revient à un accès
séquentiel. Les valeurs de minpgahead et maxpgahead sont définies via la commande
vmtune. Pour en savoir plus, reportez-vous à ”Optimisation des lectures séquentielles
anticipées”, page 8-11.
Ecriture différée
Pour accroître les performances d’écriture, limiter le nombre en mémoire de pages de
fichier modifiées, réduire la charge du système et minimiser la fragmentation du disque, le
système de fichiers divise chaque fichier en partitions de 16 ko. Les pages d’une partition
donnée ne sont inscrites sur le disque que lorsque le programme a écrit le premier octet de
la partition suivante. Ce n’est qu’à ce stade que le système de fichiers force l’écriture des
quatre pages modifiées de la première partition sur le disque. Les pages de données
restent en mémoire jusqu’à ce que leur trame soit réutilisée, stade à partir duquel aucune
autre opération d’E/S n’est requise. Si un programme accède à l’une des pages avant que
les trames ne soient réutilisées, aucune E/S n’est nécessaire.
S’il reste beaucoup de page modifiées non réutilisées en mémoire, le démon sync les écrit
sur le disque, ce qui peut entraîner une utilisation anormale du disque. Pour répartir plus
efficacement les activités d’E/S par rapport à la charge de travail, vous pouvez activer
l’écriture différée aléatoire pour indiquer au système le nombre de pages à conserver en
mémoire avant de les écrire sur disque. Le seuil d’écriture différée aléatoire est défini sur la
base des fichiers. Cette action entraîne l’écriture des pages sur disque avant l’exécution du
démon sync ; les E/S sont ainsi réparties plus uniformément.
Vous pouvez modifier la taille des partitions d’écriture différées et le seuil d’écriture différée
aléatoire via la commande vmtune.
Fichiers mappés et écriture différée
Les fichiers AIX normaux sont automatiquement mappés à des segments. Ainsi, l’accès
normal à un fichier ne nécessite plus de transiter par les tampons du noyau et les routines
d’E/S de bloc, ce qui permet aux fichiers d’utiliser davantage de mémoire lorsqu’un
supplément de mémoire est disponible (la mise en mémoire cache des fichiers n’est pas
limitée à la zone tampon déclarée du noyau).
Les fichiers peuvent être mappés explicitement par la commande shmat ou mmap, mais
cette opération ne fournit pas d’espace mémoire supplémentaire pour la mise en mémoire
cache. Les applications qui utilisent shmat ou mmap et accèdent au fichier mappé par une
adresse au lieu de recourir à read et write évitent les longueurs de parcours inhérentes aux
opérations d’appel système, mais perdent le bénéfice de la fonction d’écriture différée.
Lorsque les applications n’utilisent pas la sous-routine write, les pages modifiées ont
tendance à s’accumuler en mémoire et sont écrites de façon aléatoire quand l’algorithme de
repositionnement de page VMM ou le démon sync les purge. Dans ces conditions, l’écriture
sur disque se fait par petits bouts, au détriment de toute efficacité d’exploitation du disque et
de la CPU, et la fragmentation qui en découle risque de ralentir les lectures ultérieures du
fichier.
Gestion des ressources AIX
2-15
Régulation des E/S
Les utilisateurs des versions AIX antérieures à la version 3.2 subissaient parfois des temps
de réponse très longs sur des applications interactives, lorsqu’une autre application
exécutait une importante opération d’écriture sur le disque. La plupart des écritures étant
asynchrones, il peut se créer des files d’attente d’E/S FIFO de plusieurs mégaoctets, dont
l’exécution demande plusieurs secondes. Si chaque lecture sur disque monopolise
plusieurs secondes pour parcourir les files d’attente, les performances d’un processus
interactif sont sérieusement amoindries. Pour résoudre ce problème, VMM propose une
option de contrôle des écritures appelée régulation des E/S.
La régulation des E/S ne modifie ni l’interface ni la logique de traitement des E/S. Elle se
borne à limiter le nombre des E/S en attente sur un fichier. Lorsqu’un processus tente de
dépasser cette limite, il est interrompu jusqu’à ce qu’un nombre sufffisant de requêtes en
attente ait été traité pour atteindre le seuil minimal. Pour en savoir plus, reportez-vous à
”Régulation des E/S disque”, page 8-13.
Pile de disques
Une pile de disques est un ensemble de disques gérés comme un tout. Plusieurs
algorithmes de gestion engendrent divers degrés de performances et/ou d’intégrité des
données. Ces algorithmes de gestion sont identifiés par différents niveaux RAID.
(RAID signifie ”redundant array of independent disks”.) Les niveaux RAID sous les
versions 3.2.5 et 4 définis dans l’architecture sont les suivants :
RAID0
Les données sont inscrites sur des unités physiques consécutives, avec un
nombre fixe de blocs de 512 octets par écriture. Cette technique est comparable
à la technique de répartition en bandes des données sur disque : elle offre les
mêmes caractéristiques au niveau de l’intégrité des données que des unités de
disque indépendantes classiques. Autrement dit, l’integrité des données dépend
entièrement de la fréquence et de la validité des sauvegardes. Ce niveau est
analogue à la fonction de répartition en bande décrite à ”Performances et
répartition des volumes logiques”, page 8-15.
RAID1
Les données sont réparties en bandes sur les unités, comme pour le niveau
RAID0, mais la moitié des unités sont utilisées comme unités miroir. RAID1
répond à certains problèmes d’intégrité et de disponibilité pouvant survenir
avec RAID0 en cas de défaillance d’une unité unique, mais n’offre pas plus de
solutions que RAID0 en cas de défaillance d’une ou plusieurs unités. Des
sauvegardes consciencieuses sont indispensables. Ce niveau est analogue à
la fonction miroir des volumes logiques proposée par le gestionnaire de
volumes logiques.
RAID3
Les données sont réparties en bandes octet par octet sur un ensemble d’unités
de données, une unité de parité distincte contenant un octet de parité pour
chaque position d’octet dans les unités de données. En cas de défaillance
d’une unité unique, son contenu est reconstitué sur la base de l’octet de parité
et des octets de données restants. Dans cette technique, l’unité de parité
devient un goulot d’étranglement en terme de performances : une écriture doit
y être effectuée à chaque écriture sur un des autres disques.
RAID5
Les données sont réparties bloc par bloc (de 512 octets), mais des portions d’un
certain nombre d’unités (pas forcément toutes) sont réservées aux informations
de parité. Ce qui alourdit encore l’écriture des informations de parité.
Les unités RAID doivent être considérées comme une solution en terme d’intégrité et de
disponibilité, mais non de performances. Les configurations RAID étendues sont
généralement limitées par le fait que chaque RAID est raccordé à une carte SCSI unique.
Du point de vue des performances, la prise en charge d’un nombre donné d’unités de
disque est plus efficace avec des unités RAID raccordées à plusieurs cartes SCSI qu’avec
une seule unité RAID de grande taille.
2-16
AIX 4.3 Guide d’optimisation
Chapitre 3. Introduction au multitraitement
”Répartir la charge pour alléger le travail”, tel est le postulat qui a conduit au développement
des systèmes multiprocesseur. A un moment donné, la vitesse de traitement d’un
processeur se heurte à une limite technologique. Si un seul processeur ne parvient pas à
gérer correctement la charge du système, une solution possible est de multiplier les
processeurs.
Le succès de cette solution dépend bien entendu de l’ingéniosité de ses concepteurs, et
encore faut-il que la charge de travail s’y prête : s’il est évident que multiplier les employés
répondant à un numéro vert accroît l’efficacité du service, multiplier les conducteurs d’une
automobile ne présente aucun intérêt.
Pour que la migration d’un système monoprocesseur en système multiprocesseur se
traduise par l’amélioration de ses performances, les conditions suivantes doivent être
réunies :
• La charge de travail est limitée par la vitesse de traitement et sature l’unique processeur
du système.
• La charge de travail contient plusieurs éléments gourmands en temps processeur
(transactions, calculs complexes, etc.) qui peuvent être traités simultanément et de
manière indépendante.
• Le processeur existant ne peut pas être mis à niveau et aucun processeur seul n’offre la
vitesse de traitement nécessaire.
• Plusieurs éléments (base de données centralisée, etc.) incitent à répartir la charge de
travail entre plusieurs systèmes monoprocesseur.
D’une manière générale, il est préférable d’opter pour une solution mettant en oeuvre un
seul processeur lorsque cela est possible car l’association de plusieurs processeurs pose
des problèmes de performances, négligeables, voire inexistants, dans les systèmes
monoprocesseur. En particulier, si la condition 2 n’est pas remplie, les performances d’un
système multiprocesseur peuvent être moindres que celles d’un système monoprocesseur.
Bien que les applications unifilaires inchangées fonctionnent en général correctement dans
un environnement multiprocesseur, leurs performances s’en trouvent souvent modifiées de
manière imprévue. La mise en place d’un système multiprocesseur peut améliorer le débit
d’un système et parfois raccourcir le temps d’exécution d’applications multifiles complexes,
mais il réduit rarement le temps de réponse de chaque commande unifilaire.
Pour optimiser les performances d’un système multiprocesseur, il convient de connaître la
dynamique du système d’exploitation et du fonctionnement du matériel, spécifique des
environnements multiprocesseurs.
Introduction au multitraitement
3-1
Multitraitement symétrique (SMP) – concepts et architecture
Comme toute modification qui accroît la complexité d’un système, l’utilisation de plusieurs
processeurs nécessite de modifier la conception pour assurer un fonctionnement et des
performances satisfaisants. Du fait de sa plus grande complexité, le système
multiprocesseur nécessite davantage d’échanges matériel/logiciel et davantage de
coordination dans la conception matérielle et logicielle qu’un système à processeur unique.
Les diverses combinaisons de conception et d’échanges augmentent d’autant le nombre
d’architectures possibles.
Ce chapitre décrit les principaux problèmes posés par les systèmes multiprocesseurs et les
solutions proposées par le système AIX et le ESCALA.
Lors de la conception d’un système multiprocesseur, la décision la plus importante est sans
doute le choix entre un système symétrique ou asymétrique.
Les aspects importants de la conception sont les suivants :
• Multiprocesseurs symétriques et asymétriques
• Sérialisation des données
• Granularité du verrouillage
• Charge liée au verrouillage
• Cohérence des mémoires cache
• Affinité avec un processeur
• Conflits d’utilisation de mémoire et de bus
Multiprocesseurs symétriques et asymétriques
Dans un système multiprocesseur asymétrique, chaque processeur joue un rôle particulier :
gestion des entrées-sorties, exécution de programmes, etc. Ce type de système présente
des avantages et des inconvénients :
• L’affectation de tâches particulières à un seul processeur permet de limiter, voire de
supprimer, les incidents liés à la sérialisation des données et à la cohérence des
mémoires cache (voir plus loin). Elle permet également à certains éléments logiciels de
fonctionner comme dans un système monoprocesseur.
• Dans certains cas, le traitement des opérations d’entrées-sorties et des programmes est
accéléré car il n’est pas en concurrence avec d’autres éléments du système
d’exploitation ou de la charge de travail pour l’accès au processeur.
• Dans d’autres cas, le traitement des opérations d’entrées-sorties et des programmes est
ralenti car les processeurs ne sont pas tous disponibles pour gérer les pointes de charge.
• L’affectation de tâches particulières à chaque processeur permet de limiter les
conséquences d’un incident à une partie restreinte du système.
Dans un système multiprocesseur symétrique, tous les processeurs sont pratiquement
identiques et exécutent des fonctions similaires :
• Ils disposent tous d’espaces d’adresses virtuelles et réelles identiques.
• Ils peuvent tous exécuter toutes les routines du système.
• Ils peuvent tous gérer une interruption externe. (Les interruptions internes sont gérées
par le processeur qui exécute le flot d’instructions qui les a générées.)
• Tous les processeurs peuvent lancer une opération d’entrée-sortie.
Du fait de cette interchangeabilité, n’importe quel processeur peut exécuter n’importe quelle
fonction. C’est principalement aux concepteurs de matériel et de logiciels qu’il incombe de
3-2
AIX 4.3 Guide d’optimisation
garantir cette flexibilité. Un système symétrique fait cependant apparaître les limites du
multitraitement d’une charge de travail.
La famille ESCALA ne contient que des systèmes multiprocesseur symétriques, dont la
figure ”Système multiprocesseur symétrique” donne un exemple. AIX version 4.1 ne prend
en charge que ce type de système. D’autres types de système peuvent présenter une
configuration différente de leur mémoire cache.
Cache L1
Processeur 1 sur processeur
Cache L2 1
Cache L1
Processeur 2 sur processeur
Cache L2 2
Cache L1
Processeur 3 sur processeur
Cache L2 3
Cache L1
Processeur 4 sur processeur
Cache L2 4
Mémoire
réelle
Unités
E/S
Système multiprocesseur symétrique
Bien que les systèmes multiprocesseur ESCALA soient techniquement symétriques, les
logiciels y introduisent un peu d’asymétrie. Au départ, pendant l’amorçage, un seul
processeur a le contrôle. Le premier processeur démarré est appelé ”processeur maître”.
Afin que les logiciels écrits par l’utilisateur continuent de fonctionner correctement lors de la
transformation de l’environnement monoprocesseur en environnement multiprocesseur, les
pilotes d’unité et les extensions de noyau qui ne sont pas explicitement conçus pour un
système multiprocesseur sont contraints de s’exécuter uniquement sur le processeur
maître. Cette contrainte s’appelle ”canalisation”.
Sérialisation des données
Tout élément de mémoire qui peut être lu ou écrit par plusieurs routines peut être modifié
pendant l’exécution du programme. Ce phénomène se produit généralement dans les
environnements de multiprogrammation et les environnements multitraitement. L’apparition
de systèmes multiprocesseur accroît la portée et l’importance de ce phénomène :
• La prise en charge de plusieurs processeurs et des routines incitent à la création
d’applications partageant les données entre plusieurs routines.
• Le noyau ne peut plus résoudre les incidents liés à la sérialisation des données en
désactivant simplement les interruptions.
Pour éviter une catastrophe, les programmes qui partagent des données doivent y accéder
de manière séquentielle et non plus en parallèle. Avant d’accéder à une donnée partagée,
chaque programme doit vérifier qu’aucun autre programme (y compris une copie de
lui-même s’exécutant au sein d’une autre routine) ne modifie la donnée.
Le principal mécanisme utilisé pour éviter les interférences entre programmes est le
verrouillage. Un verrou est une abstraction qui représente l’autorisation d’accès à un ou
plusieurs éléments de données. Les demandes de verrouillage ou de déverrouillage sont
atomiques : elles s’effectuent de telle sorte que ni les interruptions, ni l’accès
multiprocesseur n’affectent le résultat. Pour accéder à une donnée partagée, un programme
doit obtenir son déverrouillage. Si un autre programme (ou une autre routine exécutant le
même programme) a déjà obtenu ce déverrouillage et l’accès à la donnée, le programme
demandeur doit attendre que l’accès lui soit accordé.
Outre les temps d’attente d’accès aux données, la sérialisation accroît le nombre de
périodes pendant lesquelles une routine n’est pas diffusable. Pendant ces périodes, les
Introduction au multitraitement
3-3
autres routines sont susceptibles de modifier les lignes de la mémoire cache de cette
routine, ce qui augmente le délai de latence de la mémoire lorsque la routine obtient
finalement le déverrouillage de la donnée et redevient diffusable.
Le noyau AIX contient un grand nombre de données partagées et doit donc procéder à la
sérialisation des données en interne. Cela peut provoquer des retards de sérialisation, y
compris dans les applications qui ne partagent pas de données avec d’autres programmes,
car les fonctions du noyau utilisées par l’application doivent sérialiser les données
partagées du noyau.
Granularité du verrouillage
Un programmeur qui travaille dans un environnement multiprocesseur doit décider du
nombre de verrous distincts à créer pour les données partagées. Si un seul verrou doit
sérialiser l’ensemble des données partagées, le risque de conflit d’accès est relativement
élevé. Si chaque donnée dispose d’un verrou, le risque de conflit est relativement faible.
Cependant, toute demande supplémentaire de verrouillage ou de déverrouillage utilise du
temps processeur et l’existence de plusieurs verrous peut provoquer un blocage. La figure
”Blocage” présente le cas le plus simple de blocage : la routine 1 a obtenu le déverrouillage
de la donnée A et attend le déverrouillage de la donnée B et la routine 2 a obtenu le
déverrouillage de la donnée B et attend le déverrouillage de la donnée A. Aucun des deux
programmes ne peut obtenir le déverrouillage qui mettrait fin au blocage. Pour éviter les
blocages, on établit généralement un protocole par lequel tous les programmes qui utilisent
un ensemble de verrous doivent toujours obtenir le déverrouillage dans le même ordre.
Routine 1
Noyau
verrou A
verrou
accordé
.
.
.
verrou B
déverr. A
verrou
accordé
verrou
attente
verrou
attente
Routine 2
verrou B
.
.
.
verrou A
déverr. B
Blocage
Charge liée au verrouillage
Les demandes, délais et libérations de verrous augmentent la charge du système :
• Un programme qui prend en charge le multitraitement effectue en permanence les
mêmes opérations de verrouillage et de déverrouillage, même s’il s’exécute dans un
environnement monoprocesseur ou qu’il est le seul à utiliser un verrou donné dans un
système multiprocesseur.
• Si une routine demande le déverrouillage d’une donnée déjà obtenu par une autre
routine, il se peut que la routine demandeuse tourne un moment, soit mise en veille et, si
c’est possible, qu’une autre routine soit diffusée. Cela consomme du temps système.
• La présence de verrous très utilisés fixe une limite maximale au débit du système. Par
exemple, si un programme donné consacre 20 % de son temps d’exécution à l’utilisation
d’un verrou à exclusion mutuelle, 5 exemplaires au plus de ce programme peuvent
s’exécuter simultanément, quel que soit le nombre de processeurs du système.
En réalité, même 5 exemplaires seulement d’un programme ne seront jamais
suffisamment synchronisés pour éviter les temps d’attente (”Échelle de débit dans un
système multiprocesseur”, page 3-8).
3-4
AIX 4.3 Guide d’optimisation
Cohérence des mémoires cache
Les concepteurs de systèmes multiprocesseur veillent tout particulièrement à assurer la
cohérence des mémoires cache. Mais cette cohérence ne peut être garantie qu’au
détriment des performances. Pour comprendre pourquoi, il convient de connaître les
difficultés rencontrées :
Si chaque processeur possède une mémoire cache (voir figure ”Système multiprocesseur
symétrique”, page 3-3), qui indique l’état des différentes parties de la mémoire, il se peut
que plusieurs mémoires cache contiennent des copies d’une même ligne. Il se peut
également qu’une ligne contienne plusieurs données dotées d’un verrou. Si deux routines
apportent des modifications à ces données dans l’ordre correct, deux versions différentes et
incorrectes de la ligne de mémoire risquent d’être enregistrées dans les mémoires cache.
Le système n’est plus cohérent car il contient deux versions différentes du contenu d’une
zone de mémoire spécifique.
Pour rétablir la cohérence des mémoires cache, on conserve généralement une des lignes
et on invalide les autres. Bien que l’invalidation soit effectuée par le matériel, sans
intervention logicielle, tout processeur dont une ligne de mémoire cache a été invalidée
indiquera une absence en mémoire cache, avec le délai correspondant, la prochaine fois
qu’il recevra une demande concernant cette ligne.
Pour une étude détaillée de l’architecture d’adressage et des opérations sur la mémoire
cache ESCALA, reportez-vous à l’annexe C, ”Mémoire cache et adressage”.
Affinité avec un processeur
Si une routine est interrompue, puis rediffusée sur le même processeur, il se peut que la
mémoire cache de ce processeur contienne encore des lignes appartenant à cette routine.
Si la routine est diffusée sur un autre processeur, elle rencontrera probablement une série
d’absences en mémoire cache avant que la partie active de sa mémoire cache soit
récupérée de la RAM. Cependant, si une routine diffusable doit attendre que le processeur
sur lequel elle s’exécutait auparavant soit de nouveau disponible, elle risque d’attendre
encore plus longtemps.
L’affinité avec un processeur est la diffusion d’une routine sur le processeur sur lequel elle
s’exécutait auparavant. Le degré d’affinité avec un processeur doit varier
proportionnellement à la taille de la partie active de la mémoire cache et de manière
inversement proportionnelle au temps écoulé depuis la dernière diffusion.
Sous AIX version 4.1, l’affinité avec un processeur peut être effectuée via une liaison entre
une routine et un processeur. Une routine liée à un processeur ne peut s’exécuter que sur
ce processeur, quel que soit l’état des autres processeurs du système.
Conflits d’utilisation de mémoire et de bus
Dans un système monoprocesseur, les conflits d’utilisation de ressources internes (blocs de
mémoire, bus de mémoire ou d’entrées-sorties, etc.) sont généralement insignifiants en
terme de temps système. Dans un système multiprocesseur, ils peuvent prendre davantage
d’importance, notamment si les algorithmes de cohérence des mémoires cache augmentent
le nombre d’accès à la mémoire vive.
Introduction au multitraitement
3-5
Performances des systèmes SMS
Répartition de la charge de travail
Le premier problème de performances spécifique des systèmes SMS est la répartition de la
charge de travail, c’est-à-dire, l’exploitation efficace des n processeurs disponibles. En effet,
si seul un processeur d’un système quadriprocesseur est actif à un instant donné, le
système n’est pas plus performant qu’un système monoprocesseur. Il risque même de l’être
moins, du fait de l’existence du code destiné à éviter les interférences entre processeurs.
La répartition de la charge de travail est le pendant de la sérialisation des données. Si les
logiciels de base ou la charge de travail, ou leur interaction, requièrent la sérialisation des
données, la répartition de la charge de travail en pâtit.
Mieux vaut une répartition de la charge de travail moins équilibrée du fait d’une plus grande
affinité avec un processeur. Celle-ci améliorant l’efficacité de la mémoire cache, l’exécution
du programme s’en trouve accélérée. La répartition de la charge de travail est moindre
(sauf s’il y a plus de routines diffusables disponibles), mais le temps de réponse est réduit.
La répartition des processus, lesquels font partie de la charge de travail, est la proportion de
routines diffusables en permanence sur un processus multiroutines.
Débit
Le débit d’un système SMS dépend principalement des éléments suivants :
• Une répartition constamment très bonne de la charge de travail. Davantage de routines
diffusables que de processeurs à certains instants ne compense pas l’inactivité des
processeurs à d’autres.
• Le nombre de conflits d’accès.
• Le degré d’affinité avec un processeur.
Temps de réponse
Le temps de réponse d’un programme dans un système SMS est fonction des éléments
suivants :
• Le niveau de répartition des processus du programme. Si celui-ci a en permanence
plusieurs routines diffusables, son temps de réponse s’améliorera probablement dans un
environnement SMS. S’il est constitué d’une seule routine, son temps de réponse sera
au mieux comparable à celui d’un système monoprocesseur équivalent.
• Le nombre de conflits d’accès entre plusieurs instances d’un programme ou entre
plusieurs programmes différents utilisant les mêmes verrous.
• Le degré d’affinité avec un processeur. Si chaque diffusion d’un programme a lieu vers
des processeurs différents qui ne disposent pas des lignes de mémoire cache du
programme, celui-ci risque de s’exécuter plus lentement que dans un système
monoprocesseur comparable.
3-6
AIX 4.3 Guide d’optimisation
Adaptation des programmes à un environnement SMS
Les termes qui suivent permettent d’indiquer dans quelle mesure un programme a été
modifié ou créé pour fonctionner dans un environnement SMS :
Adaptation
minimale au
SMS
Suppression dans un programme de toute action (accès non sérialisé
aux données partagées, par exemple) susceptible de provoquer des
incidents dans un environnement SMS. Utilisé seul, ce terme désigne
généralement un programme qui a subi les modifications minimales
pour fonctionner correctement dans un système SMS.
Adaptation
correcte au
SMS
Suppression dans un programme de toute action susceptible de
provoquer des incidents liés à son fonctionnement ou à ses
performances dans un système multiprocesseur symétrique. Un
programme qui a subi une adaptation correcte a généralement subi
également une adaptation minimale. Il a subi des modifications
supplémentaires pour réduire au minimum les goulets d’étranglement
en formation.
Adaptation
totale au SMS
Ajout dans un programme de fonctions destinées à permettre son
fonctionnement correct dans un système SMS. Un programme qui a
subi cette adaptation a généralement subi aussi les deux autres
adaptations.
Introduction au multitraitement
3-7
Charge de travail d’un SMS
L’ajout de processeurs supplémentaires affecte les performances principalement en fonction
des caractéristiques de la charge de travail. Les sections suivantes décrivent ces
caractéristiques et leurs effets sur les performances.
• ”Multitraitement de la charge de travail”
• ”Échelle de débit dans un système multiprocesseur”
• ”Temps de réponse d’un système multiprocesseur”
Multitraitement de la charge de travail
Les systèmes d’exploitation à multiprogrammation comme AIX qui traitent d’énormes
charges de travail sur des ordinateurs rapides tels que le ESCALA donnent l’impression que
plusieurs opérations ont lieu simultanément. En réalité, nombre de charges de travail ne
contiennent jamais un grand nombre de routines diffusables, même lorsqu’elles sont traitées
sur un système monoprocesseur, sur lequel la sérialisation des données pose moins de
problèmes. Si le nombre de routines diffusables n’est pas en permanence au moins égal au
nombre de processeurs, un ou plusieurs d’entre eux seront inactifs une partie du temps.
Le nombre de routines diffusables est :
Le nombre
moins le
moins le
moins le
moins le
total
nombre
nombre
nombre
nombre
de
de
de
de
de
routines
routines
routines
routines
routines
dans le système,
qui attendent une entrée-sortie,
qui attendent une ressource partagée,
qui attendent les résultats d’une autre routine,
en veille à leur demande.
Une charge de travail peut faire l’objet d’un multitraitement si elle présente en permanence
autant de routines diffusables qu’il y a de processeurs dans le système. Notez qu’il ne s’agit
pas du nombre moyen de routines diffusables. Si le nombre de routines diffusables est égal
à zéro la moitié du temps, et double de celui de processeurs le reste du temps, le nombre
moyen de routines diffusables est effectivement égal au nombre de processeurs, mais tous
les processeurs ne sont actifs que la moitié du temps.
Augmenter le multitraitement de la charge de travail implique :
• l’identification et la suppression des goulets d’étranglement qui obligent les routines à
attendre
• l’augmentation du nombre total de routines dans le système.
Ces deux solutions ne sont pas indépendantes. Si un grand goulet d’étranglement se forme
sur le système, l’augmentation du nombre de routines de la charge de travail existante qui
passent dans le goulet d’étranglement va accroître la proportion de routines en attente. S’il
n’y a pas de goulet d’étranglement, l’augmentation du nombre de routines peut en créer un.
Échelle de débit dans un système multiprocesseur
Tous ces facteurs contribuent à ce que l’on appelle l’échelle d’une charge de travail. Cette
échelle est le degré dont bénéficie le débit de la charge de travail du fait de la disponibilité
de processeurs supplémentaires. Elle est généralement exprimée comme le quotient de la
charge de travail dans un système multiprocesseur par le débit dans un système
monoprocesseur comparable. Par exemple, si un système monoprocesseur traite
20 demandes par seconde et qu’un système quadriprocesseur traite 58 demandes par
seconde, pour une charge de travail donnée, l’échelle est 2,9. Cette charge de travail a
donc une échelle de débit élevée. Il s’agit par exemple d’une charge de travail constituée
exclusivement de programmes longs intégrant de nombreux calculs complexes, comportant
peu d’opérations d’entrée-sortie ou d’autre activité du noyau, et n’utilisant pas de données
partagées. Dans la réalité, la plupart des charges de travail ne correspondent pas à ce
modèle. L’échelle de débit est très difficile à mesurer. Lorsque c’est possible, il convient de
fonder les estimations sur des mesures de charges de travail réelles.
3-8
AIX 4.3 Guide d’optimisation
La figure ”Échelle dans un système multiprocesseur” illustre les difficultés de cette
opération. La charge de travail est constituée d’une série de commandes. Chaque
commande comporte un tiers de traitement normal, un tiers d’attente d’entrée-sortie et un
tiers de traitement avec un verrou fermé. Dans le système monoprocesseur, une seule
commande peut être traitée à la fois, que le verrou soit ouvert ou fermé. Dans l’intervalle de
temps indiqué sur la figure (égal à cinq fois le temps d’exécution de la commande), le
système monoprocesseur traite 7,67 commandes.
Monoprocesseur
Multi–processeur
à 2 voies
A
B
Traitement
Attente E/S
(ou verrou sur SM)
Verrou fermé
Mise à l’échelle dans un système multiprocesseur
Dans le système multiprocesseur, deux processeurs se partagent l’exécution des
programmes, mais il n’y a qu’un seul verrou. Par souci de simplicité, les conflits d’accès
n’affectent que le processeur B. Au cours de la période indiquée, le système
multiprocesseur traite 14 commandes. Le facteur d’échelle est ainsi de 1,83. On obtient le
même résultat avec un système comprenant un nombre supérieur de processeurs, c’est
pourquoi nous avons opté pour un système à deux processeurs. Le verrou est utilisé en
permanence. Dans un système quadriprocesseur, l’échelle serait de 1,83 ou moins.
Dans la réalité, les programmes sont rarement aussi symétriques que les commandes de
notre exemple. Rappelons également que nous n’avons pris en compte qu’un seul type de
conflit : les conflits d’accès. Si nous avions tenu compte de la cohérence des mémoires
cache et de l’affinité avec un processeur, l’échelle serait certainement encore inférieure.
Cet exemple démontre, s’il en était besoin, qu’il ne suffit pas d’ajouter des processeurs pour
augmenter la vitesse de traitement d’une charge de travail. Il est également indispensable
d’identifier et de minimiser les sources de conflits au sein des routines.
Selon certaines études, l’obtention d’échelles élevées ne pose de difficultés. Cependant,
ces études se fondent sur des programmes courts et gourmands en temps processeur qui
n’utilisent quasiment pas de fonctions noyau. Les résultats obtenus représentent en fait une
limite supérieure de l’échelle, non la réalité.
Introduction au multitraitement
3-9
Temps de réponse d’un système multiprocesseur
Un système multiprocesseur ne peut améliorer le temps de traitement d’un programme que
dans la mesure où celui-ci peut être exécuté en plusieurs routines. Plusieurs moyens
permettent d’exécuter en parallèle différentes parties d’un programme :
• Appels explicites de sous-routines libpthreads (ou de fork() dans les programmes plus
anciens) pour créer plusieurs routines exécutables simultanément.
• Traitement du programme à l’aide d’un compilateur ou d’un préprocesseur de
parallélisation qui détecte les séquences de code exécutables simultanément et génère
les routines requises pour l’exécution en parallèle.
• Utilisation d’un module logiciel multiroutines.
Sans recours à une ou plusieurs de ces techniques, la durée d’exécution d’un programme
dans un système multiprocesseur est la même que dans un système monoprocesseur
comparable. En fait, elle peut même être supérieure du fait de la mobilisation du temps
système par les opérations liées aux verrous et des retards liés à la répartition du
programme entre plusieurs processeurs à des instants différents.
Même si les trois techniques sont exploitées, la réduction du temps de traitement est limitée
par une règle dite Loi d’Amdahl :
Si une fraction x du temps de traitement t d’un programme dans un système
monoprocesseur ne peut être traitée que de manière séquentielle, la réduction du temps
d’exécution dans un système à n processeurs par rapport au temps d’exécution dans un
système monoprocesseur comparable (augmentation de la vitesse) est donnée par
l’équation :
Aug. vit
=
temps syst. monopr
tps séq + tps multipr
lim aug. vit
n!1
=
=
t
xt + (x–1)t
n
=
1
x+x
n
1
x
Par exemple, si un programme doit être exécuté pour 50 % séquentiellement et pour 50 %
en parallèle, le facteur maximal d’amélioration du temps de réponse est inférieur à 2
(dans un système quadriprocesseur libre, ce facteur n’excède pas 1,6).
3-10
AIX 4.3 Guide d’optimisation
Programmation dans un système SMS
La prise en charge des routines, nouveauté d’AIX version 4.1, divise l’exécution des
programmes en deux éléments :
• Un processus est l’ensemble des ressources physiques nécessaires à l’exécution du
programme. Exemple : mémoire, accès aux fichiers, etc.
• Une routine est l’état d’exécution d’une instance de programme (contenu actuel du
registre d’adresses d’instructions et des registres généraux). Une routine s’exécute
toujours dans le cadre d’un processus et en exploite les ressources. Plusieurs routines
peuvent s’exécuter au sein d’un même processus et partager ses ressources.
Dans les versions précédentes d’AIX, le programmateur de l’unité centrale diffusait les
processus. Dans la version 4.1, il diffuse les routines.
Dans un environnement SMS, la prise en charge des routines facilite la mise en oeuvre à
moindre coût d’applications ayant subi une adaptation totale SMS. Le traitement parallèle
de plusieurs processus pour créer différents ordres d’exécution est fastidieux et onéreux car
chaque processus possède ses propres ressources mémoire et requiert énormément de
traitement système pour sa mise en place. La création de plusieurs routines dans un seul
processus demande moins de traitement et occupe moins de mémoire.
La prise en charge des routines existe à deux niveaux :
• libpthreads.a dans l’environnement du programme et
• au niveau du noyau.
Traitement programmé de charges de travail migrées
La nouvelle distinction entre processus et routine est transparente pour les programmes
existants. En fait, les charges de travail qui ont subi une migration directement à partir de
versions précédentes d’AIX créent des processus comme auparavant. Chaque nouveau
processus est créé avec une seule routine (routine initiale) qui est en concurrence avec les
routines des autres processus pour l’accès aux ressources CPU. Les attributs par défaut de
la routine initiale, associés aux nouveaux algorithmes de programmation, réduisent au
minimum les modifications de la dynamique du système pour les charges de travail
inchangées.
Les priorités sont manipulées à l’aide des commandes nice et renice et des commandes
d’appel système setpri et setpriority , comme auparavant. Le programmateur permet
l’exécution d’une routine donnée pendant une tranche de temps (10 ms généralement) au
maximum avant de forcer le passage à la prochaine routine diffusable de priorité égale ou
supérieure.
Variables de l’algorithme de programmation
Plusieurs variables affectent la programmation des routines. Certaines sont spécifiques de
la prise en charge des routines et les autres résultent de considérations sur la
programmation des processus :
Priorité
Indicateur fondamental de son degré de priorité pour
l’accès au processeur.
Position dans la file d’attente La position d’une routine dans la file d’attente des routines
du programmateur
diffusables reflète un certain nombre de conditions de
priorité.
Politique de planification
Attribut qui détermine le devenir d’une routine en cours
d’exécution à l’expiration de la tranche de temps qui lui est
affectée.
Introduction au multitraitement
3-11
Portée concurrentielle
Détermine si la routine est en concurrence uniquement
avec les autres routines du processus ou avec l’ensemble
des routines du système. Une routine pthread créée avec
une portée concurrentielle au niveau du processus est
planifiée par la bibliothèque alors que celles créées avec
une portée globale sont planifiées par le noyau. Le
programmateur de la bibliothèque utilise un pool de
routines du noyau pour planifier les routines pthreads avec
une portée concurrentielle. En règle générale, les routines
pthreads doivent être créées avec une portée
concurrentielle globale si elles traitent des E/S. La portée
concurrentielle est utile si les synchronisations
intra–processus sont nombreuses. Il s’agit d’un concept
libpthreads.a.
Affinité avec un processeur
Effet de l’affinité avec un processeur sur les performances.
L’ensemble de ces considérations peut sembler complexe, mais il existe essentiellement
trois démarches de gestion d’un processus donné :
Par défaut
Le processus a une routine dont le degré de priorité varie
selon la consommation de l’unité centrale et dont la
politique de programmation, SCHED_OTHER, est
semblable à l’algorithme d’AIX version 3.
Contrôle au niveau du
processus
Le processus peut avoir une ou plusieurs routines, mais
leur politique de programmation est celle par défaut
(SCHED_OTHER), ce qui permet l’utilisation des
techniques d’AIX version 3 pour contrôler les valeurs nice
et les priorités fixes. Toutes ces techniques affectent
l’ensemble des routines du processus de la même façon. Si
la commande setpri() est utilisée, la politique de
programmation SCHED_RR est adoptée pour toutes les
routines du processus.
Contrôle au niveau des
routines
Une ou plusieurs routines peuvent être associées au
processus. La politique de planification de ces routines est
définie, selon le cas, à SCHED_RR ou à SCHED_FIFO. La
priorité de chaque routine, fixe, est manipulée à l’aide de
sous-routines.
Planification des variables d’environnement
Au sein de la structure libpthreads.a, une série de réglages permettent d’influer sur les
performances de l’application. Ces variables d’environnement sont les suivantes :
• SPINLOOPTIME=n, où n est le nombre de tentatives effectuées face à un verrou
occupé avant de passer à un autre processeur. n doit être une valeur positive.
• YIELDLOOPTIME=n, où n est le nombre de tentatives de libération du processeur avant
le blocage sur un verrou occupé. n doit être une valeur positive. Le processeur est
alloué à une autre routine du noyau, sous réserve qu’il y en ait une exécutable et dotée
du niveau de priorité suffisant.
• AIXTHREAD_SCOPE={P|S}, où P indique une portée concurrentielle locale et S une
portée concurrentielle globale. Vous devez indiquer ”P” ou ”S”. Les accolades ne sont
motivées que par la syntaxe. L’utilisation de cette variable d’environnement affecte
uniquement les routines créées avec l’attribut par défaut. L’attribut par défaut est
employé lorsque le paramètre attr de pthread_create a la valeur NULL.
Les variables d’environnement suivantes affectent la planification des routines pthreads
créées avec une portée concurrentielle locale.
3-12
AIX 4.3 Guide d’optimisation
• AIXTHREAD_MNRATIO=p:k, où k est le nombre de routines du noyau qui doivent être
employées pour gérer p routines pthreads exécutables. Cette variable d’environnement
détermine le facteur d’échelle de la bibliothèque. Ce rapport est utilisé pour créer et
terminer les routines pthreads.
• AIXTHREAD_SLPRATIO=k:p, où k est le nombre de routines du noyau devant être
réservées pour p routines pthreads en veille. En règle générale, le nombre de routines du
noyau nécessaires pour la prise en charge des routines pthreads en veille est limité,
puisque ces routines sont en principe réveillées une à une à mesure du traitement des
verrous et/ou des événements. Ceci permet d’économiser les ressources du noyau.
• AIXTHREAD_MINKTHREADS=n, où n est le nombre minimum de routines du noyau
devant être utilisées. Le nombre de routines du noyau demandées par le planificateur de
la bibliothèque ne descendra jamais en deçà de ce seuil. Il est possible de réclamer une
routine du noyau en n’importe quel point. En général, une routine du noyau est
demandée en raison de la fin d’une routine pthread.
Introduction au multitraitement
3-13
Affinité avec un processeur et liaisons
Toutes choses égales par ailleurs, il est souhaitable de diffuser une routine sur le dernier
processeur sur lequel elle a été utilisée. Ce critère de diffusion est appelé affinité avec un
processeur. Le niveau d’affinité avec un processeur peut varier.
Le degré d’affinité le plus élevé est la liaison entre une routine et un processeur. Dans ce
cas, la routine est diffusée uniquement sur ce processeur, même si d’autres processeurs
sont disponibles. La commande et sous-routine bindprocessor lient la ou les routine(s) du
processus spécifié à un processeur particulier.
Cette technique peut être utile pour les programmes gourmands en temps CPU qui
subissent peu d’interruptions. Cependant, elle peut entraver l’exécution de programmes
ordinaires car elle risque de retarder la diffusion d’une routine après une E/S jusqu’à
libération du processeur auquel elle est liée. Si la routine est bloquée pendant toute la
durée d’une E/S, il est peu probable que son contexte de traitement demeure dans les
mémoires cache du processeur auquel elle est liée. Il est préférable de la diffuser sur le
prochain processeur disponible.
3-14
AIX 4.3 Guide d’optimisation
Chapitre 4. Planification, conception et implantation
Pour être fonctionnel, un programme doit être performant.
Chaque programme doit satisfaire un ensemble d’utilisateurs, souvent hétérogène. Si les
performances d’un programme se révèlent inacceptables pour un groupe significatif de ces
utilisateurs, il ne sera pas utilisé. Un programme non utilisé ne remplit pas sa fonction
première.
Le même critère vaut pour les logiciels sous licence et les applications écrites par les
utilisateurs. C’est pourquoi la plupart des développeurs accordent une attention particulière
aux performances de leurs programmes. Malheureusement, ils ne peuvent prévoir
l’environnement et les conditions dans lesquelles ils seront exploités. La responsabilité
finale des performances incombe à ceux qui sélectionnent (ou écrivent), planifient et
installent les logiciels.
Ce chapitre décrit les étapes d’optimisation des performances d’un programme (acheté ou
développé en interne). Le terme ”programmeur” désigne, dans ce chapitre, l’administrateur
système ou toute personne responsable de l’efficacité finale du programme.
Pour parvenir à des performances acceptables, il faut en définir et en quantifier le niveau
dès le lancement du projet, et ne pas perdre de vue ces objectifs ni les moyens nécessaires
à leur réalisation. Ces conseils semblent évidents, mais certains projets n’en tiennent
délibérément pas compte. Ils pratiquent la formule ”concevoir, coder, mettre au point,
éventuellement documenter et, si le temps le permet, optimiser les performances”.
Le seul moyen de garantir à l’avance des programmes efficaces et non pas seulement
opérationnels, est d’intégrer dans la planification et le processus de développement des
critères de performances. En effet, il est souvent plus difficile de faire une planification fiable
sur des logiciels préexistants, l’installateur ne bénéficiant pas de la même marge de
manœuvre que le développeur.
Le processus proposé peut sembler très lourd pour un petit programme, mais il ne faut pas
oublier que l’objectif est double : le programme doit non seulement être performant, mais
son intégration dans le système ne doit pas nuire aux performances des programmes
installés.
Cette section traite des points suivants :
• ”Identification des composants de la charge de travail”
• ”Définition des objectifs de performance”
• ”Évaluation des ressources requises par la charge de travail”
• ”Évaluation des ressources requises par le programme”
• ”Évaluation de la charge de travail à partir de celle du programme”
Autres points :
• ”Conception et implantation de programmes performants”
• ”Conseils pour une installation performante”
Planification, conception et implantation
4-1
Identification des composants de la charge de travail
Que le programme soit créé en interne ou acheté tel quel, qu’il soit petit ou volumineux, le
développeur, l’installateur et les utilisateurs potentiels doivent être capables de répondre à
un certain nombre de questions :
• Qui est appelé à utiliser le programme ?
• Quelles seront les conditions d’exploitation du programme ?
• Selon quelle fréquence et à quel moment (heure, jour, mois, année) le programme
sera-t-il utilisé ?
• Le programme devra-t-il cohabiter avec d’autres programmes ?
• Sur quel système sera-t-il exploité ?
• Quel est le volume et l’origine des données à traiter ?
• Les données créées par ou pour le programme seront-elles exploitées par d’autres
moyens ?
Faute d’être élucidées lors de la conception du programme, ces questions risquent de
rester sans réponse précise – les évaluations des programmeurs et des utilisateurs
potentiels ayant de fortes chances d’être divergentes. Même dans le cas de figure
apparemment fort simple où le programmeur et l’utilisateur sont une seule et même
personne, il est nécessaire d’établir ces objectifs au préalable pour pouvoir confronter de
façon rigoureuse résultats et objectifs. En outre, il est impossible d’estimer les
performances requises sans une analyse détaillée du travail à effectuer.
Définition des objectifs
La définition et la quantification des objectifs de performances passent par la
compréhension des besoins : utilisateurs et programmeurs ne fonderont sans doute pas
leurs exigences sur les mêmes critères. Dans tous les cas, il faut définir, au minimum :
• Le temps de réponse maximum acceptable dans la plupart des cas pour chaque
interaction utilisateur-machine, avec une définition de ce qu’est ”la plupart des cas”.
Rappelons que le temps de réponse est calculé à partir du moment où l’utilisateur donne
son ”feu vert” pour lancer l’action jusqu’au moment où il reçoit de la machine
suffisamment d’informations pour poursuivre sa tâche. Il s’agit d’un délai d’attente
subjectif, fonction de l’utilisateur. Ce n’est pas le délai écoulé ”entre l’entrée dans la
sous-routine et la première instruction d’écriture”.
Si un utilisateur prétend n’accorder aucune importance au temps de réponse et ne
s’intéresser qu’au résultat, demandez-lui si un temps d’exécution en autonome dix fois
supérieur aux temps actuels est acceptable. S’il répond oui, passez aux problèmes de
débit. Sinon, poursuivez avec l’utilisateur la discussion sur les temps de réponse.
• Le temps de réponse à la limite de l’acceptable le reste du temps. Autrement dit, le
temps de réponse au-delà duquel l’utilisateur commence à penser que le système est
hors service (ou du moins se plaint de la lenteur de la machine au point d’être réticent à
l’utiliser). Il vous faut également préciser ce qu’est le ”reste du temps”, la minute de
pointe de la journée, 1 % des interactions, etc. Ces termes sont également soumis à la
subjectivité de l’utilisateur : par exemple, la dégradation du temps de réponse peut être
plus coûteuse et préjudiciable à un certain moment de la journée.
• Le débit généralement requis et les heures où il se produit. Encore une fois, ce critère ne
peut pas être ignoré. Par exemple : Supposons qu’un programme doit être exécuté deux
fois par jour, à 10 h 00 et à 15 h 15. S’il est limité en CPU, requiert 15 minutes et est
appelé à fonctionner sur un système multiutilisateur, son exécution doit faire l’objet d’une
négociation préalable.
• La durée et les heures des périodes de débits maximaux.
• La variété des requêtes formulées et son évolution dans le temps.
4-2
AIX 4.3 Guide d’optimisation
• Le nombre d’utilisateurs par machine et le nombre total d’utilisateurs dans le cas d’une
application multiutilisateur. Cette description doit indiquer les heures de connexion de ces
utilisateurs, ainsi qu’une évaluation du temps de saisie au clavier, d’attente de l’exécution
des requêtes et des temps de réflexion. Vous pouvez tenter de savoir si les temps de
réflexion varient systématiquement en fonction de la requête suivante ou précédente.
• Les hypothèses de l’utilisateur sur les machines prévues. S’il pense à une machine en
particulier, il vous faut le savoir dès à présent. De même, s’il a des exigences en terme
de type, de taille, de coût, d’emplacement, d’interconnexion ou d’autres variables
susceptibles de limiter votre marge de manœuvre, vous devez intégrer ces exigences à
vos objectifs. L’estimation des résultats ne sera sans doute pas réalisée sur le système
où le programme a été développé, testé ou installé initialement.
Évaluation des ressources requises par la charge de travail
A moins que vous n’ayez acheté un logiciel avec une documentation complète sur les
ressources requises, cette tâche est souvent la plus délicate dans le processus de
planification des performances. Il y a plusieurs raisons à cela :
• AIX propose toujours plusieurs moyens d’effectuer une tâche : Vous pouvez écrire un
programme C (ou autre HLL), un script shell, un script awk ou sed , un dialogue
AIXwindows, etc. Certaines techniques, qui apparaissent particulièrement adaptées au
niveau de l’algorithme et de la productivité du programmeur, peuvent se révéler
extrêmement coûteuses en termes de performances.
Une des règles d’or est que plus le niveau d’abstraction est élevé, plus il faut, pour éviter
toute surprise désagréable, être attentif au niveau des performances. Il convient
notamment d’évaluer soigneusement les volumes de données et les itérations induites
par des constructions apparemment anodines.
• Il est difficile de définir dans AIX le coût exact d’un processus pris individuellement.
Le problème n’est pas seulement d’ordre technique, il est aussi d’ordre philosophique :
si plusieurs instances d’un programme exécutées par plusieurs utilisateurs partagent les
pages d’un texte de programme, à quel processus doivent être imputées ces pages de
mémoire ? Le système d’exploitation conserve en mémoire les pages de fichiers
récemment utilisées (simulant une mise en mémoire cache), les laissant à disposition
des programmes qui les requièrent. L’espace monopolisé pour conserver ces données
doit-il être imputé aux programmes qui vont de nouveau accéder à ces données ?
La granularité de certaines mesures, telles que l’horloge système, peut entraîner des
variations du temps CPU attribué aux instances successives d’un programme.
Il existe deux approches pour traiter le problème des variations et des ambiguïtés
relatives aux ressources. La première consiste à ignorer l’ambiguïté et à éliminer
progressivement les sources de variation jusqu’à ce que les mesures atteignent un
degré de cohérence acceptable. La seconde consiste à tenter de réaliser les mesures
les plus réalistes possibles et à décrire statistiquement le résultat. Cette dernière
approche est préférable car elle induit des résultats en corrélation avec diverses
situations d’exploitation.
• Les systèmes AIX sont rarement dédiés à l’exécution d’une seule instance d’un
programme unique. Le plus souvent, démons, activités de communication, charges de
travail de multiples utilisateurs cohabitent. Ces activités sont rarement cumulatives.
Par exemple, augmenter le nombre d’instances d’un programme n’entraîne parfois le
chargement que de quelques pages de texte de programme, l’essentiel du programme
étant déjà en mémoire. Cependant, le processus supplémentaire peut générer une
concurrence plus importante au niveau des mémoires cache du processeur, si bien que
non seulement les autres processus sont contraints de partager le temps processeur
avec le nouveau venu, mais ils doivent tous subir davantage de cycles par instruction
(le processeur étant ralenti par un nombre supérieur d’absences en mémoire cache).
Il est recommandé d’effectuer une évaluation la plus réaliste possible :
Planification, conception et implantation
4-3
– Si le programme existe, effectuez vos mesures sur l’installation en place la plus
proche de vos objectifs.
– Si aucune installation ne coïncide, mettez en place une installation-test et évaluez la
charge globalement.
– S’il est difficile de simuler une charge globale, mesurez chaque interaction et utilisez
les résultats pour la simulation.
– Si le programme n’est pas encore créé, effectuez vos mesures sur un programme
comparable qui utilise le même langage et présente une structure générale analogue.
Rappelons que plus le langage est abstrait, plus la comparaison doit être effectuée
minutieusement.
– Si aucun programme existant n’est suffisamment proche, élaborez un prototype des
principaux algorithmes dans le langage prévu, mesurez-le et modélisez la charge de
travail.
– Si, et seulement si, toute mesure se révèle impossible, il vous faut travailler par
tâtonnements. Si les besoins en ressources doivent être évalués lors de la
planification, le programme réel doit plus que jamais être mesuré dès que possible
pendant la phase de développement.
L’estimation des ressources passe par la définition de quatre grandeurs principales
(l’ordre important peu) :
Temps CPU
Coût processeur de la charge de travail
Accès disque
Taux de lectures/écritures générées par la charge
Mémoire réelle
Quantité de RAM requise par la charge de travail
Trafic réseau
(LAN)
Nombre de paquets générés par la charge et nombre d’octets de
données échangés
Les sections suivantes indiquent comment déterminer ces valeurs dans les divers cas de
figure exposés précédemment.
Mesure des ressources requises
Si le programme réel, un programme analogue ou un prototype est disponible, le choix de la
méthode dépend des facteurs suivants :
• Le système traite-t-il d’autres travaux que la charge de travail à mesurer ?
• Est-il possible d’utiliser des outils susceptibles de nuire aux performances (le système
est-il en service ou actif uniquement pour effectuer les mesures) ?
• Jusqu’à quel point la charge réelle peut-elle être simulée ou observée ?
Mesure de la charge totale sur un système dédié
Ce cas de figure est idéal car il permet d’inclure le temps système et le coût de chaque
processus.
Pour mesurer l’activité disque et CPU, lancez la commande iostat. La commande
$ iostat 5 >iostat.output
indique l’état du système toutes les 5 secondes au cours des opérations de mesure. Le
premier résultat fourni par iostat communique les données cumulées depuis le dernier
amorçage jusqu’au lancement de la commande iostat. Les résultats suivants concernent
l’intervalle précédent (dans ce cas, les 5 dernières secondes). Voici un exemple de sortie de
iostat exécutée sur un grand système :
4-4
AIX 4.3 Guide d’optimisation
tty:
tin
1.2
Disks:
hdisk1
hdisk2
hdisk3
hdisk4
hdisk11
hdisk5
hdisk6
hdisk7
hdisk8
hdisk9
hdisk0
hdisk10
tout
cpu:
1.6
% tm_act
Kbps
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
3.0
11.2
1.8
4.8
0.0
0.0
2.0
4.8
0.0
0.0
% user
% sys
% idle
60.2
10.8
23.4
tps
Kb_read
Kb_wrtn
0.0
0
0
0.0
0
0
0.0
0
0
0.0
0
0
0.0
0
0
0.0
0
0
0.0
0
0
0.8
8
48
1.2
0
24
0.0
0
0
1.2
24
0
0.0
0
0
% iowait
5.6
Pour mesurer la mémoire, utilisez svmon. La commande svmon –G fait le point sur
l’utilisation globale de la mémoire. Le résultat statistique est exprimé en pages de 4 ko :
$ svmon –G
m e m o r y
size inuse free pin
24576 24366
210 2209
i n u s e
work pers clnt
15659 6863 1844
p i n
work pers
2209
0
p g s p a c e
clnt
size inuse
0
40960 26270
Dans cet exemple, les 96 Mo de mémoire de la machine sont entièrement utilisés. 64 % de
mémoire RAM environ sont dédiés aux segments de travail (lecture/écriture des
programmes exécutés). S’il existe des processus longs qui vous intéressent, examinez en
détail leurs besoins en mémoire. L’exemple suivant détermine la mémoire utilisée par l’un
des processus de l’utilisateur xxxxxx.
$ ps –fu
USER
xxxxxx
xxxxxx
xxxxxx
xxxxxx
PID PPID
28031 51445
51445 54772
54772 6864
$ svmon –P 51445
Pid
51445
C
STIME
15 14:01:56
1 07:57:47
0 07:57:47
TTY
pts/9
pts/9
–
TIME CMD
0:00
ps –fu xxxxxx
0:00
–ksh
0:02
rlogind
Command
ksh
Inuse
1668
Pin
2
Pgspace
4077
Pid: 51445
Command: ksh
Segid
8270
4809
9213
8a1
Type
pers
work
work
pers
Description
Inuse
/dev/fslv00:86079
1
shared library
1558
private
37
code,/dev/hd2:14400
72
Pin
0
0
2
0
Pgspace
0
4039
38
0
Address Range
0..0
0..4673 :60123..65535
0..31 : 65406..65535
0..91
Le coût de cette instance de ksh est imputable au segment de travail (9213) dont 37 pages
sont en cours d’utilisation. Le coût des 1558 pages de la bibliothèque partagée et celui des
72 pages de l’exécutable ksh est réparti respectivement sur l’ensemble des programmes et
des instances de ksh.
Si vous estimez que la taille du système de 96 Mo est excessive, utilisez la commande
rmss pour réduire la taille effective de la machine et reprenez les mesures de la charge.
Si les opérations de pages augmentent sensiblement ou que le temps de réponse s’allonge,
cela signifie que vous avez trop réduit la mémoire. Appliquez cette méthode jusqu’à ce que
vous trouviez la taille la plus appropriée à l’exécution de la charge dans les meilleures
conditions. Pour en savoir plus sur cette méthode, reportez-vous à ”Estimation de la
mémoire requise via rmss”, page 7-6.
Planification, conception et implantation
4-5
La principale commande pour mesurer l’utilisation du réseau est netstat. L’exemple
ci-dessous illustre l’activité d’une interface de réseau en anneau à jeton :
$ netstat –I tr0 5
input
(tr0)
output
packets errs packets errs colls
35552822 213488 30283693
0
0
300
0
426
0
0
272
2
190
0
0
231
0
192
0
0
143
0
113
0
0
408
1
176
0
0
input
(Total)
output
packets errs packets errs colls
35608011 213488 30338882
0
0
300
0
426
0
0
272
2
190
0
0
231
0
192
0
0
143
0
113
0
0
408
1
176
0
0
La première ligne indique le trafic cumulé sur le réseau depuis le dernier amorçage. Chaque
ligne qui suit fournit l’activité enregistrée lors des 5 secondes précédentes.
Mesure de la charge totale sur un système actif
La méthode à utiliser est analogue à celle appliquée aux systèmes dédiés, mais vous
devez, dans ce cas, veiller à préserver les performances du système. Il faut savoir, par
exemple, que le coût d’exécution de la commande svmon –G est très élevé. L’annexe E,
”Outils de performance”, donne une estimation des coûts, en termes de ressources, des
outils de performances les plus couramment utilisés.
L’outil le moins coûteux est probablement vmstat, qui fournit des informations sur la
mémoire, les opérations d’E/S et l’utilisation du processeur, en un seul rapport. Si les
intervalles entre deux rapports vmstat restent raisonnablement longs (10 secondes), le coût
moyen d’utilisation de cette commande est faible. Pour plus de détails sur l’utilisation de
vmstat, reportez-vous à ”Identification des ressources limitatives”, page 12-23.
Mesure d’une charge partielle sur un système actif
Une telle mesure est intéressante lorsque vous souhaitez transférer ou dupliquer une partie
de la charge pour l’exécuter sur un autre système. Le système étant en service, votre
intervention doit l’affecter le moins possible. Il vous faut analyser la charge en détail pour
distinguer la partie qui vous intéresse et déterminer les éléments communs. Il peut s’agir :
• du programme ou de quelques programmes associés,
• du travail effectué par certains utilisateurs du système,
• du travail provenant de certains terminaux.
Selon le critère choisi, utilisez l’une des commandes :
ps –ef | grep pgmname
ps –fuusername, . . .
ps –ftttyname, . . .
pour identifier les processus qui vous intéressent et de faire le point sur leur consommation
en temps CPU. Pour évaluer l’occupation mémoire de ces processus, vous pouvez utiliser
la commande svmon (judicieusement !).
4-6
AIX 4.3 Guide d’optimisation
Mesure d’un programme particulier
Plusieurs outils sont disponibles pour mesurer la consommation en ressources de
programmes particuliers. Certains offrent une mesure de la charge plus complète que
d’autres, mais ils ont trop d’incidence sur le système pour être appliqués à un système en
service. La plupart de ces outils sont décrits dans les chapitres relatifs à l’optimisation de la
consommation de ressources spécifiques. Les principaux sont :
time
mesure le délai d’exécution écoulé et la consommation CPU d’un
programme individuel. Reportez-vous à ”Mesure de la CPU via time”,
page 6-3.
tprof
mesure la consommation relative de CPU par les programmes, les
bibliothèques de sous-routines et le noyau AIX. Reportez-vous à
”Analyse des programmes via tprof”, page 6-10.
svmon
mesure la mémoire réelle utilisée par un processus. Reportez-vous à
”Quantité de mémoire utilisée”, page 7-2.
vmstat –s
permet de mesurer la charge des E/S générée par un programme.
Reportez-vous à ”Mesure des E/S disque globales via vmstat”,
page 8-7.
Estimation des ressources requises par un nouveau programme
Il est impossible d’évaluer précisément des programmes qui n’ont pas encore été écrits :
les adaptations et nouveautés apportées à un programme pendant la phase de codage sont
imprévisibles. Toutefois, quelques règles de base peuvent vous aider à faire une évaluation
approximative. Au minimum, un programme requiert au départ :
• Temps CPU
– environ 50 millisecondes, en général de temps système,
• Mémoire réelle
– une page par texte de programme,
– une quinzaine de pages (dont 2 fixes) pour le segment (de données) de travail,
– un accès à libc.a (généralement partagé entre tous les programmes et englobé dans
le coût de base du système d’exploitation),
• E/S disque
– environ 12 opérations de chargement de pages si le programme n’a pas été compilé,
copié ou récemment utilisé, sinon 0.
Ajoutez les coûts représentés par les demandes liées à la conception (les temps CPU
indiqués concernent le modèle 660) :
• Temps CPU
– La consommation CPU d’un programme ordinaire, contenant peu de niveaux
d’itérations ou d’appels de sous-routines coûteuses, est négligeable et
quasi-impossible à mesurer.
– Si le programme fait appel à des algorithmes de calcul lourds, chaque algorithme doit
être mesuré à partir d’un prototype.
– Si le programme fait appel à des sous-routines de bibliothèques coûteuses en calculs
(éléments de X ou de Motif ou printf, par exemple), mesurez la consommation CPU
en vous basant sur d’autres programmes ordinaires.
Planification, conception et implantation
4-7
• Mémoire réelle
– Comptez (très approximativement) 350 lignes de code par page de texte programme.
C’est-à-dire environ 12 octets par ligne. N’oubliez pas que le style de code et les
options du compilateur peuvent multiplier ou diviser le résultat par deux.
Cette variation concerne les pages impliquées dans le scénario type.
Si, occasionnellement, des sous-routines exécutées sont insérées à la fin de
l’exécutable, les pages concernées ne sollicitent généralement pas la mémoire réelle.
– Les références à des bibliothèques partagées autres que libc.a n’augmentent la
consommation mémoire que dans la mesure où ces bibliothèques ne sont pas
partagées par d’autres programmes ou instances du programme considéré. Pour
mesurer la taille des bibliothèques, écrivez un programme simple, d’exécution longue
qui y fait référence, et appliquez svmon –P au processus.
– Évaluez la capacité de stockage requise par les structures de données identifiées
dans le programme. Arrondissez le résultat à la page la plus proche.
– Dans une exécution courte, chaque opération d’E/S disque utilisera une page de
mémoire. Supposons que la page doit déjà être disponible. Ne supposez pas que le
programme va attendre la libération d’une autre page du programme.
• E/S disque
– Pour les E/S séquentielles, chaque lot de 4 096 octets lus ou écrits génère une
opération d’E/S, sauf si certaines pages du fichier sont encore en mémoire du fait
d’une utilisation récente.
– Pour les E/S aléatoires, chaque accès, même limité, à une page différente de
4 096 octets génère une opération d’E/S, sauf si certaines pages du fichier sont
encore en mémoire du fait d’une utilisation récente.
– Dans des conditions de laboratoire, chaque lecture ou écriture séquentielle d’une page
de 4 ko dans un fichier volumineux mobilise environ 140+/–20 microsecondes de
temps CPU. Chaque lecture ou écriture aléatoire d’une page de 4 ko mobilise environ
350+/–40 microsecondes de temps CPU. Rappelons qu’en pratique les fichiers ne
sont pas nécessairement stockés séquentiellement sur disque, même s’ils sont écrits
et lus séquentiellement dans le programme. Par conséquent, un accès disque
représente en réalité un coût CPU généralement plus proche de celui d’un accès
aléatoire que d’un accès séquentiel théorique.
• E/S de communication
– Les E/S disque sur des systèmes de fichiers montés à distance, de type NFS ou AFS,
sont exécutées sur le serveur. Dans ce cas, il y a davantage de demandes mémoire et
CPU côté client.
– Les appels de procédure à distance (RPC) de tous types constituent une bonne part
de la charge CPU. C’est pourquoi il est conseillé de les réduire au minimum, de
différer leur traitement, d’en faire un prototype et de les mesurer à l’avance.
– Dans des conditions de laboratoire, chaque lecture ou écriture NFS d’une page de
4 ko mobilise environ 670+/–30 microsecondes de temps CPU client.
Chaque lecture ou écriture aléatoire NFS d’une page de 4 ko mobilise environ
1000+/–200 microsecondes de temps CPU client.
4-8
AIX 4.3 Guide d’optimisation
Évaluation de la charge de travail à partir de celle du programme
Pour évaluer les besoins en ressources moyens et maximaux, le mieux est d’utiliser un
modèle de mise en file d’attente du type BEST/1. Si vous optez pour un modèle statique,
vous risquez de sous ou surestimer la limite maximale. Dans les deux cas, vous devez bien
appréhender les interactions entre programmes, en termes de ressources.
Si vous élaborez un modèle statique, utilisez l’intervalle de temps correspondant au pire
temps de réponse acceptable pour le programme le plus sollicité. Déterminez, en fonction
du nombre d’utilisateurs prévu, leur temps de réflexion, la fréquence des saisies au clavier,
les diverses opérations par anticipation et les programmes généralement exécutés pendant
chaque intervalle.
• Temps CPU
– Faites la somme des besoins CPU requis par tous les programmes exécutés durant
cet intervalle. N’oubliez pas d’y inclure les temps requis par les E/S de communication
et les E/S disque effectuées par les programmes.
– Si ce nombre est supérieur à 75 % du temps CPU disponible durant cet intervalle,
envisagez de réduire le nombre d’utilisateurs ou d’augmenter la capacité CPU.
• Mémoire réelle
– Commencez avec 6 à 8 Mo pour le système d’exploitation lui-même. Le chiffre
inférieur concerne un système autonome. Le dernier est applicable à un système
connecté au LAN et exploitant TCP/IP et NFS.
– Faites la somme des besoins des segments de travail pour toutes les instances de
programmes qui doivent être exécutées durant cet intervalle, en incluant l’espace
estimé pour les structures de données du programme.
– Ajoutez la capacité mémoire requise du segment de texte pour chaque programme
distinct devant être exécuté (une copie d’un texte de programme dessert toutes les
instances de ce programme). Rappelons que toutes les sous-routines (et seulement
les sous-routines) provenant de bibliothèques non partagées sont partie intégrante de
l’exécutable, mais que les bibliothèques ne sont pas en mémoire.
– Ajoutez la quantité d’espace consommé par chacune des bibliothèques partagées
utilisées par les programmes. Ici aussi, une copie dessert tous les programmes.
– Pour réserver suffisamment d’espace à la mise en mémoire cache de certains fichiers
et à la liste ouverte, vos prévisions en mémoire totale ne doivent pas excéder 80 % de
la mémoire de la machine prévue.
• E/S disque
– Faites la somme des E/S impliquées par chaque instance de chaque programme.
Distinguez entre les E/S sur les petits fichiers et les E/S aléatoires sur les grands
fichiers, d’une part, et les E/S purement séquentielles sur les gros fichiers (de plus
de 32 ko), d’autre part.
– Retranchez les E/S qui, selon vous, seront satisfaites à partir de la mémoire.
Tout enregistrement lu ou écrit dans l’intervalle précédent est probablement toujours
disponible dans l’intervalle courant. Par ailleurs, comparez la taille de la machine
considérée avec la capacité RAM totale requise pour la charge de travail. L’espace
restant, une fois satisfaits les besoins du système d’exploitation et de la charge de
travail, contient probablement les pages de fichiers récemment lues ou écrites.
Si votre application est conçue de sorte que la probabilité de réutiliser les données
récemment exploitées est très élevée, vous pouvez revoir à la baisse les prévisions
d’utilisation de la mémoire cache. Notez que la réutilisation des données se fait au
niveau de la page et non de l’enregistrement. S’il est peu probable qu’un
enregistrement soit réutilisé, mais qu’une page contienne de nombreux
enregistrements, certains des enregistrements requis pendant un intervalle donné ont
des chances de se trouver sur la même page que d’autres enregistrements
récemment utilisés.
Planification, conception et implantation
4-9
– Comparez le niveau net d’E/S requis à la capacité approximative des unités de
disques courantes (voir le tableau). Si la capacité requise en pages aléatoires et
séquentielles est supérieure à 75 % de la capacité totale des disques porteurs des
données de l’application, il vous faudra certainement optimiser, voire étendre ces
capacités lors de l’exécution de l’application.
• E/S de communication
– Calculez l’utilisation de la largeur de bande de la charge. L’utilisation totale de la
largeur de bande de tous les nœuds du réseau LAN ne doit pas excéder 70 % de la
largeur de bande nominale (50 % pour Ethernet).
– Il est conseillé d’effectuer la même analyse sur les besoins CPU, mémoire et E/S de la
charge supplémentaire que le serveur devra prendre en charge.
Rappelons que ces mesures ne fournissent qu’une estimation très approximative et qu’il est
préconisé de remplacer dès que possible les résultats estimés par une mesure réelle :
l’estimation globale n’en sera que plus précise.
4-10
AIX 4.3 Guide d’optimisation
Conception et implantation de programmes performants
Si vous avez déjà localisé la ressource qui ralentit votre programme, passez directement à
la section traitant des moyens de minimiser son utilisation. Sinon, vous devez envisager
d’équilibrer votre programme, en vous aidant des recommandations de ce chapitre. Une fois
le programme installé, passez à ”Identification des ressources limitatives”, page 1-1.
Cette section traite des points suivants :
• ”Programmes à CPU limitée”
• ”Conception et codage pour l’exploitation optimale des mémoires cache”
• ”Préprocesseurs et des compilateurs XL”
• ”Programmes à CPU limitée”
Programmes à CPU limitée
La vitesse maximale d’un programme réellement limité en temps processeur est fonction :
• de l’algorithme utilisé,
• du code source et des structures de données créées par le programmeur,
• de la séquence d’instructions en langage machine générée par le compilateur,
• de la taille et des structures des mémoires cache du processeur,
• de l’architecture et de la vitesse d’horloge du processeur.
Si le programme est limité en CPU simplement parce qu’il est constitué quasi-exclusivement
d’instructions de calcul numérique, l’algorithme choisi sera évidemment déterminant pour
les performances du programme. Le débat sur le choix des algorithmes dépasse le cadre
de ce manuel. On suppose que les performances de calcul ont été prises en compte dans
le choix de l’algorithme.
L’algorithme étant donné, les seuls éléments de la liste sur lesquels le programmeur peut
intervenir sont le code source, les options de compilation et éventuellement les structures
de données. Les sections qui suivent présentent les techniques d’amélioration de
programmes à partir du code source. Si l’utilisateur ne dispose pas du code source, il doit
recourir aux techniques d’optimisation ou de gestion de la charge.
Conception et codage pour l’exploitation optimale des mémoires cache
Comme indiqué à ”Performances”, les processeurs du ESCALA disposent d’une mémoire
hiérarchique multiniveau :
1. Pipeline d’instructions et registres CPU
2. Mémoires cache d’instructions et de données avec tampons TLB correspondants
3. RAM
4. Disque
Au fur et à mesure de leur progression dans la hiérarchie, les instructions et les données
transitent par des mémoires de plus en plus rapides, mais aussi de plus en plus réduites et
consommatrices. Pour tirer le meilleur parti d’une machine, le programmeur doit s’attacher à
exploiter au mieux la mémoire disponible à chaque niveau de la hiérarchie.
Pour cela, la règle de base consiste à maintenir en mémoire les instructions et données
susceptibles d’être utilisées. Mais une difficulté doit être surmontée : la mémoire est
affectée en blocs de longueur fixe (en lignes de cache ou pages de mémoire réelle, par
exemple) qui ne correspondent généralement pas aux structures des programmes ou des
données. Cette inadéquation diminue l’efficacité des mémoires affectées, et par voie de
conséquence, les performances des systèmes, notamment de petite taille ou
particulièrement chargés.
Planification, conception et implantation
4-11
Prendre en compte la hiérarchie des mémoires ne signifie pas programmer en fonction
d’une page ou d’une taille de ligne de cache. Il s’agit simplement de comprendre et
d’adapter les règles générales de programmation à un environnement de mémoire virtuelle
ou cache. Des techniques de redécoupage des modules permettent d’obtenir des résultats
satisfaisants sans modifier le code existant. Naturellement, si du code doit être ajouté, il faut
tenir compte des impératifs d’efficacité de mémoire.
En terme d’optimisation des mémoires hiérarchiques, deux notions sont incontournables : le
”regroupement référentiel” et la ”partie active”. Le regroupement référentiel d’un programme
est le degré de regroupement de ses adresses d’exécution d’instruction et des références
de données dans une zone restreinte de la mémoire pendant un intervalle donné.
La partie active d’un programme, au cours du même intervalle, est l’ensemble des blocs
mémoire utilisés, ou, plus précisément, le code ou les données qui occupent ces blocs. Un
programme présentant un bon regroupement référentiel aura une partie active minimale, les
blocs utilisés étant étroitement associés aux codes et aux données. Inversement, la partie
active d’un programme équivalent au niveau fonctionnel mais présentant un regroupement
référentiel médiocre sera plus étendue, davantage de blocs étant nécessaires pour accéder
à un éventail d’adresses plus étendu.
Le chargement de chaque bloc à un niveau donné de la hiérarchie demandant un temps
non négligeable, une programmation efficace sur un système à mémoire hiérarchique doit
viser à limiter au minimum la partie active du programme par un codage approprié.
La figure ”Regroupement référentiel”, présente deux schémas. Le premier, déconseillé,
illustre un programme vraisemblablement structuré dans l’ordre dans lequel il a été écrit, en
quelque sorte en suivant le ”fil de la pensée” : La première sous-routine, PriSub1, contient
le point d’entrée du programme. Il utilise toujours les sous-routines principales PriSub2 et
PriSub3. Certaines fonctions peu utilisées du programme demandent des sous-routines
secondaires SecSub1 et 2. Très rarement, les sous-routines d’erreur ErrSub1 et 2 sont
requises. Cette structuration offre un regroupement référentiel médiocre, sollicitant trois
pages de mémoire en exécution normale. Les sous-routines secondaires et les
sous-routines d’erreur divisent le chemin principal du programme en trois sections
physiquement distantes.
Faible regroupement référentiel et partie active étendue
Page 1
PriSub1
SecSub1
Page 2
ErrSub1
PriSub2
SecSub2
Page 3
ErrSub2
PriSub3
Fort regroupement référentiel et partie active réduite
Page 1
PriSub1
PriSub2
Page 2
PriSub3
SecSub1
SecSub2
Page 3
ErrSub1
ErrSub2
Regroupement référentiel
Le second schéma propose une version améliorée du programme où les sous-routines
principales sont regroupées, les fonctions peu sollicitées placées ensuite et les
sous-routines d’erreur, nécessaires mais peu utilisées, placées en fin de programme. Les
fonctions les plus courantes peuvent à présent être traitées en une seule lecture disque et
une seule page de mémoire au lieu des trois du schéma précédent.
Rappelons que le regroupement référentiel et la partie active sont définis par rapport au
temps. Si un programme fonctionne par étape prenant chacune un certain temps et utilisant
différentes sous-routines, il est conseillé de limiter au minimum la partie active à chaque
étape.
4-12
AIX 4.3 Guide d’optimisation
Registres et pipeline
En général, l’affectation et l’optimisation de l’espace de registre, ainsi que le maintien des
données dans le pipeline sont à la charge des compilateurs. En revanche, il incombe au
programmeur d’éviter toute structure en contradiction avec les mécanismes d’optimisation
du compilateur. Par exemple, si vous insérez une sous-routine dans l’une des boucles
critiques, le compilateur préférera sans doute l’incorporer dans la partie principale du
programme pour limiter le temps d’exécution. Or, si cette sous-routine a été placée dans un
module .c différent, le compilateur ne pourra la déplacer.
Cache et tampon TLB
En fonction de l’architecture (POWER, POWER 2 ou PowerPC) et du modèle, les
processeurs du ESCALA ont un ou plusieurs caches à prendre en charge :
• Parties de programmes d’exécution,
• Données utilisées par ces programmes,
• Tampons TLB (Translation Lookaside Buffer) contenant les informations de mappage
entre les adresses virtuelles et les adresses réelles des pages de texte d’instructions ou
de données récemment utilisées.
Si une absence en cache se produit, le chargement d’une ligne complète de cache peut
demander plus d’une douzaine de cycles processeur. En cas d’absence en TLB, le calcul du
mappage virtuel-réel d’une page peut demander plusieurs douzaines de cycles. Le coût
exact de ces opérations dépend de l’implantation. Pour en savoir plus sur les architectures
des mémoires cache, reportez-vous à l’annexe C.
Même si un programme et ses données tiennent dans les mémoires cache, plus il y a de
lignes ou d’entrées TLB utilisées (c’est–à–dire, plus médiocre est le regroupement
référentiel), plus le nombre de cycles CPU augmente pour mener à bien le chargement.
Sauf si les instructions et les données sont fréquemment réutilisées, la surcharge liée au
chargement constitue une part importante du temps d’exécution du programme, entraînant
des performances moindres du système.
Sur les machines équipées de mémoires cache, il est conseillé de maintenir la partie
principale du programme contenant les opérations courantes la plus compacte possible.
De plus, la procédure principale et l’ensemble des sous-routines qu’elle appelle doivent être
contigus. Les opérations plus exceptionnelles, telles que les erreurs inexpliquées, doivent
seulement être testées dans la partie principale. Si cette condition intervient réellement, elle
doit être traitée dans une sous-routine distincte. Toutes les sous-routines de ce type doivent
être regroupées à la fin du module. Cette structure permet d’éviter que des codes peu
utilisés monopolisent de l’espace dans les lignes cache très sollicitées. On peut même
imaginer dans le cas de modules importants que certaines, voire la totalité, des
sous-routines peu usitées occupent une page qui n’est pratiquement jamais lue en
mémoire.
Le même principe est applicable aux structures de données, même s’il est parfois
nécessaire de modifier le code source du fait des règles d’organisation de données par les
compilateurs. Ce type de difficulté a été rencontré durant le développement d’AIX version 3.
Certaines opérations matricielles, telle la multiplication, impliquent des algorithmes qui, s’ils
ont été codés de façon trop simpliste, présentent un regroupement référentiel médiocre.
Ces opérations supposent généralement un accès séquentiel aux données de la matrice
(éléments de rangées agissant sur des éléments de colonnes, par exemple). Chaque
compilateur a ses propres règles de stockage des matrices. Par exemple, le compilateur
XL FORTRAN les organise par colonnes (éléments de la colonne 1 suivis des éléments de
la colonne 2, etc.), mais le compilateur XL C les organise par rangées. Si les matrices sont
de petite taille, les éléments des rangées et des colonnes peuvent être placés dans la
mémoire cache de données, et le processeur et l’unité à virgule flottante s’exécuter à la
vitesse maximale. Mais, plus la taille des matrices augmente, plus le regroupement
référentiel de ces opérations de rangées/colonnes se détériore, jusqu’au point où les
données ne peuvent plus être stockées dans la mémoire cache.
Planification, conception et implantation
4-13
En fait, le modèle ”naturel” d’accès des opérations sur les rangées/colonnes génère un
mécanisme d’emballement de la mémoire : il y a accès à une chaîne d’éléments de taille
supérieure au cache, si bien que les éléments utilisés initialement sont expulsés et la même
méthode d’accès de nouveau appliquée pour les mêmes données. La solution
généralement préconisée est de partitionner l’opération en blocs, de sorte que les diverses
opérations portant sur les mêmes éléments puissent être exécutées quand les éléments
sont encore en mémoire cache. Cette technique générale est appelée exploitation par
blocs. Un groupe de chercheurs compétents en analyse numérique a été sollicité pour
coder des versions des algorithmes de manipulation de matrices, en utilisant l’exploitation
par blocs et d’autres techniques d’optimisation. Résultat : des performances 30 fois
meilleures pour la multiplication des matrices. Cette version optimisée des routines a été
installée dans la bibliothèque BLAS (Basic Linear Algebra Subroutines) d’AIX,
/usr/lib/libblas.a. Un jeu plus étendu de sous-routines optimisées est également disponible
dans le programme sous licence ESSL (Engineering and Scientific Subroutine Library),
documenté dans le manuel IBM Engineering and Scientific Subroutine Library Guide and
Reference.
Les fonctions et les interfaces des sous-routines BLAS (Basic Linear Algebra Subroutines)
sont décrites dans AIX Technical Reference, Volume 2: Base Operating System and
Extensions. Cette bibliothèque n’est accessible que si l’environnement d’exécution
FORTRAN est installé. Elle est destinée particulièrement aux utilisateurs qui doivent
effectuer leurs propres opérations vectorielles et matricielles :les sous-routines proposées
offrent un degré d’optimisation tel qu’un non spécialiste d’analyse numérique ne risque pas
de faire mieux.
Si le programmeur contrôle les structures des données, d’autres améliorations peuvent être
envisagées. En général, il est préconisé de regrouper au maximum les données souvent
utilisées. Si une structure contient à la fois des informations de contrôle très sollicitées et
des données détaillées peu sollicitées, assurez-vous que les informations de contrôle sont
affectées sur des octets consécutifs. Cette précaution permettra de charger la totalité des
informations de contrôle en mémoire cache en limitant les cas d’absences en cache
(à quelques-uns, voire à un seul).
Préprocesseurs et compilateurs XL
Pour exploiter au mieux un programme sur une machine donnée, il faut savoir que :
• Certains préprocesseurs permettent de réorganiser la structure de certains codes source
de façon à obtenir un module source, équivalent au niveau fonctionnel, mais compilable
en code exécutable plus performant.
• Plusieurs options de compilation sont disponibles en fonction de la ou des variantes
d’architecture POWER utilisées.
• La fonction #pragma permet de signaler certains aspects du programme au
compilateur XL C pour qu’il génère un code plus efficace en allégeant certaines
hypothèses concernant les cas les moins favorables.
• Plusieurs niveaux d’optimisation confèrent au compilateur une marge de liberté plus ou
moins étendue pour réorganiser les instructions.
Pour les programmeurs pressés, une seule règle est préconisée : l’optimisation
systématique. Le gain de performances induit par une optimisation du code, aussi simple
soit-elle, est tel qu’il serait aberrant d’en faire l’économie (ne serait-ce qu’en appliquant
l’option –O de la commande cc, xlc ou xlf). Les seules exceptions à cette règle sont les
conditions de test qui exigent de générer le code tel quel (par exemple, pour analyser les
performances au niveau des instructions par la fonction tprof).
Les autres techniques d’optimisation confèrent à certains programmes des performances
supérieures mais il faut procéder à nombre de recompilations et mesures pour déterminer la
combinaison technique la mieux appropriée à un programme particulier.
4-14
AIX 4.3 Guide d’optimisation
Les différentes techniques d’exploitation optimales des compilateurs sont présentées dans
les sections qui suivent. Pour une description plus détaillée, reportez-vous au manuel
Optimization and Tuning Guide for XL Fortran, XL C and XL C++.
Préprocesseurs de code source
Il existe plusieurs préprocesseurs de code source disponibles pour le ESCALA. Trois nous
intéressent pour le moment :
• KAP/C (de Kuck and Associates)
• KAP/FORTRAN (de Kuck and Associates)
• VAST (de PSR)
Une des techniques utilisées par ces préprocesseurs est la reconnaissance des codes,
technique mathématiquement équivalente à celle appliquée par les sous-routines des
bibliothèques ESSL ou BLAS citées précédemment : le préprocesseur remplace le code de
calcul initial par un appel à une sous-routine optimisée. Les préprocesseurs tentent
également de modifier les structures de données pour les adapter au mieux aux machines
ESCALA.
Compilation propre à une architecture
L’option de compilation –qarch permet d’indiquer l’architecture POWER (POWER,
POWER 2 ou PowerPC) sur laquelle l’exécutable sera exploité. Les valeurs possibles sont :
–qarch=COM
Compilation du sous-ensemble commun des trois jeux d’instructions.
Les programmes compilés avec cette option fonctionnent correctement
sur les trois architectures. Valeur par défaut.
–qarch=PWR
Compilation pour l’architecture POWER du ESCALA d’origine.
Les programmes compilés avec cette option fonctionnent correctement
sur les trois architectures, mais certaines instructions seront simulées
sur les systèmes PowerPC, au détriment des performances.
–qarch=PWRX
Compilation pour POWER2. Les programmes qui utilisent largement la
racine carrée à virgule flottante simple ou double précision offriront des
performances supérieures. Les exécutables ne doivent être exploités
que sur des systèmes POWER2.
–qarch=PPC
Compilation pour PowerPC. Les programmes qui font souvent appel à
l’extraction de racines carrées à virgule flottante simple offriront des
performances supérieures. L’exécutable ne doit être exploité que sur
des systèmes PowerPC.
L’option de compilation –qtune oriente le compilateur sur l’architecture à favoriser. A la
différence de –qarch, –qtune ne génère pas d’instructions propres à une architecture.
L’option indique seulement au compilateur, dans le cas d’une alternative, la technique la
plus appropriée à une architecture. Les valeurs possibles de –qtune sont :
–qtune=PWR
Le programme fonctionne essentiellement sur des systèmes POWER.
–qtune=PWRX
Le programme fonctionne essentiellement sur des systèmes POWER2.
–qtune=601
Le programme fonctionne essentiellement sur des systèmes
PowerPC 601.
La figure ”Combinaisons des valeurs de –qarch et –qtune” indique les combinaisons de
valeurs possibles et par défaut de l’option –qtune pour les valeurs spécifiées de –qarch.
Si aucune option n’est spécifiée, –qarch=COM –qtune=PWR est appliqué par défaut.
Planification, conception et implantation
4-15
–qtune=PWR
–qtune=PWRX
–qtune=601
par défaut
–qarch=COM
OK
OK
OK
PWR
–qarch=PWR
OK
OK
OK
PWR
–qarch=PWRX
OK
OK
non valide
PWRX
–qarch=PPC
OK
non valide
OK
601
Combinaisons des valeurs de –qarch et –qtune
Directive #pragma
Dans certains cas, l’optimiseur peut être inhibé par la nécessité de générer un code qui
tienne compte des conditions les moins favorables. Pour signaler au compilateur que
certaines contraintes peuvent être assouplies et autoriser ainsi la génération d’un code plus
efficace, vous disposez de la directive #pragma.
Un pragma est une instruction définie à l’implantation. Les pragmas sont de la forme :
#pragma character_sequence ...
Les pragmas en XL C ci-dessous peuvent sensiblement améliorer les performances d’un
programme sans modifier le reste du code source :
• disjoint
• isolated_call
Directive #pragma disjoint
La directive #pragma disjoint répertorie les identificateurs qui, dans le cadre de leur
utilisation, ne jouent pas le rôle d’alias entre eux :
#pragma disjoint ( { identifier | *identifier }
[,{ identifier | *identifier } ] ... )
La directive informe le compilateur qu’aucun des identificateurs de la liste ne partage la
même mémoire physique, ce qui donne plus de latitude pour les optimisations. Si l’un des
identificateurs de la liste partage en réalité de la mémoire physique, les résultats du
programme risquent d’être incorrects.
Cette directive peut apparaître à n’importe quel point du programme source.
Un identificateur doit être cité dans le programme là où la directive apparaît. Les
identificateurs ne peuvent renvoyer à :
• un membre d’une structure ou d’une union,
• un lien à une structure ou une union,
• une constante d’énumération,
• une étiquette.
Les identificateurs doivent être déclarés avant d’être cités dans une pragma. Aucun
pointeur de la liste des identificateurs ne doit avoir servi d’argument à une fonction avant
d’apparaître dans la directive.
L’utilisation de la directive #pragma disjoint est illustrée dans l’exemple ci-dessous. Le
pointeur externe ptr_a ne partage pas de mémoire avec la variable externe b pas plus
qu’il ne pointe vers elle, le compilateur peut donc en déduire que la proposition 7 pour
l’objet sur lequel ptr_a pointe ne modifiera pas la valeur b. De même, le pointeur externe
ptr_b ne partage pas de mémoire avec la variable externe a, pas plus qu’il ne pointe vers
elle. Par conséquent, le compilateur peut en déduire que l’argument de
another_function prend la valeur 6.
4-16
AIX 4.3 Guide d’optimisation
int a, b, *ptr_a, *ptr_b;
#pragma disjoint(*ptr_a, b)
/* ptr_a ne pointe jamais sur b */
#pragma disjoint(*ptr_b, a)
/* ptr_b ne pointe jamais sur a
*/
one_function()
{
b = 6;
*ptr_a = 7; /* La proposition ne changera pas la valeur b */
another_function(b);
/* L’argument ”b” a pour valeur 6 */
}
#pragma isolated_call
La directive #pragma isolated_call répertorie les fonctions qui ne modifient pas les objets
de données visibles lors de l’appel de la fonction.
#pragma isolated_call ( identifier [ , identifier ] ... )
Le pragma doit être placé avant tout appel aux fonctions de la liste d’identificateurs.
Les identificateurs de la liste doivent être déclarés avant d’être cités dans une pragma.
Toute fonction répertoriée dans la liste et appelée avant que la directive ne soit utilisée n’est
pas traitée comme un appel isolé. Les identificateurs doivent être de type fonction ou de
type définition de fonction.
La directive indique au compilateur qu’aucune fonction citée n’induit d’effets secondaires.
Par exemple, l’accès à un objet volatile, la modification d’un objet externe, la modification
d’un fichier ou l’appel d’une fonction exécutant l’une de ces opérations peut être considéré
comme exempt d’effet secondaire. Toute modification d’état de l’environnement d’exécution
peut être considérée comme un effet secondaire. Le passage d’arguments de fonction par
référence est l’un des effets secondaires autorisés, mais il faut savoir que les effets
secondaires peuvent générer des résultats erronés lorsqu’ils apparaissent dans les
directives #pragma isolated_call.
Déclarer une fonction comme isolée indique à l’optimiseur que les variables externes et
statiques ne peuvent pas être modifiées par la fonction appelée et que, le cas échéant, les
références mémoire peuvent être supprimées à partir de la fonction appelée. Il est possible
d’agencer les instructions plus librement de façon à limiter les délais de pipelines et à
accélérer l’exécution. Il faut savoir que réagencer les instructions peut générer un code qui
requiert davantage de valeurs de portée générale et/ou de registres à virgule flottante pour
être maintenu dans l’appel isolé. Lorsque l’appel isolé n’est pas intégré à une boucle, le
temps système utilisé pour la sauvegarde et la restauration des registres supplémentaires
peut neutraliser le gain acquis par la suppression des références mémoire.
Les fonctions spécifiées dans la liste des identificateurs sont autorisées pour examiner des
objets externes et renvoyer des résultats dépendant de l’état de l’environnement
d’exécution. Ces fonctions peuvent également modifier la mémoire pointée par un argument
passé à la fonction, autrement dit, des appels par référence. Ne spécifiez aucune fonction
qui s’auto-appelle ou repose sur une mémoire statique locale. Intégrer une telle fonction
dans la directive #pragma isolated_call peut entraîner des résultats imprévisibles.
L’exemple suivant illustre l’utilisation de la directive #pragma isolated_call. Le compilateur
suppose que l’appel de la fonction this_function ne changera pas la valeur de la
variable externe a car cette fonction n’a pas d’effet secondaire. Dès lors, le compilateur peut
supposer que l’argument de other_function a pour valeur 6.
int a, this_function(int); /* Supposé sans effets secondaires */
#pragma isolated_call(this_function)
that_function()
{
a = 6;
this_function(7); /* L’appel ne modifie pas la valeur de a */
other_function(a);
/* L’argument ”a” a la valeur 6 */
}
Planification, conception et implantation
4-17
Niveaux d’optimisation
Les niveaux d’optimisation offerts par les compilateurs XL ont été modifiés par rapport aux
versions antérieures. Les nouvelles options proposées sont :
Pas d’optimisation
En l’absence de toute forme d’indicateur –O, le compilateur génère un code ”brut” sans
restructuration des instructions ni autre forme d’amélioration.
–O ou –O2
Ces indicateurs (équivalents) demandent au compilateur d’effectuer une optimisation en se
fondant sur une restructuration minimale du code. Seules sont appliquées les directives
explicites de type #pragma. Ce niveau n’effectue plus de mise en pipeline logicielle, de
déroulement de boucles ou de simple mise en commun prévisionnelle. Il définit également
une contrainte sur la quantité de mémoire utilisable par le compilateur.
Il en résulte, par rapport aux versions antérieures, une possible dégradation des
performances des routines étendues ou complexes compilées avec l’option –O.
–O3
Cette option impose au compilateur d’appliquer les techniques d’optimisation et d’utiliser le
volume de mémoire nécessaire pour une optimisation maximale.
Ce niveau peut modifier les programmes au niveau fonctionnel si ces derniers tiennent
compte :
• des exceptions à virgule flottante,
• du signe de zéro,
• des effets d’un réagencement des calculs.
Ces effets secondaires peuvent cependant être évités, au prix d’une diminution des
performances, en combinant l’option –qstrict avec –O3.
L’option –qhot combinée à –O3 permet d’effectuer des mises en commun prévisionnelles et
quelques déroulements de boucle.
Par rapport à l’option –O des versions antérieures, ces modifications procurent le même
niveau, voire un niveau plus élevé de performances des routines étendues ou complexes
compilées avec l’option –O3 (éventuellement combinée à –qstrict ou –qhot).
Options XL C pour l’optimisation de la sous-routine string.h
AIX permet d’imbriquer les sous-routines string dans le programme d’application au lieu de
les utiliser à partir de libc.a. Cette opération économise le temps de la liaison appel/retour.
Pour ce faire, le code source de l’application doit comporter l’instruction :
#include <string.h>
avant d’utiliser la (les) sous-routine(s). Sous la version 3.1, les seules sous-routines
insérables par cette technique sont :
• strcpy()
• strcmp()
S’y ajoutent désormais les sous-routines :
• strlen()
• strchr()
• strrchr()
• strcat()
• strncat()
4-18
AIX 4.3 Guide d’optimisation
• strncpy()
• strncmp()
• index()
• rindex()
• memchr()
• memcpy()
• memccpy()
• memmove()
• memcmp()
• memset()
Pour revenir au niveau d’imbrication de la version 3.1, faites précéder l’instruction
#include <string.h> de :
#define __STR31__
Style de codage optimisé C et C++
Dans un grand nombre de cas, le coût en termes de performances d’un module C n’est pas
évident, voire contraire à ce qui était attendu. Voici quelques conseils à cet égard.
• Chaque fois que possible, utilisez le type int au lieu de char ou short.
La plupart du temps, les types de données char et short requièrent davantage
d’instructions. Le coût supplémentaire induit (en terme de temps) et, exception faite des
grands tableaux, l’économie d’espace ainsi réalisée sont plus que neutralisés par
l’accroissement de la taille de l’exécutable.
• Si vous devez utiliser le type char, déclarez-le unsigned, si possible.
signed char exige deux instructions de plus que unsigned char à chaque
chargement de la variable dans un registre.
• Optez de préférence pour des variables locales (automatiques) plutôt que des variables
globales.
L’accès aux variables globales demande plus d’instructions que l’accès aux variables
locales. De plus, en l’absence d’informations, le compilateur suppose que toute variable
globale a été modifiée par un appel de sous-routine. Ce phénomène a un effet inverse
sur l’optimisation car la valeur d’une variable globale utilisée après un appel de
sous-routine doit être rechargée.
• Chaque fois que vous devez accéder à une variable globale (non partagée par d’autres
routines), copiez sa valeur dans une variable locale et utilisez cette copie.
Sauf si la variable globale n’est utilisée qu’une fois, il est plus efficace d’utiliser la copie
locale.
• Préférez les codes binaires aux chaînes pour les enregistrements et les tests.
Les chaînes utilisent à la fois l’espace de données et l’espace d’instructions. Par
exemple, la séquence :
#define situation_1 1
#define situation_2 2
#define situation_3 3
int situation_val;
situation_val = situation_2;
. . .
if (situation_val == situation_1)
. . .
Planification, conception et implantation
4-19
est plus efficace que :
char situation_val[20];
strcpy(situation_val,”situation_2”);
. . .
if ((strcmp(situation_val,”situation_1”))==0)
. . .
• Lorsque les chaînes sont vraiment nécessaires, préférez les chaînes de longueur fixe
aux chaînes de longueur variable terminée par zéro.
Les routines de type mem*(), telles que memcpy(), sont plus rapides que les routines
str*() correspondantes, telles que strcpy(), car les routines str*() doivent vérifier chaque
octet à la recherche d’une valeur nulle, alors que les routines mem*() n’ont pas à le faire.
Temps d’exécution des compilateurs
Sous AIX, deux commandes permettent d’appeler le compilateur C : cc et xlc.
La commande cc, historiquement utilisée pour appeler le compilateur C du système lance le
compilateur XL C en mode langlevel=extended. Ce mode permet de compiler des
programmes C non conformes aux normes ANSI. Mais il consomme également du temps
processeur.
Si le programme à compiler est conforme à ANSI, il est préférable d’appeler le
compilateur XL C via la commande xlc.
Spécifier l’indicateur –O3 englobe implicitement l’option –qmaxmem. Ainsi, le compilateur
peut utiliser autant de mémoire que l’optimisation maximum l’exige. Il en résulte deux
effets :
• Sur un système multi-utilisateur, une compilation –O3 lourde peut utiliser une quantité de
mémoire telle que les autres utilisateurs subiront une baisse des performances.
• Sur un système pauvre en mémoire réelle, une compilation –O3 lourde peut utiliser une
quantité de mémoire telle que le taux de pagination sera élevé et la compilation
sérieusement ralentie.
Programmes à CPU limitée
Pour un programmeur sans cesse confronté aux limitations d’adressage imposées par
certains environnements (tels que DOS), l’environnement du ESCALA avec ses segments
de mémoire virtuelle de 256 Mo semble offrir des possibilités infinies. Il est alors tenté
d’ignorer les contraintes de mémoire et de coder avec des longueurs de chemin minimales
et une simplicité extrême. Cette ”négligence” n’est pas sans conséquences. La mémoire
virtuelle est vaste, mais sa vitesse est variable. Plus la mémoire est utilisée, plus elle est
ralentie selon une progression non linéaire. Tant que le volume total de mémoire virtuelle
sollicitée par l’ensemble des programmes (c’est-à-dire le cumul des parties actives) est
légèrement inférieur au volume de mémoire réelle non fixe, la mémoire virtuelle s’exécute à
peu près à la même vitesse que la mémoire réelle. Dès que le volume sollicité dépasse le
nombre de trames de page disponibles, les performances de la mémoire se dégradent (si la
fonction de contrôle de charge est désactivée) selon une progression pouvant atteindre un
facteur 2. On dit alors que le système s’emballe : il consacre presque tout son temps à la
pagination, au détriment de tout travail productif, chaque processus tentant de reprendre
aux autres la mémoire nécessaire pour alimenter sa partie active. Si la fonction de contrôle
de charge mémoire VMM est active, cet auto-emballement perpétuel peut être évité, mais
au prix d’un allongement considérable des temps de réponse.
Il est plus grave d’exploiter inefficacement la mémoire que les caches. En effet, l’écart de
vitesse entre la mémoire et le disque est bien supérieur à celui entre la mémoire et le
cache. Et si une absence en mémoire cache consomme quelques dizaines de cycles CPU,
un défaut de page requiert plus de 20 millisecondes, soit au moins 400 000 cycles CPU.
4-20
AIX 4.3 Guide d’optimisation
Même si la présence de la fonction de contrôle de charge mémoire VMM sous AIX garantit
qu’aucune condition d’emballement naissante ne dégénère en auto-emballement perpétuel,
les temps de réponse et/ou le débit subissent l’effet des défauts de page inutiles.
Structuration du code paginable
Pour limiter la partie de code active d’un programme, regroupez le code fréquemment
exécuté dans une zone réduite, séparée du code rarement exécuté. En particulier :
• Ne placez pas sur une ligne de longs blocs de code de traitement des erreurs.
Insérez-les dans différentes sous-routines, de préférence dans des modules de code
source distincts. Cette consigne s’applique non seulement aux chemins d’erreur, mais
aussi à toute option fonctionnelle peu utilisée.
• Ne structurez pas les modules chargeables arbitrairement. Faites en sorte que les
modules objet fréquemment appelés soient implantés le plus près possible des
demandeurs. Il est préférable de concentrer en fin de module chargeable les modules
objet composés (idéalement) de sous-routines peu appelées. Les page qu’ils renferment
sont rarement lues.
Structuration des données paginables
Pour limiter la partie de données active, tentez de regrouper les données très sollicitées et
évitez les références inutiles aux pages de mémoire virtuelle. En particulier :
• N’affectez via malloc ou calloc que l’espace nécessaire. Après malloc, n’initialisez
jamais un tableau de taille maximale si, en réalité, seule une fraction de celui-ci est
utilisée. Lorsque vous modifiez une nouvelle page pour initialiser les éléments du
tableau, vous forcez VMM à voler une page de mémoire réelle. Cette opération
entraînera un défaut de page lorsque le processus propriétaire de la page volée tentera
d’y accéder. Pensez que la différence entre malloc et calloc ne se situe pas seulement
au niveau de l’interface. Dans la mesure où calloc met à zéro l’espace mémoire affecté,
il touche toutes les pages affectées, alors que malloc ne touche que la première page.
Si vous affectez un espace étendu via calloc et n’utilisez au début qu’une petite portion
de cet espace, vous chargez inutilement le système. Non seulement les pages doivent
être initialisées, mais aussi, si leurs trames en mémoire réelle sont demandées, ces
pages (qui ne seront jamais utilisées) doivent être écrites dans l’espace de pagination.
Vous gaspillez ainsi des E/S et des emplacements de l’espace de pagination.
• Les mêmes problèmes peuvent se produire avec des listes liées de vastes structures
(telles que des tampons). Si votre programme doit effectuer une série de chaînages à la
recherche d’une clé, séparez liens et clés, d’une part, et données, d’autre part, ou optez
pour un système de style table de hachage.
• Le regroupement référentiel doit être autant spatial que temporel : les structures de
données doivent être initialisées juste avant leur utilisation (si tant est qu’elles le soient).
Sur un système très chargé, si une longue période sépare l’initialisation de l’utilisation
des structures de données, ces dernières risquent de se voir voler leurs trames.
Le programme se heurte alors à un défaut de page dès qu’il tente d’utiliser la structure de
données concernée.
• De même, si, une fois utilisée, une grande structure n’est plus sollicitée jusqu’à la fin du
programme, elle doit être libérée. Mais, utiliser free pour libérer de l’espace affecté par
malloc ou calloc ne suffit pas, car la commande free ne libère que les intervalles
d’adresses occupés par la structure. Pour libérer de la mémoire réelle et de l’espace de
pagination, vous devez renoncer à cet espace via la commande disclaim.
Mémoire fixe optimisée
Pour éviter les phénomènes de boucles et de temps d’attente, une petite fraction du
système doit être fixée en mémoire réelle. La notion de partie active n’a alors plus de sens
pour le code et les données impliquées puisque toutes les informations fixées se trouvent
en permanence en mémoire réelle, qu’elles soient utilisées ou non. Les programmes
(pilotes d’unité écrits par un utilisateur, par exemple) qui fixent un code ou une donnée
Planification, conception et implantation
4-21
doivent être soigneusement élaborés (ou examinés, s’ils sont portés) pour s’assurer que les
fractions de mémoire fixe sont utilisées avec parcimonie. Voici quelques conseils à ce sujet :
• Le code est fixé sur la base de module chargeable (fichier exécutable). Si certains
modules objets d’un composant doivent être fixés et d’autres simplement paginés, veillez
à placer les modules à fixer dans un module chargeable distinct.
• Il n’est pas souhaitable de fixer préventivement un module ou une structure de données :
le concepteur doit savoir dans quelles conditions l’information peut être demandée et si,
dans ce cas, un défaut de page peut ou non être toléré.
• Les structures fixes dont la taille dépend de la charge (telles que les pools de mémoire
tampon) doivent être optimisables par l’administrateur système.
4-22
AIX 4.3 Guide d’optimisation
Conseils pour une installation performante
Cette section vous conseille sur les actions à exécuter avant et pendant l’installation.
Cette section traite des points suivants :
• ”Préinstallation d’AIX”
• ”Préinstallation de la CPU”
• ”Préinstallation de la mémoire”
• ”Préinstallation du disque”
• Préinstallation des cartes de communication : décrit à ”Récapitulatif des paramètres
d’optimisation d’UDP, de TCP/IP et de mbuf”.
Préinstallation d’AIX
Installation d’AIX sur un nouveau système
Avant de commencer l’installation, vous devez avoir déterminé la taille et l’emplacement des
systèmes de fichiers disque et des espaces de pagination, et le moyen de les communiquer
à AIX.
Mise à niveau d’AIX sur un système existant
Pour installer une mise à niveau d’AIX :
• Identifiez, dans votre environnement actuel, toutes les utilisations des outils
d’optimisation schedtune et vmtune, propres à cette version. Ces outils étant réservés à
l’utilisateur racine, vous ne devriez pas avoir trop de mal à collecter ces informations.
• Si ces outils sont utilisés au cours de l’amorçage du système (à partir de /etc/inittab, par
exemple), vous devez les désinstaller temporairement ou les désactiver jusqu’à être
certain qu’ils fonctionnent correctement sur la nouvelle version.
Préinstallation de la CPU
Il est déconseillé de modifier a priori les paramètres de planification par défaut de la CPU
(tels que la durée des tranches horaires). A moins que vous n’ayez une grande expérience
en contrôle et optimisation d’une charge de travail similaire sur une configuration analogue,
ne modifiez pas ces paramètres pendant l’installation.
Pour des indications sur la post-installation, reportez-vous à ”Contrôle et optimisation de la
CPU”.
Préinstallation de la mémoire
Si vous installez un système de plus de 32 Mo, appelé à gérer plus de cinq utilisateurs
simultanément, vous devez envisager d’augmenter le niveau minimum de
multiprogrammation associé au mécanisme de contrôle de charge mémoire VMM. Par
exemple, si vous estimez que, au bas mot, quatre des applications les plus gourmandes en
mémoire doivent pouvoir s’exécuter simultanément, tout en laissant au moins 16 Mo pour le
système d’exploitation et 25 % de mémoire réelle aux pages de fichiers, vous pouvez
augmenter le niveau minimum de multiprogrammation de 2 (par défaut) à 4, par la
commande :
# schedtune –m 4
Ne procédez à aucune autre modification de seuil de mémoire tant que vous n’avez pas
confronté le système à la charge de travail réelle.
Pour des indications sur la post-installation, reportez-vous à ”Contrôle et optimisation de la
mémoire”.
Planification, conception et implantation
4-23
Préinstallation du disque
Recommandations générales
Bien que les mécanismes de définition et d’extension des volumes logiques adoptent les
valeurs par défaut les plus satisfaisantes possibles, seul l’installateur du système est à
même de déterminer la taille et l’emplacement des volumes logiques, en fonction du volume
de données escompté et des contraintes de la charge de travail, pour des E/S optimisées.
Dans cette optique, voici quelques recommandations utiles :
• Si possible, le groupe de volumes par défaut, rootvg, ne doit être constitué que du
volume physique sur lequel le système a été initialement installé. Un ou plusieurs autres
groupes de volumes doivent être définis pour contrôler les autres volumes physiques du
système. Ces mesures sont utiles tant au niveau de la gestion que des performances.
• Pour améliorer les performances d’un groupe de volumes comportant plusieurs volumes
physiques, vous pouvez :
– Définir initialement le groupe de volumes avec un seul volume physique.
– Définir un volume logique au sein du nouveau groupe de volume. Le volume logique
journal du groupe de volumes est alors affecté sur le premier volume physique.
– Ajouter les volumes physiques restants au groupe de volumes.
– Définir les systèmes de fichiers très sollicités sur les nouveaux volumes physiques.
– Définir exclusivement les systèmes de fichiers de très faible activité, s’il en existe, sur
le volume physique contenant le volume logique du journal.
Cette solution sépare les E/S de journalisation des E/S très importantes de données,
augmentant la probabilité de chevauchement. Cette technique peut avoir un effet
particulièrement marqué sur les performances du serveur NFS car l’écriture des
données et du journal doit être achevée avant que NFS ne déclare les E/S terminées
pour une opération d’écriture.
• Attribuez dès que possible aux volumes logiques leur taille maximale escomptée.
Par précaution, traitez en premier les volumes logiques les plus importants en terme de
performances pour être sûr qu’ils seront contigus et affectés à l’emplacement souhaité.
• Les volumes logiques très sollicités doivent occuper des portions de plusieurs unités de
disque. Si l’option ”Gamme de volumes physiques” du menu smit ”Ajout volume logique”
(raccourci smit mklv) est positionné sur maximum, le nouveau volume logique sera
réparti sur les divers volumes physiques du groupe de volumes (ou du moins, le lot de
volumes physiques explicitement spécifié).
• Si le système est équipé d’unités de différents types (ou que vous devez déterminer
l’unité à commander), les remarques suivantes vous seront utiles :
– Les gros fichiers normalement accessibles séquentiellement doivent être installés sur
l’unité de disque la plus rapidement disponible. Les niveaux de performances en
accès aléatoires et séquentiels mesurés sont, du plus lent au plus rapide :
4-24
AIX 4.3 Guide d’optimisation
Drive
Capacity
––––––––
200MB
400MB
857MB
2.4GB
1.37GB
540MB
1.0GB**
2.0GB
SCSI
Adapter
–––––––––––––––––––
Model 250 Integrated
SCSI II
SCSI II
SCSI II
SCSI II
SCSI II
SCSI II
SCSI II
Random Pages
per Second
–––––––––––––
approx. 40
approx. 50
approx. 60
approx. 65*
approx. 70
approx. 85
approx. 85
approx. 85
Sequential Pages
per Second
–––––––––––––––––
approx. 250
approx. 375
approx. 550
approx. 525
approx. 800
approx. 975
approx. 1075
approx. 950
* par accès (deux en tout)
** Cette unité de 1 Go (référence 45G9464) remplace l’ancienne
unité de 1 Go (référence 55F5206) depuis fin 1993.
Remarque : Ces chiffres résultent de mesures effectuées en laboratoire dans des
conditions idéales. Ils constituent la synthèse de différentes mesures, et non les résultat
d’un seul essai comparatif. Nous vous les indiquons pour vous donner une idée générale
des vitesses relatives des unités de disque. Ils sont appelé à évoluer avec les
améliorations apportées aux unités, aux cartes et au logiciel.
– Si des accès séquentiels fréquents sont à prévoir sur les gros fichiers installés sur les
unités de disques les plus rapides, il est conseillé de limiter le nombre de pilotes de
disque par carte disque. Nous préconisons pour les unités de 540 Mo, 1 Go et 2 Go :
Disk Adapter
––––––––––––
Original ESCALA SCSI adapter
SCSI–2 High Performance Controller
SCSI–2 Fast Adapter (8–bit)
SCSI–2 Fast/Wide Adapter (16–bit)
Disk Drives
per Adapter
–––––––––––––
1
2
2
3
– Chaque fois que possible, raccordez les unités exigeant des performances très
élevées à une carte SCSI-2. Ce type de carte offre des fonctionnalités, telles que
l’écriture dos à dos, que les autres cartes disque du ESCALA ne proposent pas.
– Sur les unités de disque 200 Mo, 540 Mo et 1 Go, les volumes logiques appelés à
recevoir des fichiers séquentiels fréquemment sollicités doivent être affectés sur le
bord externe du volume physique. Ces disques ont davantage de blocs par piste dans
leur section externe, ce qui améliore les performances des opérations séquentielles.
– Sur un bus SCSI, les unités dotées des adresses SCSI les plus élevées (telles que
définies sur les unités physiques) sont prioritaires. Le plus souvent, cet effet est
négligeable, mais les opérations séquentielles portant sur des fichiers volumineux sont
connues pour exclure de l’accès au bus les unités dotées d’un petit numéro. Vous
devrez probablement configurer les unités de disque contenant les données les plus
critiques en matière de temps de réponse aux adresses les plus élevées de chaque
bus SCSI. La commande lsdev –Cs scsi porte sur les affectations d’adresses
actuelles sur chaque bus SCSI. Pour la carte SCSI d’origine, l’adresse SCSI est le
premier nombre de la quadruple paire de nombres de la sortie. Dans l’exemple
ci-dessus, le disque de 400 Mo réside à l’adresse SCSI 0, le disque de 320 Mo, à
l’adresse 1, et l’unité de bande 8 mm, à l’adresse 5.
hdisk0
hdisk1
rmt0
Available 00–01–00–00 400 MB SCSI Disk Drive
Available 00–01–00–10 320 MB SCSI Disk Drive
Defined
00–01–00–50 2.3 GB 8mm Tape Drive
– Les gros fichiers très utilisés et généralement ouverts en mode aléatoire (tels que les
bases de données) doivent être répartis sur plusieurs volumes physiques.
Planification, conception et implantation
4-25
Pour des indications sur la post-installation, reportez-vous à ”Contrôle et optimisation des
E/S disque”, page 8-1.
Position et taille des espaces de pagination
En règle générale, la taille cumulée des espaces de pagination doit être au moins double de
celle de la mémoire réelle (256 Mo maximum, soit 512 Mo d’espace de pagination). Pour
les mémoires supérieures à 256 Mo, la taille recommandée est :
espace de pagination total
= 512 Mo + (taille mémoire – 256 Mo) * 1,25
L’idéal est de disposer de plusieurs espaces de pagination de taille grosso modo
équivalentes, implantés sur des unités de disque physiques distinctes. Si vous souhaitez
ajouter des espaces de pagination, créez-les sur des volumes physiques moins chargés
que le volume physique du groupe rootvg. VMM affecte alors quatre blocs de pagination en
mode RR (répartition par permutation circulaire), issus des espaces de pagination actifs
disposant d’espace. Lors de l’amorçage du système, seul l’espace de pagination principal
(hd6) est actif. En conséquence, tous les blocs d’espace de pagination affectés pendant
l’amorçage se trouvent sur l’espace de pagination principal. Ce qui signifie que l’espace de
pagination principal doit être quelque peu plus vaste que les espaces de pagination
secondaires. Pour un bon fonctionnement de l’algorithme de répartition par permutation
circulaire, les espaces de pagination secondaires doivent être de même taille.
La commande lsps –a donne un instantané du niveau d’utilisation courant de tous les
espaces de pagination d’un système. La sous-routine psdanger() peut également être
utilisée pour déterminer les niveaux critiques d’utilisation de l’espace de pagination. Dans
l’exemple ci-dessous, le programme utilise psdanger() pour afficher un message
d’avertissement au-delà d’une certaine limite :
/* psmonitor.c
Monitors system for paging space low conditions. When the condition is
detected, writes a message to stderr.
Usage:
psmonitor [Interval [Count]]
Default: psmonitor 1 1000000
*/
#include <stdio.h>
#include <signal.h>
main(int argc,char **argv)
{
int interval = 1;
/* seconds */
int count = 1000000;
/* intervals */
int current;
/* interval */
int last;
/* check */
int kill_offset;
/* returned by psdanger() */
int danger_offset;
/* returned by psdanger() */
4-26
AIX 4.3 Guide d’optimisation
/* are there any parameters at all? */
if (argc > 1) {
if ( (interval = atoi(argv[1])) < 1 ) {
fprintf(stderr,”Usage: psmonitor [ interval [ count ] ]\n”);
exit(1);
}
if (argc > 2) {
if ( (count = atoi( argv[2])) < 1 ) {
fprintf(stderr,”Usage: psmonitor [ interval [ count ] ]\n”);
exit(1);
}
}
}
last = count –1;
for(current = 0; current < count; current++) {
kill_offset = psdanger(SIGKILL); /* check for out of paging space */
if (kill_offset < 0)
fprintf(stderr,
”OUT OF PAGING SPACE! %d blocks beyond SIGKILL threshold.\n”,
kill_offset*(–1));
else {
danger_offset = psdanger(SIGDANGER); /* check for paging space low
*/
if (danger_offset < 0) {
fprintf(stderr,
”WARNING: paging space low. %d blocks beyond SIGDANGER
threshold.\n”,
danger_offset*(–1));
fprintf(stderr,
”
%d blocks below SIGKILL
threshold.\n”,
kill_offset);
}
}
if (current < last)
sleep(interval);
}
}
Mise en miroir et performances
Si la fonction miroir est utilisée avec l’option Mirror Write Consistency activée (par défaut),
vous devrez certainement installer les copies dans la région externe du disque, les
informations de Mirror Write Consistency étant toujours inscrites sur le cylindre 0. La mise
en miroir simple est coûteuse en terme de performances, elle l’est davantage encore
assortie de l’option Write Verify (une rotation disque supplémentaire par écriture) et plus
encore assortie des deux options Write Verify et Mirror Write Consistency (une rotation
disque plus une recherche sur le cylindre 0). Pour éviter toute confusion, rappelons que
bien qu’une commande lslv signale que l’option Mirror Write Consistency est activée pour
les volumes logiques non miroir, aucun traitement n’est effectué si la valeur de COPIES
n’est pas supérieure à 1. L’option Write Verify est, quant à elle, désactivée par défaut car
elle n’a pas de signification (donc d’incidence) sur les volumes logiques non miroir.
Préinstallation des cartes de communication
Consultez le ”Récapitulatif des paramètres d’optimisation d’UDP, TCP/IP et mbuf”,
page 9-31.
Planification, conception et implantation
4-27
4-28
AIX 4.3 Guide d’optimisation
Chapitre 5. Contrôle système et diagnostics des
performances
Ce chapitre décrit les outils et techniques de contrôle des performances du système.
Les sections traitées sont les suivantes :
• ”Contrôle continu des performances”
• ”Commandes de contrôle iostat, netstat et vmstat”
• ”Utilitaire de diagnostic des performances”
• ”Diagnostics en fonction d’un symptôme particulier”
• ”Diagnostics à l’aide de PerfPMR”
• ”Identification des ressources limitatives”
• ”Gestion de la charge de travail”.
Contrôle système et diagnostics des performances
5-1
Contrôle continu des performances
Sur certaines installations, le contrôle des performances s’effectue à la demande :
lorsqu’une anomalie de performances est relevée, l’analyste lance une ou plusieurs
commandes pour déterminer l’origine de l’incident. Dans d’autres cas, il est nécessaire de
recréer explicitement le problème pour collecter des données d’analyse. Le résultat est que
les utilisateurs se heurtent deux fois au même problème de performance.
Il est souvent plus efficace d’exercer un contrôle en continu, de préférence avec relevé
automatique de données supplémentaires en cas de dégradation des performances. Les
avantages du contrôle continu en compensent largement le coût.
• En effet, un tel contrôle permet de : Détecter les anomalies naissantes avant qu’elles ne
fassent sentir leurs effets.
• Détecter les incidents non signalés par les utilisateurs (réticents à effectuer cette
démarche ou jugeant l’incident suffisamment mineur), mais qui affectent leur productivité
et leur moral.
• Collecter les données générées dès la première apparition de l’incident.
Un contrôle efficace suppose les cinq opérations suivantes :
• Relevé périodique des informations de performances fournies par le système
d’exploitation.
• Stockage des informations pour les diagnostics futurs.
• Communication des informations à l’administrateur système.
• Analyse plus approfondie des situations jugées critiques ou à la demande de
l’administrateur système.
• Collecte et stockage des données détaillées utiles.
Les sections qui suivent présentent plusieurs méthodes de contrôle continu. Ces différentes
approches ne sont pas incompatibles, mais les utiliser conjointement serait redondant.
• ”Commandes de contrôle iostat, netstat et vmstat”
• ”Utilitaire de diagnostic des performances”
5-2
AIX 4.3 Guide d’optimisation
Commandes de contrôle iostat, netstat et vmstat
Certaines caractéristiques fonctionnelles des commandes iostat, netstat et vmstat
peuvent être avantageusement exploitées pour le contrôle continu des performances :
• Comptes rendus à un intervalle fixe sans limitation de durée.
• Rapports d’activité lors des variations liées à différents types de charge.
• Comptes rendus d’activité depuis le dernier rapport, facilitant la détection des
changements intervenus.
Voici des extraits de comptes rendus périodiques générés par ces commandes :
$ iostat 5 2
tty:
tin
0.0
Disks:
hdisk0
cd0
tty:
Disks:
hdisk0
cd0
tout
0.0
% tm_act
0.1
0.0
tin
0.0
tout
0.0
% tm_act
2.4
0.0
cpu:
% user
0.0
% sys
0.2
% idle
99.6
tps
0.0
0.0
Kb_read
18129
0
Kb_wrtn
56842
0
% user
23.1
% sys
9.0
% idle
65.9
Kb_read
0
0
Kb_wrtn
32
0
Kbps
0.3
0.0
cpu:
Kbps
6.4
0.0
tps
1.6
0.0
% iowait
0.1
% iowait
2.0
$ vmstat 5 2
procs
memory
page
faults
cpu
––––– ––––––––––– –––––––––––––––––––––––– –––––––––––– –––––––––––
r b
avm
fre re pi po fr
sr cy in
sy cs us sy id wa
0 0 2610 1128
0
0
0
0
0
0 112
1 19 0 0 99 0
0 0 2505 1247
0
0
0
0
0
0 125 1056 37 22 9 67 2
$ netstat –I tr0 5
input
(tr0)
output
packets errs packets errs colls
532099 1664
985
0
0
45
0
6
0
0
44
1
5
0
0
input
packets
532111
45
44
(Total)
output
errs packets errs colls
1664
997
0
0
0
6
0
0
1
5
0
0
Le premier compte rendu généré par chacune de ces commandes concerne l’activité
cumulée depuis le dernier amorçage du système. Le second compte rendu montre l’activité
enregistrée durant le premier intervalle de 5 secondes. De ce simple extrait, il ressort que
l’activité enregistrée au cours du premier intervalle a été sensiblement supérieure à la
moyenne.
Ces commandes sont à la base du mécanisme de contrôle. Les scripts shell peuvent être
écrits pour réduire les données générées par la commande *stat, signaler les problèmes de
performances ou enregistrer les données concernant l’état du système au moment de
l’incident. Par exemple, un script shell peut tester le pourcentage de CPU disponible, et
lorsqu’il détecte un pourcentage égal à 0 signifiant que la CPU est saturée, exécuter un
autre script shell. Par exemple :
$ ps –ef | egrep –v ”STIME|$LOGNAME” | sort +3 –r | head –n 15
Ce script enregistre les 15 processus actifs (autres que les processus de l’utilisateur du
script) qui ont récemment consommé le plus de temps CPU.
Selon le niveau de sophistication requis, élaborer un ensemble de scripts shell peut s’avérer
difficile. Fort heureusement, il existe des modules moins exigeants en développement et
configuration qui offrent bien plus de fonctions que la plupart des installations n’en
requièrent localement.
Contrôle système et diagnostics des performances
5-3
5-4
AIX 4.3 Guide d’optimisation
Chapitre 6. Contrôle et optimisation de la CPU
L’unité centrale d’un ESCALA est l’un des composants les plus rapides du système : il est
rarissime qu’un programme monopolise 100 % de la CPU au-delà de quelques secondes.
Même sur des systèmes multiutilisateurs très chargés, il arrive qu’au bout d’une période de
10 ms tous les travaux soient en attente. Si un message indique que la CPU est occupée à
100 % (0 % disponible et 0 % d’attente) depuis un certain temps, il est fort probable qu’un
programme se trouve engagé dans une boucle infinie. Dans ce cas, si le programme en
cause est simplement coûteux, mais tout à fait exploitable, il convient de l’identifier et de lui
appliquer un traitement ad hoc.
Ce chapitre indique comment détecter les programmes incontrôlés, ou faisant un usage
intensif de CPU, et réduire leur impact sur les performances.
Si vous êtes peu familiarisé avec la programmation de la CPU sous AIX, reportez-vous à
”Performances du programmateur CPU sous AIX”, page 2-2, avant de poursuivre.
Cette section traite des points suivants :
• ”Contrôle de la CPU via vmstat”
• ”Mesure de la CPU via time”
• ”Identification des grands consommateurs de CPU via ps”
• ”Analyse des programmes via tprof”
• ”Analyse du flux de commande via stem”
• ”Restructuration des exécutables via fdpr”
• ”Contrôle des conflits pour la CPU”
• ”Modification de la tranche horaire du programmateur”
• ”Administration de l’ID utilisateur par rapport à la CPU”
L’outil xmperf est également très utile pour contrôler l’utilisation de la CPU.
Contrôle et optimisation de la CPU
6-1
Contrôle de la CPU via vmstat
Comme contrôleur de CPU, vmstat est plus pratique à utiliser que iostat. Chaque relevé
est présenté sur une ligne distincte, ce qui en facilite la lecture. vmstat propose également
des informations d’ordre général sur l’utilisation de la mémoire, la pagination et les E/S
disque ordinaires. L’exemple qui suit indique comment interpréter la sortie, et notamment
identifier les conditions d’emballement d’un programme ou de carence en CPU en
environnement multiutilisateur.
$ vmstat 2
procs
memory
page
faults
––––– ––––––––––– –––––––––––––––––––––––– ––––––––––––
r b
avm
fre re pi po fr
sr cy in
sy cs
1 0 22478 1677
0
0
0
0
0
0 188 1380 157
1 0 22506 1609
0
0
0
0
0
0 214 1476 186
0 0 22498 1582
0
0
0
0
0
0 248 1470 226
cpu
–––––––––––
us sy id wa
57 32 0 10
48 37 0 16
55 36 0 9
2
2
2
3
2
0
0
0
0
1
22534
22534
22534
22534
22557
1465
1445
1426
1410
1365
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
238 903 239 77 23
209 1142 205 72 28
189 1220 212 74 26
255 1704 268 70 30
383 977 216 72 28
2
1
1
0 22541
0 22524
0 22546
1356
1350
1293
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0 237 1418 209 63 33
0 241 1348 179 52 32
0 217 1473 180 51 35
0
0
0
0
0
0
0
0
0
0
0 4
0 16
0 14
Cette sortie met en évidence l’impact d’un programme en boucle dans un environnement
multiutilisateur. Il ressort des trois premiers relevés (le résumé ayant été supprimé) que
l’équilibre du système pour l’utilisation de la CPU se situe à 50–55 % côté utilisateur, à
30–35 % côté système et à 10–15 % en attente d’E/S. Dès le lancement du programme en
boucle, tous les cycles CPU disponibles sont utilisés. Aucune E/S n’étant effectuée dans
une boucle, tous les cycles non utilisés du fait de l’attente des E/S sont alors exploités par le
programme. En fait, ce processus est capable de s’approprier la CPU de tout processus
utile qui s’en déferait. Bénéficiant du même niveau de priorité que les autres processus
d’avant-plan, le processus n’est pas contraint d’abandonner de la CPU au profit d’un autre
processus devenu diffusable. Son exécution dure environ 10 secondes (5 relevés). Au-delà,
l’activité du système suit un cours plus normal.
6-2
AIX 4.3 Guide d’optimisation
Mesure de la CPU via time
La commande time est un outil simple mais efficace qui permet de mieux comprendre les
caractéristiques de performances d’un programme. time indique le temps écoulé entre le
début et la fin du programme (rubrique real). Elle indique également le temps CPU utilisé
par le programme. Le temps CPU est divisé entre temps user et temps sys. La valeur
user correspond au temps utilisé par le programme lui-même et, le cas échéant, par les
sous-routines de bibliothèque qu’il appelle. La valeur sys correspond au temps utilisé par
les appels système effectués par le programme (directement ou indirectement).
La somme des valeurs user + sys correspond au coût CPU direct total de l’exécution du
programme. Ce coût n’inclut pas les coûts CPU imputables aux portions du noyau
exécutées pour le programme en dehors de sa routine. Par exemple, au lancement du
programme, les trames de page retirées de la liste des disponibilités doivent être
remplacées. La récupération de trames de page à cet effet représente un coût qui n’est pas
englobé dans la consommation CPU du programme.
La différence entre le temps CPU real et le temps CPU total :
real – (user + sys)
correspond à la somme de tous les facteurs susceptibles de retarder le programme, plus les
coûts indéterminés propres au programme. Ces facteurs sont, par ordre d’importance
décroissante :
• les E/S requises pour charger le texte et les données du programme,
• les E/S requises pour acquérir la mémoire réelle nécessaire à l’exploitation du
programme,
• le temps CPU consommé par d’autres programmes,
• le temps CPU consommé par le système d’exploitation.
Dans l’exemple qui suit, le programme présenté dans la section précédente a été compilé
avec l’option –O3 pour le rendre plus rapide. L’écart entre le temps réel d’exécution du
programme et le temps CPU total (utilisateur et système) est minime. Le programme
bénéficie de tout le temps nécessaire, probablement au détriment d’autres programmes.
$ time looper
real
0m3.58s
user
0m3.16s
sys
0m0.04s
Dans l’exemple suivant, le programme est exécuté avec une priorité moindre (valeur nice
augmentée de 10). La durée de son exécution est multipliée par 2, mais les autres
programmes ont l’opportunité d’effectuer leurs travaux :
$ time nice –10 looper
real
0m6.54s
user
0m3.17s
sys
0m0.03s
Notez que la commande nice a été insérée dans la commande time, et non l’inverse. Si
vous entrez :
$ nice –10 time looper
c’est la version /usr/bin/time de la commande time qui est utilisée et non la nouvelle
version intégrée à ksh – qui génère un relevé plus détaillé. Il en est de même si vous
appelez time via une autre commande. Si la commande time est exécutée en premier,
vous obtenez la version intégrée, sauf si vous spécifiez le nom qualifié complet de
/usr/bin/time. Si time est appelé à partir d’une autre commande, vous obtenez
/usr/bin/time.
Contrôle et optimisation de la CPU
6-3
Conseils relatifs à time et timex
Vous devez tenir compte de certaines contraintes lorsque vous utilisez time ou sa variante
timex :
• L’utilisation des commandes /usr/bin/time et /usr/bin/timex est déconseillée. Chaque
fois que possible, optez pour la sous-commande time du shell Korn ou C. « Sous la
version 3.2.5, le temps CPU comptabilisé par /usr/bin/time est incorrect lorsqu’il est lié à
l’exploitation d’un script shell renfermant des séquences de commandes chaînées par
des tubes : seule la dernière commande de la séquence est comptabilisée dans le temps
CPU, le reste est perdu. Cette erreur s’explique par le fait que /usr/bin/time utilise le
shell par défaut du système. Or le shell par défaut de la version 3.2.5 est le shell Bourne,
lequel exécute (commande exec) les séquences de commandes de telle sorte que seule
la consommation CPU de la dernière commande peut être mesurée. En revanche, le
shell Korn (shell par défaut d’AIX version 4.1) ne présente pas le même inconvénient.
• La commande timex –s passe par sar pour obtenir des statistiques supplémentaires. sar
étant intrusive, timex –s l’est également. Les données reportées par timex –s,
notamment dans le cas d’exécutions brèves, risquent de ne pas refléter fidèlement le
comportement d’un programme exécuté sur un système non contrôlé.
• La durée d’une impulsion d’horloge (10 millisecondes) et les règles suivies par le
programmateur pour attribuer du temps CPU aux routines faussent légèrement le résultat
de la commande time. Des variations se produisent immanquablement entre les
exécutions successives. Ces variations sont définies en termes d’implulsions d’horloge.
Naturellement, ces variations sembleront d’autant plus importante que le temps
d’exécution du programme est court.
• Il est déconseillé d’utiliser la commande time ou timex (à partir de /usr/bin ou par le
biais de la fonction time du shell intégré) pour mesurer le temps système ou utilisateur
consommé par une séquence de commandes chaînées par des tubes et entrées sur la
ligne de commande. En effet, si la commande time n’est pas spécifiée correctement, elle
peut ne mesurer qu’une seule commande de la séquence. Il faut savoir par ailleurs que
l’erreur n’est pas signalée, la syntaxe étant techniquement correcte.
6-4
AIX 4.3 Guide d’optimisation
Contrôle de la CPU via xmperf
Le recours à xmperf pour afficher l’utilisation de la CPU dans le système est encore plus
flagrant. Si vous affichez la CPU sous la forme d’un graphique représentant une ligne
d’horizon en mouvement, et la CPU de l’utilisateur en rouge vif, vous pourrez
immédiatement constater depuis l’autre bout de la pièce l’emballement d’un programme. La
commande xmperf est décrite en détail dans le manuel Performance Toolbox 1.2 and 2.1
for AIX: User’s Guide.
Contrôle et optimisation de la CPU
6-5
Identification des gros consommateurs de CPU via ps
Le compte rendu fourni par la commande ps peut être présenté dans trois colonnes
différentes :
Colonne
Valeur
C
Temps CPU récemment utilisé pour le processus.
TIME
Temps CPU total utilisé par le processus depuis son lancement.
%CPU
Temps CPU total utilisé par le processus depuis son lancement divisé
par le temps écoulé depuis le lancement du processus. Mesure la
dépendance du programme vis-à-vis de la CPU.
Le script shell :
$ps –ef | egrep –v ’STIME|$LOGNAME’ | sort +3 –r | head –n 15
sert à mettre en évidence les processus utilisateur du système les plus gourmands en CPU.
Appliqué à l’exemple de la section ”Contrôle de la CPU via vmstat”, ce script générerait la
sortie suivante (la ligne d’en-tête a été ajoutée pour faciliter la lecture) :
USER
waters
root
root
root
root
root
bick
bick
luc
PID
45742
52121
4250
38812
27036
47418
37651
43538
60061
PPID
C
STIME
TTY TIME CMD
54701 120 15:19:05 pts/29 0:02 ./looper
1 11 15:32:33 pts/31 58:39 xhogger
1
3 15:32:33 pts/31 26:03 xmconsole allcon
4250
1 15:32:34 pts/31 8:58 xmconstats 0 3 30
6864
1 15:18:35
– 0:00 rlogind
25925
0 17:04:26
– 0:00 coelogin <d29dbms:0>
43538
0 16:58:40 pts/4 0:00 /bin/ksh
1
0 16:58:38
– 0:07 aixterm
27036
0 15:18:35 pts/18 0:00 –ksh
L’utilisation récente de la CPU est donnée à la quatrième colonne (”C”). Le processus du
programme en boucle est en tête de la liste. Notez que la valeur fournie est probablement
sous-estimée car au-delà de 120 le programmateur s’arrête de compter.
ps est un outil très souple qui permet d’identifier les programmes en cours sur le système et
les ressources qu’ils mobilisent. Les options et colonnes associées sont décrites dans la
documentation de référence de ps, le manuel AIX Commands Reference.
Les indicateurs de ps relèvent pour la plupart d’une des catégories suivantes :
1. Indicateurs spécifiant les processus à inclure dans la sortie.
2. Indicateurs spécifiant les informations à afficher pour chaque processus.
Les tableaux ci-après récapitulent les différents indicateurs de la commande ps et leurs
effets. Dans les deux tableaux, les indicateurs spécifiés avec un signe moins sont situés à
gauche et les autres, à droite. Les deux groupes d’indicateur s’excluent mutuellement : si le
premier est spécifié avec un signe moins, tous les autres indicateurs de la commande ps
doivent obligatoirement appartenir au groupe des indicateurs dotés du signe moins.
6-6
AIX 4.3 Guide d’optimisation
Indicateurs de spécification de
processus :
–G
–U
Les processus
répertoriés sont :
–A
–a
–d
–e
–g
–k
–p
–t
–u
a
g
t
x
Tous les processus
Y
–
–
–
–
–
–
–
–
–
Y
–
–
Non leaders du
groupe de
processus et non
associés à un
terminal
–
Y
–
–
–
–
–
–
–
–
–
–
–
Non leaders du
groupe de
processus
–
–
Y
–
–
–
–
–
–
–
–
–
–
Processus non
noyau
–
–
–
Y
–
–
–
–
–
–
–
–
–
Membres des
–
groupes de
processus spécifiés
–
–
–
Y
–
–
–
–
–
–
–
–
Processus noyau
–
–
–
–
–
Y
–
–
–
–
–
–
–
Ceux spécifiés
dans la liste des
numéros de
processus
–
–
–
–
–
–
Y
–
–
–
–
–
–
Ceux associés
avec les TTY dans
la liste
–
–
–
–
–
–
–Y
(nTTYs)
–
––
(1 TTY)
Y
–
Processus
utilisateur spécifiés
–
–
–
–
–
–
–
–
Y
–
–
–
–
Processus avec
terminaux
–
–
–
–
–
–
–
–
–
Y
–
–
–
NON associés à un
TTY
–
–
–
–
–
–
–
–
–
–
–
–
Y
Spécifiée sans indicateur, la commande ps s’applique par défaut à tous les processus de
l’émetteur de cette commande ps.
Indicateurs de sélection de
colonne
–U
Colonne :
Default1 –f
–l
–u
Default2 e
l
s
u
v
PID
Y
Y
Y
Y
Y
Y
Y
Y
Y
Y
TTY
Y
Y
Y
Y
Y
Y
Y
Y
Y
Y
TIME
Y
Y
Y
Y
Y
Y
Y
Y
Y
Y
CMD
Y
Y
Y
Y
Y
Y
Y
Y
Y
Y
USER
–
Y
–
–
–
–
–
–
Y
–
Contrôle et optimisation de la CPU
6-7
UID
–
–
Y
Y
–
–
Y
–
–
–
PPID
–
Y
Y
–
–
–
Y
–
–
–
C
–
Y
Y
–
–
–
Y
–
–
–
STIME
–
Y
–
–
–
–
–
–
Y
–
F
–
–
Y
–
–
–
–
–
–
–
S/STAT
–
–
Y
–
Y
Y
Y
Y
Y
Y
PRI
–
–
Y
–
–
–
Y
–
–
–
NI/NICE
–
–
Y
–
–
–
Y
–
–
–
ADDR
–
–
Y
–
–
–
Y
–
–
–
SZ/SIZE
–
–
Y
–
–
–
Y
–
Y
Y
WCHAN
–
–
Y
–
–
–
Y
–
–
–
RSS
–
–
–
–
–
–
Y
–
Y
Y
SSIZ
–
–
–
–
–
–
–
Y
–
–
%CPU
–
–
–
–
–
–
–
–
Y
Y
%MEM
–
–
–
–
–
–
–
–
Y
Y
PGIN
–
–
–
–
–
–
–
–
–
Y
LIM
–
–
–
–
–
–
–
–
–
Y
TSIZ
–
–
–
–
–
–
–
–
–
Y
TRS
–
–
–
–
–
–
–
–
–
Y
–
–
–
–
Y
–
–
–
–
environment –
(suivant la
commande ; sans
en-tête de colonne)
Si ps est lancée sans indicateurs ou avec un indicateur de spécification de processus
commençant par un signe moins, les colonnes s’affichent comme celles illustrées pour
Default1. Si la commande est assortie d’un indicateur de spécification de processus ne
commençant pas par un signe moins, les colonnes correspondant à Default2 sont affichées.
–u ou –U est à la fois un indicateur de processus et de sélection de colonne.
Voici une brève description du contenu des colonnes :
6-8
PID
ID processus
TTY
Terminal ou pseudo-terminal associé au processus.
TIME
Cumul du temps CPU consommé, en minutes et secondes.
CMD
Commande exécutée par la processus.
USER
Nom de connexion du propriétaire du processus.
UID
ID utilisateur numérique du propriétaire du processus.
PPID
ID du processus parent.
C
Temps CPU récemment utilisé.
STIME
Heure de début du processus (s’il a été lancé le jour même). Sinon,
date de début du processus.
F
Valeur hexadécimale de 8 caractères décrivant les indicateurs associés
au processus (voir la description détaillée de la commande ps).
S/STAT
Etat du processus (voir la description détaillée de la commande ps).
PRI
Niveau de priorité courant du processus.
AIX 4.3 Guide d’optimisation
NI/NICE
Valeur nice du processus.
ADDR
Numéro de segment de pile de processus.
SZ/SIZE
Nombre de pages de segments actifs touchées, multiplié par 4.
WCHAN
Événement attendu par le processus.
RSS
Cumul du nombre de pages de segments actifs et du nombre de pages
de segments de codes en mémoire, multiplié par 4.
SSIZ
Taille de la pile du noyau.
%CPU
Taux d’utilisation de la CPU par le processus depuis son lancement.
%MEM
Valeur RSS divisée par la taille de la machine en ko, multipliée par 100
et arrondie au pourcentage le plus proche.
PGIN
Nombre de chargements de page consécutifs à un défaut de page.
Équivaut approximativement au volume des E/S, toutes les E/S étant
comptabilisées sous AIX comme des défauts de page.
LIM
Limite sur la taille RSS. Affiché ”xx” si non définie.
TSIZ
Taille de la section de texte du fichier exécutable.
TRS
Nombre de pages de segments de code, multiplié par 4.
environnement
Valeur de toutes les variables d’environnement du processus.
Contrôle et optimisation de la CPU
6-9
Analyse des programmes via tprof
L’exécution d’un programme est une combinaison variable de codes d’application, de
bibliothèques, de sous-routines et de services de noyau. Généralement, un programme non
optimisé utilise la plupart des cycles CPU qui lui sont impartis à un nombre réduit
d’instructions ou de sous-routines. Ces zones critiques sont souvent inattendues pour la
personne chargée de mettre le programme en application et peuvent être considérées
comme des anomalies de performances. L’outil préconisé pour localiser les zones critiques
d’un programme est le ”profileur” tprof. tprof, fondé sur la fonction de suivi, est capable de
profiler un programme (analyser son exécution) généré par un des compilateurs XL
suivants : XL C, XL C++, XL FORTRAN.
Sous AIX version 4.1, le programme tprof est intégré à la boîte à outils PTX (Performance
Toolbox for AIX). Pour savoir si tprof est disponible, entrez :
lslpp –lI perfagent.tools
Si ce module est installé, tprof est disponible.
Les données brutes de tprof sont obtenues par la fonction de suivi (reportez-vous au
chapitre ”Analyse des performances avec l’utilitaire de suivi”, page 11-1). Lorsqu’un
programme est profilé, l’utilitaire de suivi est activé et chargé de recueillir les données du
point d’ancrage du suivi (ID 234) qui enregistre le contenu du registre d’adresse
d’instruction (IAR) à chaque interruption d’horloge système (100 fois par seconde).
Plusieurs autres points d’ancrage sont également activés pour permettre à tprof de suivre
le processus et de diffuser l’activité. Les enregistrements de suivi ne sont pas inscrits dans
un fichier disque mais vers un tube. Un programme lit le contenu du tube et construit une
table avec les adresses de programme uniques rencontrées et leur nombre d’occurrences.
Cette table est copiée sur le disque lorsque toute la charge de travail a été traitée. Le
composant chargé de la réduction des données dans tprof fait la corrélation entre les
adresses d’instruction rencontrées et les intervalles d’adresses occupés par les
programmes. Puis, il diffuse les occurrences d’adresses (”impulsions d’horloge”) parmi les
programmes impliqués dans la charge.
La diffusion des impulsions d’horloge est globalement proportionnelle au temps CPU utilisé
sur chaque programme (10 millisecondes par impulsion). Lorsque les programmes
fortement sollicités ont été identifiés, le programmeur peut prendre les mesures qui
s’imposent pour restructurer les zones critiques ou minimiser leur usage.
Exemple théorique
Le programme C suivant initialise à 0x01 chaque octet d’un grand tableau de nombres
entiers, incrémente chaque entier (int) d’une constante aléatoire et envoie en sortie un
entier (int) désigné aléatoirement. Le programme ne remplit pas de fonction particulière,
mais il est représentatif des programmes qui traitent de grands tableaux.
6-10
AIX 4.3 Guide d’optimisation
/* Array Incrementer –– Version 1 */
#include <stdlib.h>
#define Asize 1024
#define RowDim InnerIndex
#define ColDim OuterIndex
main()
{
int Increment;
int OuterIndex;
int InnerIndex;
int big [Asize][Asize];
/* initialize every byte of the array to 0x01 */
for(OuterIndex=0; OuterIndex<Asize; OuterIndex++)
{
for (InnerIndex=0; InnerIndex<Asize; InnerIndex++)
big[RowDim][ColDim] = 0x01010101;
}
Increment = rand();
/* increment every element in the array */
for(OuterIndex=0; OuterIndex<Asize; OuterIndex++)
{
for (InnerIndex=0; InnerIndex<Asize; InnerIndex++)
{
big[RowDim][ColDim] += Increment;
if (big[RowDim][ColDim] < 0)
printf(”Negative number. %d\n”,big[RowDim][ColDim]);
}
}
printf(”Version 1 Check Num: %d\n”,
big[rand()%Asize][rand()%Asize]);
return(0);
}
Ce programme a été compilé par la commande :
$ xlc –g version1.c –o version1
Le paramètre –g commande au compilateur XL C de générer le module objet avec des
informations de mise au point symboliques destinées à tprof. Bien que tprof soit capable
de profiler des modules optimisés, nous avons omis de spécifier le paramètre –O pour
préciser les numéros de ligne utilisés par tprof. Lors de l’optimisation, le compilateur XL C
réorganise généralement les codes si bien que l’interprétation de la sortie de tprof est plus
difficile. Sur le système test, ce programme mobilise environ 5,97 secondes, dont plus de
5,9 secondes de temps CPU utilisateur. Le programme remplit donc parfaitement son
objectif : être limité en temps CPU.
Appliquer au programme la commande tprof comme suit :
$ tprof –p version1 –x version1
génère un fichier __version1.all (voir ci-dessous) qui indique le nombre d’impulsions
CPU consommées par chaque programme impliqué dans l’exécution.
Contrôle et optimisation de la CPU
6-11
Process
PID
=======
===
version1 33570480
bsh 33566383
/etc/init
1
/etc/syncd
3059
tprof
5038
rlogind
11345
PID.771
771
tprof
11940
tprof
11951
tprof
13987
bsh
16048
=======
===
Total
Total
=====
793
8
6
5
4
2
1
1
1
1
1
=====
823
Kernel
======
30
8
0
5
2
2
1
1
1
1
1
======
52
User
====
763
0
6
0
2
0
0
0
0
0
0
====
771
Shared
======
0
0
0
0
0
0
0
0
0
0
0
======
0
Other
=====
0
0
0
0
0
0
0
0
0
0
0
=====
0
Process
=======
version1
bsh
/etc/init
/etc/syncd
tprof
rlogind
PID.771
=======
Total
Total
=====
793
9
6
5
7
2
1
=====
823
Kernel
======
30
9
0
5
5
2
1
======
52
User
====
763
0
6
0
2
0
0
====
771
Shared
======
0
0
0
0
0
0
0
======
0
Other
=====
0
0
0
0
0
0
0
=====
0
FREQ
===
1
2
1
1
4
1
1
===
11
Total Ticks For version1(
Subroutine
=============
.main
Ticks
======
763
USER) =
%
======
92.7
763
Source
=======
version1.c
Address
=======
632
Bytes
=====
560
La première section du relevé indique le nombre d’impulsions consommées par chaque
processus (ou qui lui sont imputables). Le programme version1 a utilisé 763 impulsions
parmi lesquelles 30 se sont déroulées dans le noyau mais sont imputées à version1.
Deux processus exécutant le shell Bourne sont impliqués dans l’exécution de version1.
Quatre processus ont exécuté des codes liés à tprof. Le processus init, le démon sync, un
processus rlogin et un autre processus représentent 14 impulsions.
Rappelons que le programme associé à un ID processus numérique donné change à
chaque appel exec. Si un programme d’application en exécute (exec) un autre, le nom des
deux programmes apparaît dans la sortie de tprof associée au même ID processus.
La seconde section du rapport récapitule les résultats par programme, indépendamment de
l’ID processus. Elle indique le nombre (FREQ) de processus distincts susceptibles
d’atteindre chaque programme à un point donné.
La troisième section analyse les impulsions d’horloge utilisateur associées au programme
exécutable profilé. L’analyse indique le nombre d’impulsions utilisées par chaque fonction
de l’exécutable et le pourcentage que ce nombre représente sur le total des impulsions
CPU produites lors de l’exécution (823).
Jusque là, aucune opération tprof n’a fait appel à la version compilée spéciale du
programme : la même analyse aurait pu être effectuée sur un programme dont le code
source est inaccessible.
Il ressort clairement de ce relevé que le programme lui-même est le plus grand
consommateur de temps CPU (92,7 %), et non le noyau ou les sous-routines de
bibliothèques du programme. Etudions-le de plus près.
La compilation de version1.c ayant été faite avec l’option –g, le fichier objet comprend
des informations qui associent les décalages du texte du programme aux lignes du code
source. Par conséquent, tprof a créé une version annotée du fichier source version1.c,
appelée __t.version1.c, basée sur les décalages et les informations relatives aux
numéros de ligne dans le module objet. La première colonne reporte le numéro de ligne.
6-12
AIX 4.3 Guide d’optimisation
La seconde comptabilise le nombre de fois où le point d’ancrage a signalé les interruptions
de l’horloge alors que le système exécutait l’une des instructions associées à cette ligne.
Ticks Profile for main in version1.c
Line
Ticks
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
34
–
40
261
–
–
–
–
70
–
–
–
69
50
239
29
30
31
32
33
34
–
–
–
–
–
–
Source
for(OuterIndex=0; OuterIndex<Asize; OuterIndex++)
{
for (InnerIndex=0; InnerIndex<Asize; InnerIndex++)
big[RowDim][ColDim] = 0x01010101;
}
Increment = rand();
/* increment every element in the array */
for(OuterIndex=0; OuterIndex<Asize; OuterIndex++)
{
for (InnerIndex=0; InnerIndex<Asize; InnerIndex++)
{
big[RowDim][ColDim] += Increment;
if (big[RowDim][ColDim] < 0)
printf(”Negative number.%d\n”,
big[RowDim][ColDim]);
}
}
printf(”Version 1 Check Num: %d\n”,
big[rand()%Asize][rand()%Asize]);
return(0);
}
763 Total Ticks for main in version1.c
Ce compte rendu montre clairement que le plus grand nombre d’impulsions est associé à
l’accès aux éléments du tableau big, et nous permet d’optimiser les performances en nous
concentrant sur les boucles internes for. La première boucle for (initialisation) est un
exemple de programmation sauvage : il est totalement inefficace d’initialiser les éléments
des tableaux les uns après les autres. S’il s’agissait de mettre le tableau à 0, nous aurions
dû utiliser bzero. Dans la mesure où il s’agit de donner à chaque bit la valeur d’un caractère
spécifique, nous allons utiliser memset pour remplacer la première boucle for.
(les fonctions bzero et memset sont très efficaces, tout comme les fonctions str : écrites en
assembleur, elles exploitent des instructions matérielles qui n’ont pas d’équivalent direct
en C).
Nous devons accéder successivement aux éléments du tableau pour les incrémenter, mais
en nous assurant que le schéma de la référence mémoire se rapporte à des adresses
consécutives pour optimiser l’utilisation du cache. Ici, les dimensions des rangées sont
modifiées plus rapidement que celles des colonnes. Les tableaux C étant structurés sur la
base des rangées, nous omettons une rangée complète à chaque référence mémoire.
La longueur des rangées étant de 1 024 entiers – int – (4 096 octets), nous changeons de
page à chaque référence. La taille du tableau dépassant largement les possibilités du cache
de données et du TLB de données, nous avons écrit un programme qui accepte le
maximum de cache et de TLB. Pour ce faire, nous avons simplement transposé les
instructions #define pour inverser les valeurs de RowDim et ColDim.
La forme non optimisée de ce programme (version2.c) consomme environ 2,7 secondes
de temps CPU, à comparer aux 7,9 secondes pour version1.
Le fichier suivant, __t.version2.c, résulte d’une commande tprof appliquée à la forme
non optimisée du programme :
Contrôle et optimisation de la CPU
6-13
Ticks Profile for main in version2.c
Line
Ticks
Source
15
–
memset(big,0x01,sizeof(big));
16
–
Increment = rand();
17
–
18
–
/* increment in memory order */
19
60
for(OuterIndex=0; OuterIndex<Asize; OuterIndex++)
20
–
{
21
–
for (InnerIndex=0; InnerIndex<Asize; InnerIndex++)
22
–
{
23
67
big[RowDim][ColDim] += Increment;
24
60
if (big[RowDim][ColDim] < 0)
25
43
printf(”Negative number.
%d\n”,big[RowDim][ColDim]);
26
–
}
27
–
}
28
–
printf(”Version 2 Check Num: %d\n”,
29
–
big[rand()%Asize][rand()%Asize]);
30
–
return(0);
31
–
}
230 Total Ticks for main in version2.c
En étant attentif au schéma d’utilisation du temps CPU, nous avons multiplié la vitesse CPU
du programme – non optimisé – par trois. Les performances sont multipliées par 7 si
version1.c et version2.c sont optimisés avant compilation.
L’utilisation de la CPU par un programme intervient principalement dans les sous-routines
de bibliothèque qu’il utilise et non dans le programme lui-même. Si, dans version2.c, le
test conditionnel de la ligne 24 et l’entrée printf de la ligne 28 sont supprimés pour créer
la version3.c suivante :
#include <string.h>
#include <stdlib.h>
#define Asize 256
#define RowDim OuterIndex
#define ColDim InnerIndex
main()
{
int Increment;
int OuterIndex;
int InnerIndex;
int big [Asize][Asize];
/* Initialize every byte to 0x01 */
memset(big,0x01,sizeof(big));
Increment = rand();
/* increment in memory order */
for(OuterIndex=0; OuterIndex<Asize; OuterIndex++)
{
for (InnerIndex=0; InnerIndex<Asize; InnerIndex++)
{
big[RowDim][ColDim] += Increment;
printf(”RowDim=%d, ColDim=%d, Number=%d\n”,
RowDim, ColDim, big[RowDim][ColDim]);
}
}
return(0);
}
le temps d’exécution est essentiellement imputable à l’instruction printf. La commande :
$ tprof –v –s –k –p version3 –x version3 >/dev/null
6-14
AIX 4.3 Guide d’optimisation
génère une __version3.all qui comprend les données de profilage pour le noyau et la
bibliothèque de sous-routine partagée libc.a (seule bibliothèque utilisée par ce
programme) :
Process
PID
=======
===
version3 33568373
bsh 33567348
tprof
15987
tprof
7784
tprof
12905
bsh
13941
=======
===
Total
Total
=====
818
5
3
1
1
1
=====
829
Kernel
======
30
5
1
1
1
1
======
39
User
====
19
0
2
0
0
0
====
21
Shared
======
769
0
0
0
0
0
======
769
Other
=====
0
0
0
0
0
0
=====
0
Process
=======
version3
bsh
tprof
=======
Total
Total
=====
818
6
5
=====
829
Kernel
======
30
6
3
======
39
User
====
19
0
2
====
21
Shared
======
769
0
0
======
769
Other
=====
0
0
0
=====
0
FREQ
===
1
2
3
===
6
Total Ticks For version3(
Subroutine
=============
.main
.printf
USER) =
Ticks
======
11
8
Total Ticks For version3(
Subroutine
=============
.sc_flih
.i_enable
.vmcopyin
.xix_setattr
.isreadonly
.lockl
.v_pagein
.curtime
.trchook
.vmvcs
.spec_rdwr
.rdwr
.imark
.nodev
.ld_findfp
%
======
1.3
1.0
KERNEL) =
Ticks
======
7
5
3
2
2
2
1
1
1
1
1
1
1
1
1
%
======
0.8
0.6
0.4
0.2
0.2
0.2
0.1
0.1
0.1
0.1
0.1
0.1
0.1
0.1
0.1
Total Ticks For version3( SH–LIBs) =
Shared Object
=============
libc.a/shr.o
Ticks
======
769
Profile: /usr/lib/libc.a
%
======
92.0
19
Source
=======
version3.c
glink.s
Bytes
=====
320
36
Address
=======
13832
21760
414280
819368
689016
29300
372288
27656
48168
29744
629596
658460
672024
135864
736084
Bytes
=====
1244
256
668
672
60
208
1044
76
856
2304
240
492
184
32
240
30
Source
=======
low.s
low.s
vmmove.c
xix_sattr.c
disubs.c
lockl.s
v_getsubs1.c
clock.s
noname
vmvcs.s
spec_vnops.c
rdwr.c
isubs.c
devsw_pin.c
ld_libld.c
769
Source
=======
/usr/lib
Address Bytes
======= =====
794624 724772
shr.o
Total Ticks For version3(/usr/lib/libc.a) =
Subroutine
=============
._doprnt
.fwrite
.strchr
.printf
._moveeq
.strlen
.isatty
._xwrite
.__ioctl
Address
=======
632
1112
Ticks
======
476
205
41
18
16
10
1
1
1
%
======
56.9
24.5
4.9
2.2
1.9
1.2
0.1
0.1
0.1
769
Source
=======
doprnt.c
fwrite.c
strchr.s
printf.c
memcmp.s
strerror.c
isatty.c
flsbuf.c
ioctl.c
Address
=======
36616
50748
31896
313796
36192
46800
62932
4240
57576
Bytes
=====
7052
744
196
144
184
124
112
280
240
Contrôle et optimisation de la CPU
6-15
Ce qui confirme que les impulsions sont majoritairement imputables aux bibliothèques
partagées–– libc.a, ici. Le profil de libc.a indique que la plupart de ces impulsions sont
imputables à la sous-routine _doprnt.
_doprnt est le module de traitement de printf, sprintf, etc. Avec une simple modification,
nous avons augmenté le temps de traitement de 2,7à 8,6 secondes, et notre impression
formatée consomme à présent environ 60 % du temps CPU. Ceci explique pourquoi le
formatage doit être employé judicieusement. Les performances de _doprnt sont
également affectées par l’environnement local. Reportez–vous à l’annexe I, ”Support NLS
local et vitesse”. Ces tests ont été effectués dans l’environnement local C, le plus efficace.
6-16
AIX 4.3 Guide d’optimisation
Analyse du flux de commande via stem
Le module d’instrumentation stem peut suivre le flux de commande grâce à une gamme
variée de logiciels. Sous AIX version 4.1, cet outil fait partie de la boîte à outils Performance
Toolbox for AIX. Pour savoir si stem est disponible, entrez :
lslpp –lI perfagent.tools
Si ce module est installé, stem est disponible.
Les avantages les plus significatifs de stem sont :
• stem peut instrumenter des programmes d’application :
– limités,
– optimisés,
– en multitraitement,
– dans des bibliothèques partagées non limitées.
• les sous–routines d’instrumentation d’entrée et de sortie stem peuvent être :
– fournies par stem,
– fournies par l’utilisateur.
stem crée des versions instrumentées des programmes et des bibliothèques requises, et
les stocke dans le répertoire /tmp/EXE. Lorsque l’utilisateur exploite ces programmes
instrumentés, stem crée un fichier correspondant appelé stem_out.
Analyse de stem
Pour analyser le flux de commande d’un simple programme d’application, entrez :
stem –p stem_test_pgm
La sortie de cette commande est :
**********************************************************
Make.Stem does not exist, issueing make for stem_samples.o
make stem_samples.o
Target stem_samples.o is up to date.
******************************************************
The instrumented stem_test_pgm is at /tmp/EXE/stem_test_pgm
Assuming version 3.2.5 or later, SVC_string=.sc_flih
L’instrumentation de stem_test_pgm a abouti, bien que le programme ait été limité. La
forme instrumentée du programme réside dans le répertoire /tmp/EXE. Entrez ensuite :
/tmp/EXE/stem_test_pgm
Contrôle et optimisation de la CPU
6-17
Vous obtenez un fichier appelé stem_out dans le répertoire de travail courant. Dans ce cas,
stem_out contient :
Seconds.usecs TID Routine Names & Seconds.usecs since
entering routine.
767549539.847704
1 –>main
767549539.880523
1
–>setPI
767549539.880958
1
<–setPI 0.000435
767549539.881244
1
–>squareit
767549539.881515
1
<–squareit 0.000271
767549539.881793
1
–>printf
767549539.883316
1
<–printf 0.001523
767549539.883671
1
–>setPI
767549539.883944
1
<–setPI 0.000273
767549539.884221
1
–>squareit
767549539.884494
1
<–squareit 0.000273
767549539.884772
1
–>printf
767549539.885981
1
<–printf 0.001209
767549539.886330
1 <–main 0.038626
767549539.886647
1
–>exit
Le graphique d’appel capture les appels dirigés vers les fonctions du module (setPI et
squareit) et vers la sous–routine printf de libc.a. Les numéros à droite des noms des
sous–routines représentent le temps écoulé (en secondes et microsecondes) entre l’appel
et la réponse.
Si le même processus est exécuté sur la commande wc (/usr/bin/wc), le fichier stem_out
contient alors (pour wc d’un fichier composé de deux mots) :
Seconds.usecs TID Routine Names & Seconds.usecs since
entering routine.
767548812.962031
1 –>main
767548812.993952
1
–>setlocale
767548812.995065
1
<–setlocale 0.001113
767548812.995337
1
–>catopen
767548812.995554
1
<–catopen 0.000217
767548812.995762
1
–>getopt
767548812.996101
1
<–getopt 0.000339
767548812.996345
1
–>open
767548812.996709
1
<–open 0.000364
767548812.996953
1
–>read
767548812.997209
1
<–read 0.000256
767548812.997417
1
–>read
767548812.997654
1
<–read 0.000237
767548812.997859
1
–>wcp
767548812.998113
1
–>printf
767548812.998586
1
<–printf 0.000473
767548812.998834
1
<–wcp 0.000975
767548812.999041
1
–>printf
767548813.000439
1
<–printf 0.001398
767548813.000720
1
–>close
767548813.000993
1
<–close 0.000273
767548813.001284
1
–>exit
Ce graphique d’appel, obtenu assez facilement, illustre la structure d’une commande AIX.
Les appels à destination de setlocale et catopen assurent que la commande se déroule
dans le même environnement local NLS (National Language Support) et avec le même
catalogue de messages que son processus père.
Bien que les programmes stem puissent s’exécuter dans plusieurs processus, le graphique
d’appel indique uniquement l’ordre d’exécution dans le processus principal.
6-18
AIX 4.3 Guide d’optimisation
Restructuration des exécutables via fdpr
Le programme fdpr (feedback-directed program restructuring) optimise des modules
exécutables pour accélérer leur exécution et rendre plus efficace l’utilisation de la mémoire
réelle. Sous AIX version 4.1, cet outil fait partie de la boîte à outils Performance Toolbox for
AIX. Pour savoir si fdpr est disponible, entrez :
lslpp –lI perfagent.tools
Si ce module est installé, fdpr est disponible.
Le traitement fdpr se fait en trois étapes :
• Instrumentation du module exécutable à optimiser pour permettre la collecte détaillée des
données de fonctionnement.
• Exploitation de l’exécutable instrumenté, avec une charge de travail fournie par
l’utilisateur, et enregistrement des données de performance recueillies.
• Exploitation des données de performances pour piloter le processus d’optimisation, qui
se traduit par un module exécutable restructuré et capable d’exécuter plus efficacement
la charge de travail gérée par l’exécutable instrumenté. Il est crucial que la charge de
travail utilisée pour piloter fdpr corresponde précisément à l’utilisation actuelle du
programme. Les performances d’un exécutable restructuré avec des charges de travail
différentes de celles utilisées pour piloter fdpr sont imprévisibles, mais peuvent être
moins bonnes que celles de l’exécutable d’origine.
Par exemple, la commande :
fdpr –p NomProgramme –R3 –x test.sh
utilise le jeu d’essai test.sh pour exploiter le programme instrumenté NomProgramme. La
sortie de cette commande peut être utilisée pour atteindre le plus haut degré d’optimisation
(R3) du programme et former un nouveau module appelé, par défaut,
NomProgramme.fdpr. La différence de performance entre l’exécutable optimisé et celui
non-optimisé dépend largement de la précision de la simulation de la charge de travail par
l’essai test.sh.
Attention : Les algorithmes d’optimisation avancés intégrés au programme fdpr
entraînent parfois une différence de fonctionnement entre les exécutables optimisés et le
module exécutable d’origine. Pour une question de fiabilité, il est essentiel de tester de
façon exhaustive un exécutable optimisé avant toute exploitation.
En résumé, les utilisateurs de fdpr doivent :
• veiller à utiliser une charge de travail représentative pour piloter fdpr ;
• tester de façon exhaustive le fonctionnement de l’exécutable restructuré ;
• exploiter l’exécutable restructuré uniquement sur les charges de travail pour lesquelles il
est prévu.
Contrôle et optimisation de la CPU
6-19
Contrôle des conflits pour la CPU
Priorité des processus utilisateur
Les priorités des processus utilisateur peuvent être fixées via les commandes nice et
renice et la sous-routine setpri, et affichées via ps. Les priorités sont présentées dans
”Priorité des processus et des routines”, page 2-3.
Exécution d’une commande à priorité non standard via nice
Tout utilisateur peut exploiter une commande à un niveau de priorité inférieur au niveau
normal via nice . En revanche, seul l’utilisateur root peut lancer nice pour exploiter des
commandes à une priorité plus élevée.
Via nice, l’utilisateur spécifie une valeur à ajouter ou à soustraire de la valeur nice standard.
La valeur ainsi obtenue est exploitée par le processus qui lance la commande. A ce stade,
la priorité du processus n’est toujours pas fixée : sa valeur est recalculée périodiquement en
fonction de l’utilisation de la CPU, de la valeur nice ainsi que de la valeur minimum de la
priorité du processus utilisateur.
La valeur nice standard d’un processus d’avant-plan est de 20, celle d’un processus
d’arrière-plan, de 24. Pour obtenir la valeur initiale de la priorité, additionnez la valeur nice
et le niveau minimum de priorité de processus utilisateur (40). Par exemple, la commande :
$ nice –5 vmstat 10 3 >vmstat.out
exécute vmstat avec la valeur nice de 25 (au lieu de 20), entraînant une priorité de base
de 65 (avant ajout dû à l’utilisation récente de la CPU).
Un utilisateur root aurait pu lancer vmstat à une priorité supérieure :
# nice ––5 vmstat 10 3 >vmstat.out
Si un utilisateur non root lance cette commande nice, la commande vmstat fonctionne,
mais avec la valeur nice standard 20, et nice ne génère aucun message d’erreur.
Définition d’une priorité fixe via setpri
Une application qui fonctionne sous l’ID utilisateur root peut exploiter la sous-routine
setpri pour définir sa propre priorité ou celle d’un autre processus. Voici quelques conseils :
retcode = setpri(0,59);
affecte au processus en cours une priorité fixe de 59. Si setpri échoue, il retourne la
valeur –1.
Le programme suivant accepte une valeur de priorité et une liste d’ID de processus ; la
priorité de tous les processus est fixée à la valeur indiquée.
6-20
AIX 4.3 Guide d’optimisation
/*
fixprocpri.c
Usage: fixprocpri priority PID . . .
*/
#include <sys/sched.h>
#include <stdio.h>
#include <sys/errno.h>
main(int argc,char **argv)
{
pid_t ProcessID;
int Priority,ReturnP;
if( argc < 3 ) {
printf(” usage – setpri priority pid(s) \n”);
exit(1);
}
argv++;
Priority=atoi(*argv++);
if ( Priority < 50 ) {
printf(” Priority must be >= 50 \n”);
exit(1);
}
while (*argv) {
ProcessID=atoi(*argv++);
ReturnP = setpri(ProcessID, Priority);
if ( ReturnP > 0 )
printf(”pid=%d new pri=%d old pri=%d\n”,
(int)ProcessID,Priority,ReturnP);
else {
perror(” setpri failed ”);
exit(1);
}
}
}
Affichage de la priorité des processus via ps
L’indicateur –l (L minuscule) de la commande ps permet l’affichage des valeurs nice et des
priorités courantes pour les processus spécifiés. Par exemple, pour afficher les priorités des
processus d’un utilisateur donné, entrez :
# ps –lu
F
241801
200801
241801
waters
S UID PID
S 200 7032
S 200 7569
S 200 8544
PPID
7287
7032
6495
C PRI NI ADDR
0 60 20 1b4c
0 65 25 2310
0 60 20 154b
SZ
108
88
108
WCHAN
5910a58
TTY
pts/2
pts/2
pts/0
TIME
0:00
0:00
0:00
CMD
ksh
vmstat
ksh
La sortie montre le résultat de la commande nice –5 décrite plus haut. Le processus 7569 a
une priorité effective de 65 (la commande ps a été lancée en mode superutilisateur lors
d’une autre session, d’où la présence de deux TTY).
Si l’un des processus a exploité la sous-routine setpri pour s’attribuer une priorité fixe, le
format en sortie de ps –l est le suivant :
F S UID PID PPID
C PRI NI ADDR
200903 S
0 10759 10500 0 59 –– 3438
40
SZ
WCHAN
TTY TIME CMD
4f91f98 pts/0 0:00 fixpri
Modification de la priorité d’un processus en cours via renice
Remarque : Dans cette section, la syntaxe renice pour AIX version 3 est utilisée. La
section suivante traite de la syntaxe de nice et renice sous AIX versions 3 et 4.
Contrôle et optimisation de la CPU
6-21
renice modifie la valeur nice et, par conséquent, la priorité du ou des processus en cours
d’exécution. Les processus sont identifiés via l’ID processus, l’ID groupe de processus ou le
nom de l’utilisateur des processus. renice ne peut être appliqué à des processus à priorité
fixe.
A partir de l’exemple précédent, modifions la valeur nice (renice) du processus vmstat
lancé via nice :
# renice –5 7569
7569: old priority –5, new
# ps –lu waters
F S UID PID PPID
241801 S 200 7032 7287
200801 S 200 7569 7032
241801 S 200 8544 6495
priority 0
C PRI NI ADDR
0 60 20 1b4c
0 55 15 2310
0 60 20 154b
SZ
108
92
108
WCHAN
5910a58
TTY
pts/2
pts/2
pts/0
TIME
0:00
0:00
0:00
CMD
ksh
vmstat
ksh
Le processus est à présent exécuté à une priorité supérieure à celles des autres processus
d’avant-plan. Notez que renice n’ajoute ni ne retranche la valeur spécifiée à l’ancienne
valeur nice. Elle remplace l’ancienne valeur par la nouvelle. Pour annuler le tout, entrez :
# renice –0 7569
7569: old priority –5, new
# ps –lu waters
F S UID PID PPID
241801 S 200 7032 7287
200801 S 200 7569 7032
241801 S 200 8544 6495
priority 0
C PRI NI ADDR
0 60 20 1b4c
1 60 20 2310
0 60 20 154b
SZ
108
92
108
WCHAN
5910a58
TTY
pts/2
pts/2
pts/0
TIME
0:00
0:00
0:00
CMD
ksh
vmstat
ksh
Dans ces exemples, renice est lancé par l’utilisateur root. L’utilisation de renice par un
utilisateur non root est doublement limitée. Il ne peut :
• lancer cette commande que sur ses propres processus,
• augmenter la priorité d’un processus, même pour restaurer sa priorité par défaut, après
l’avoir diminuée via renice.
Clarification de la syntaxe nice/renice
AIX version 3
Pour les commandes nice et renice, l’ajout d’une valeur à la valeur nice standard (20) n’est
pas exprimée de la même façon.
Pour nice, un signe moins placé avant la valeur, supposée positive, est obligatoire pour
l’identifier. Pour spécifier une valeur négative, un second signe moins (sans espace entre
les deux) est requis.
Pour renice, le paramètre qui suit le nom de la commande est supposé être la valeur à
ajouter. Cette valeur peut comporter un signe ou non (dans ce cas, la valeur est positive).
Les commandes suivantes sont donc équivalentes :
nice –5
nice –5
nice – –5
renice 5
renice +5
renice –5
Resulting
nice Value
25
25
15
Resulting
Priority Value
65
65
55
AIX version 4.1
Sous AIX version 4, la syntaxe de renice a été modifiée pour compléter la syntaxe de nice,
qui utilise l’indicateur –n pour identifier l’augmentation de la valeur nice. Le tableau suivant
est la version AIX version 4.1 du tableau précédent :
nice –n 5
nice –n +5
nice –n –5
6-22
AIX 4.3 Guide d’optimisation
renice –n 5
renice –n +5
renice –n –5
Resulting
nice Value
25
25
15
Resulting
Priority Value
65
65
55
Optimisation du calcul de la priorité d’un processus via schedtune
Une récente amélioration de schedtune et du programmateur CPU d’AIX autorise la
modification des paramètres utilisés pour calculer la priorité d’un processus.
Cette nouveauté d’AIX version 4.1 est disponible dans le PTF pour la version 3.2.5.
Reportez-vous à ”Priorité des processus et des routines”, page 2-3.
La formule de calcul d’une priorité est la suivante :
priorité = priorité de base + valeur nice + (pénalité CPU basée
sur l’utilisation récente de la CPU)
La valeur de l’utilisation récente de la CPU d’un processus donné est incrémentée de 1 à
chaque fois que le processus contrôle la CPU lors d’une interruption de l’horloge (toutes les
10 millisecondes). Cette valeur est affichée en colonne ”C” de la sortie de la commande ps.
Son maximum est 120.
L’algorithme calcule la pénalité CPU en divisant l’utilisation récente de la CPU par 2. Le
rapport pénalité CPU/utilisation récente de la CPU est donc 0,5. Cette valeur est désignée
par R.
Toutes les secondes, l’algorithme en cours divise la valeur de l’utilisation récente de la CPU
de chaque processus par 2. Le facteur de décroissance du temps d’utilisation de la CPU
récente est donc de 0,5. Cette valeur est désignée par D.
Pour certains utilisateurs, l’algorithme existant n’établit pas une distinction assez nette entre
les processus d’arrière-plan et d’avant-plan. Par exemple, si un processus d’avant-plan
(valeur nice = 20) et un processus d’arrière-plan (valeur nice = 24) lancés en même temps
sollicitent de façon intensive les fonctions de calcul du système, on obtient la séquence
suivante (sans tenir compte des autres activités) :
• Le processus d’avant-plan est programmé le premier. Au bout de 8 tranches horaires
(80 ms), sa pénalité CPU est 4, ce qui rend sa priorité égale à celle du processus
d’arrière-plan. L’algorithme de répartition par permutation circulaire engendre la
programmation du processus d’arrière-plan.
• Au bout de 2 autres tranches horaires, la pénalité CPU du processus d’arrière-plan est 1,
ce qui rend sa priorité supérieure de 1 à celle du processus d’avant-plan. Le processus
d’avant-plan est programmé.
• Au bout de 2 autres tranches horaires, les priorités des processus redeviennent égales.
Les processus continuent d’alterner toutes les 2 tranches horaires jusqu’à la fin de la
seconde.
• A la fin de la seconde, le processus d’avant-plan aura disposé de 54 tranches horaires et
celui d’arrière-plan de 46. Lorsque le facteur de décroissance est appliqué, les valeurs du
temps d’utilisation CPU sont 27 et 23. A la deuxième seconde de leur compétition, les
processus d’avant-plan n’ont que 4 tranches horaires de plus que le processus
d’arrière-plan.
Même si le processus d’arrière-plan est lancé avec nice –20, la différence entre avant-plan
et arrière-plan est à peine plus marquée. Bien que le programmateur arrête de compter les
tranches horaire après 120, cela permet au niveau de pénalité CPU de s’arrêter à 60, ce qui
suffit largement pour compenser la différence maximale de 40 de valeur nice.
Pour assouplir le processus d’attribution des priorités, les nouvelles caractéristiques
permettent à l’utilisateur d’optimiser le rapport pénalité CPU/utilisation de CPU récente (R)
et le taux de décroissance du temps d’utilisation de CPU récente (D). Cette optimisation est
réalisée via deux nouvelles options de la commande schedtune : –r et –d. Chaque option
spécifie un paramètre (entier compris entre 0 et 32) qui multiplie l’utilisation de CPU récente
par la valeur du paramètre puis divise le résultat par 32 (en décalant de 5 à droite). Les
valeurs r et d par défaut sont 16, ce qui entraîne le même résultat que l’algorithme de
départ (D=R=16/32=0,5). Les nouvelles valeurs autorisent plus de latitude. Par exemple :
# schedtune –r 0
Contrôle et optimisation de la CPU
6-23
(R=0, D=0,5) signifie que la pénalité CPU est 0, ce qui rend la priorité absolue : aucun
processus d’arrière-plan ne peut obtenir de temps CPU tant qu’un processus d’avant-plan
en réclame. Les priorités des processus sont en effet constantes, même si, techniquement,
ce ne sont pas des processus à priorité fixe.
# schedtune –r 5
(R=0,15625, D=0,5) signifie que des processus d’avant-plan n’entreront jamais en
compétition avec un processus d’arrière-plan lancé via nice –20. La limite de 120 tranches
de temps CPU accumulées signifie que la pénalité maximum pour les processus
d’avant-plan est fixée à 18.
# schedtune –r 6 –d 16
(R=0,1875, D=0,5) signifie qu’un processus d’arrière-plan lancé via nice –20, le sera au
moins une seconde avant que le processus d’arrière-plan ne reçoive du temps CPU.
Cependant, les processus d’avant-plan peuvent toujours être distingués sur la base de
l’utilisation de CPU. Les processus d’avant-plan longs qui doivent normalement se trouver
en arrière-plan finissent par accumuler suffisamment d’utilisation de CPU pour les
empêcher d’interférer avec l’avant-plan réel.
# schedtune –r 32 –d 32
(R=1, D=1) signifie que les processus longs atteignent une valeur C égale à 120 et la
conservent, en opposition avec leur valeur nice. Les nouveaux processus ont la priorité
quelle que soit leur valeur nice, jusqu’à ce qu’ils aient accumulé suffisamment de tranches
horaires pour passer dans la gamme de priorités des processus existants.
Si vous estimez qu’un ou deux paramètres doivent être modifiés pour s’adapter à la charge
de travail, entrez la commande schedtune, en tant qu’utilisateur root. Les valeurs
modifiées seront conservées jusqu’à la prochaine commande schedtune ou jusqu’au
réamorçage suivant du système. Vous pouvez rétablir les valeurs par défaut via
schedtune –D, mais n’oubliez pas qu’alors tous les paramètres schedtune sont
réinitialisés par cette commande, y compris les paramètres de contrôle de charge
mémoire VMM. Pour faire perdurer une modification au fil des réamorçages, ajoutez la ligne
appropriée à la fin du fichier /etc/inittab.
6-24
AIX 4.3 Guide d’optimisation
Modification de la tranche horaire du programmateur
Vous pouvez modifier la durée de la tranche horaire du programmateur via la commande
schedtune (voir page A-6). La syntaxe de cette fonction est la suivante :
schedtune –t increase
increase est le nombre d’impulsions d’horloge de 10 ms à ajouter à la tranche horaire
standard (un battement de 10 ms). Par exemple, schedtune –t 2 fait passer la durée de la
tranche horaire à 30 ms. schedtune –t 0 lui réaffecte sa valeur par défaut.
Dans un environnement où la tranche horaire a été augmentée, certaines applications n’ont
pas besoin d’utiliser la totalité de la tranche horaire. Ces applications peuvent renoncer
explicitement au processeur via l’appel système yield (comme peuvent le faire les
programmes dans un environnement non modifié). Après un appel yield, la routine qui émet
l’appel est déplacée à la fin de la file d’attente de répartition en fonction de son niveau de
priorité.
Contrôle et optimisation de la CPU
6-25
Administration des ID utilisateur
Pour optimiser le temps de réponse de la connexion et conserver du temps CPU dans un
système multiutilisateur, AIX peut exploiter une version à accès direct du fichier
/etc/passwd pour consulter les ID utilisateur. Lorsque cette fonction est utilisée, le fichier
/etc/passwd existe toujours mais n’est pas employé dans le traitement courant.
Les versions à accès direct du fichier (/etc/passwd.dir et /etc/passwd.pag) sont créées via
la commande mkpasswd. Si ces versions à accès direct ne sont pas actives, le processus
de connexion revient à une recherche séquentielle lente, utilisant la CPU de façon intensive
via /etc/passwd.
Lorsque les fichiers de mot de passe à accès direct ont été créés, et que les commandes
passwd, mkuser, chuser et rmuser (ou leurs équivalents smit) sont exploitées pour
administrer les ID utilisateur, les fichiers à accès direct sont mis à jour automatiquement.
Si le fichier /etc/passwd est modifié via un éditeur ou la commande pwdadm, les fichiers à
accès direct doivent être reconstruits via la commande suivante :
# mkpasswd /etc/passwd
6-26
AIX 4.3 Guide d’optimisation
Chapitre 7. Contrôle et optimisation de la mémoire
La mémoire d’un ESCALA est presque toujours pleine. Si les programmes en cours ne
l’occupent pas intégralement, AIX y conserve les pages de texte de programmes antérieurs
et des fichiers associés. Ceci ne coûte rien, puisque la mémoire est de toutes façons
inutilisée. Souvent, par contre, les pages de fichier ou de programme sont réutilisées, ce qui
réduit les E/S disque.
Cette technique de mise en mémoire cache améliore l’efficacité du système mais rend plus
difficile l’évaluation des besoins mémoire réels d’une charge de travail.
Ce chapitre décrit comment mesurer et modifier la quantité de mémoire utilisée. Elle
comporte les sections suivantes :
• ”Quantité de mémoire utilisée” répertorie les commandes relatives à l’exploitation de la
mémoire et traite de leurs avantages et inconvénients.
• ”Programme à perte de mémoire” décrit l’une des causes les plus courantes de
surcharge de mémoire.
• ”Analyse de l’exploitation de la mémoire via BigFoot” décrit les caractéristiques et le
fonctionnement de l’outil BigFoot, qui rend compte des schémas d’utilisation de la
mémoire.
• ”Estimation de la mémoire requise via rmss” illustre les techniques d’utilisation de l’outil
Reduced-Memory System Simulator.
• ”Optimisation du contrôle de la charge mémoire VMM” décrit les situations dans
lesquelles cette optimisation est nécessaire et les méthodes d’optimisation via la
commande schedtune.
• ”Optimisation du remplacement de page VMM” détaille les méthodes et les effets de la
modification des paliers de remplacement de page VMM.
Les lecteurs qui ne seraient pas familiarisés avec la gestion de la mémoire virtuelle d’AIX
peuvent se reporter à ”Performance du gestionnaire de mémoire virtuelle (VMM)”, page 2-5
avant de poursuivre.
Contrôle et optimisation de la mémoire
7-1
Quantité de mémoire utilisée
Plusieurs outils rendent compte de l’utilisation de la mémoire. Les relevés les plus
intéressants sont ceux établis via vmstat, ps et svmon.
vmstat
vmstat rend compte de la mémoire virtuelle ”active” totale exploitée par tous les processus
du système ainsi que le nombre de trames de page en mémoire réelle dans la liste des
disponibilités. La mémoire virtuelle active est définie comme le nombre de pages de
segments actifs en mémoire virtuelle qui ont été exploitées. Elle est généralement égale au
nombre d’emplacements d’espace de pagination déjà affectés. Ce nombre peut être
supérieur au nombre de trames de page réelles de la machine, dans la mesure où certaines
pages de la mémoire virtuelle active peuvent avoir été évacuées vers l’espace de
pagination.
ps
ps fournit des comptes rendus différents en fonction de l’indicateur spécifié. Le plus complet
est issu de ps v, qui affiche les colonnes suivantes :
SIZE
Taille virtuelle en kilo-octets de la section de données du processus. (affiché
comme SZ par les autres indicateurs). Ce chiffre est égal à la quantité de
pages de segment de travail des processus en cause (le nombre
d’emplacements d’espaces de pagination affectés) multiplié par 4. Si
certaines pages de segment de travail sont évacuées, ce chiffre est
supérieur à la quantité de mémoire réelle utilisée.
RSS
Taille de la mémoire réelle du processus (jeu résidant) en kilo-octets. Ce
chiffre est égal à la somme de segments de travail et des pages de
segments de code en mémoire multipliée par 4. Les pages de segment de
codes sont partagées entre toutes les instances en cours du programme. Si
26 processus ksh sont en cours, une seule copie d’une page donnée de
l’exécutable ksh réside en mémoire, mais ps intègre la taille de ce segment
de code dans le RSS de chaque instance de ksh.
TSIZ
Taille de l’image texte (programme partagé). Taille de la section de texte du
fichier exécutable. Les pages de texte de l’exécutable ne sont chargées en
mémoire que lorsqu’elles sont utilisées (branchement ou chargement). Ce
chiffre ne représente que la limite supérieure de la quantité de texte qui peut
être chargée.
TRS
Taille de l’ensemble de texte résidant (en mémoire réelle). Elle est égale au
nombre de pages de segment de codes multiplié par 4. Comme indiqué plus
haut, ce chiffre surestime l’utilisation de la mémoire pour les programmes
dont plusieurs instances sont en cours.
%MEM
Somme du nombre de segments de travail et de pages de segments de
code en mémoire multipliée par 4 (c’est-à-dire la valeur RSS), divisée par la
taille de la mémoire réelle de la machine en ko, multipliée par 100, et
arrondie. Cette valeur est une estimation du pourcentage de mémoire réelle
utilisée par le processus. Malheureusement, comme RSS, le coût d’un
processus partageant un programme avec d’autres y est souvent surévalué.
De plus, ce pourcentage étant arrondi, tous les processus du système ayant
une valeur RSS inférieure à 0,005 fois la taille de la mémoire réelle ont une
valeur %MEM égale à 0.
Il ressort clairement qu’établir des statistiques relatives à la mémoire dans un format conçu
pour des systèmes antérieurs, plus simples, aboutit à des données faussées.
7-2
AIX 4.3 Guide d’optimisation
svmon
svmon fournit des comptes rendus de l’utilisation de la mémoire au niveau du processus
global et au niveau du segment. –G et –P sont les options les plus intéressantes pour
l’optimisation.
–G
Rend compte de l’utilisation de la mémoire pour le système entier.
–P
Rend compte de l’utilisation de la mémoire pour un ou plusieurs
processus.
Sous AIX version 4.1, la commande svmon est intégrée à la boîte à outils PTX
(Performance Toolbox for AIX). Pour savoir si svmon est disponible, entrez :
lslpp –lI perfagent.tools
Si ce module est installé, svmon est disponible.
Exemples de sortie vmstat, ps et svmon
L’exemple suivant illustre la sortie de ces commandes sur un grand système. vmstat a été
exécuté dans une fenêtre séparée, et ps et svmon successivement. La (première) ligne du
relevé vmstat a été supprimée :
$ vmstat 5
procs
memory
page
faults
cpu
––––– ––––––––––– –––––––––––––––––––––––– –––––––––––– –––––––––––
r b
avm
fre re pi po fr
sr cy in
sy cs us sy id wa
0 0 25270 2691
0
0
0
0
0
0 142 2012 41 4 11 86 0
1 0 25244 2722
0
0
0
0
0
0 138 6752 39 20 70 10 0
0 0 25244 2722
0
0
0
0
0
0 128
61 34 0 1 99 0
0 0 25244 2722
0
0
0
0
0
0 137 163 41 1 4 95 0
Le compte rendu global svmon ci-dessous indique les chiffres correspondants. Le nombre
présenté par vmstat comme mémoire virtuelle active( avm) est reporté par svmon comme
emplacements d’espace de pagination en cours d’utilisation (25270). Le nombre de trames
de page de la liste des disponibilités (2691) est identique dans les deux comptes rendus.
Le nombre de pages fixes (2157) fait l’objet d’un compte-rendu séparé car les pages fixes
sont comptées dans les pages en cours d’utilisation.
$ svmon –G
m e m o r y
size inuse free
24576 21885 2691
pin
2157
i n
work
13172
u s e
pers clnt
7899
814
p i n
work pers
2157
0
p g s p a c e
clnt
size inuse
0 40960 25270
Pour faire ressortir un processus donné, long, sur cette machine, nous pouvons comparer
les comptes rendus ps v et svmon –P. Le programme réel a été renommé anon.
$ ps v 35851
PID TTY STAT
35851
– S
TIME PGIN
0:03 494
SIZE
1192
RSS
2696
LIM
xx
TSIZ
1147
TRS %CPU %MEM COMMAND
1380 0.2 3.0
anon
La valeur de SIZE (1192) est le nombre de Pgspace de svmon (298) multiplié par quatre.
RSS (2696) est égal à la somme du nombre de pages du segment privé du processus (329)
et du nombre de pages du segment du code (345) multipliée par quatre. TSIZE n’est pas lié
à l’utilisation de la mémoire réelle. TRS (1380) est égal au nombre de pages utilisées dans
le segment du code (345) multiplié par quatre. %MEM est égal à la valeur RSS divisée par
la taille de la mémoire réelle en ko, multipliée par 100 et arrondie.
$ svmon –P 35851
Pid
Command
35851
anon
Pid: 35851
Command: anon
Segid Type Description
Inuse
18a3 pers /dev/hd2:5150
1
9873 pers /dev/hd2:66256
1
4809 work shared library
1734
748e work private
329
2105 pers code,/dev/hd2:4492 345
Inuse
2410
Pin
0
0
0
2
0
Pgspace
0
0
4326
298
0
Pin
2
Pgspace
4624
Address Range
0..0
0..0
0..4668 : 60123..65535
0..423 : 65402..65535
0..402
Contrôle et optimisation de la mémoire
7-3
Au fur et à mesure de l’analyse des différents processus de cet environnement, nous
observons que la bibliothèque partagée l’est par presque tous les processus du système, et
que ses besoins en mémoire font partie de la charge système. La mémoire du
segment 9873, également très sollicitée, peut y être incluse. Pour estimer les besoins en
mémoire du programme anon, la formule serait la suivante :
La mémoire requise pour anon est égale à 345 * 4 ko pour le texte programme (partagé par
tous les utilisateurs), plus nombre estimé d’utilisateurs simultanés de anon multiplié par la
somme de la taille du segment de travail (329 * 4 ko) et de 4 ko pour le segment mappé
(ID segment 18a3 dans cet exemple).
Programmes à perte de mémoire
Une perte de mémoire est un bogue logiciel qui fait qu’un programme affecte de la mémoire
à plusieurs reprises, l’utilise puis oublie de la libérer. S’il s’agit d’un programme long
(une application interactive, par exemple), le problème peut être sérieux car la mémoire
risque d’être fragmentée, et des pages remplies d’informations parasites risquent de
s’accumuler en mémoire réelle et en espace de pagination. Il s’est déjà produit que des
programmes manquent d’espace de pagination à cause d’une perte de mémoire dans un
seul programme.
svmon détecte les pertes de mémoire en recherchant les processus qui contiennent des
segments de travail en augmentation continuelle. Il est plus difficile, en particulier pour les
applications AIXwindows, d’identifier les sous-routines ou les lignes de codes qui génèrent
un grand nombre d’appels malloc et free. Il existe des programmes de fournisseurs tiers
pour analyser les pertes de mémoire, mais ils nécessitent l’accès au code source du
programme.
Certaines utilisations de realloc peuvent produire le même effet qu’une perte de mémoire.
Si un programme exploite fréquemment realloc pour augmenter la taille d’une zone de
données, le segment de travail d’un processus peut devenir de plus en plus fragmenté si la
mémoire libérée par realloc ne peut pas être réutilisée. (L’annexe F, ”Gestion de la
mémoire des applications” contient des informations sur malloc et realloc.)
Généralement, la mémoire devenue inutile doit être libérée via free, si la mémoire doit être
réutilisée par le programme. D’un autre côté, c’est une perte de temps CPU que de libérer
(free) de la mémoire après le dernier malloc. Lorsque l’exécution du programme est
terminée, son segment de travail est détruit et les trames de pages de mémoire réelle qui
contiennent les données du segment de travail, ajoutées à la liste des disponibilités.
Voir aussi
Commandes vmstat, ps et svmon.
7-4
AIX 4.3 Guide d’optimisation
Analyse de l’exploitation de la mémoire via BigFoot
Remarque : Cette section ne concerne que les versions 4.1 et ultérieures d’AIX.
BigFoot fait partie de Performance Toolbox for AIX. Pour savoir s’il est disponible, entrez :
lslpp –lI perfagent.tools
Si ce module est installé, BigFoot est disponible.
BigFoot recueille les informations relatives à l’espace occupé en mémoire par un
programme en cours. Il établit un compte rendu sur les pages de mémoire virtuelle
touchées par le processus. BigFoot est constitué de deux commandes :
bf
collecte des informations sur les pages touchées au cours de
l’exécution d’un programme. Il génère des données complètes sur
l’exploitation dans le fichier __bfrpt.
bfrpt
filtre le fichier __bfrpt pour extraire les références mémoire créées par
un processus donné.
Contrôle et optimisation de la mémoire
7-5
Estimation de la mémoire requise via rmss
rmss (Reduced-Memory System Simulator) permet de simuler les ESCALA avec des tailles
de mémoire inférieures à celles de la machine, sans déposer ni reposer de cartes mémoire.
De plus, rmss permet d’exploiter une application avec différentes tailles de mémoire, en
affichant, pour chaque taille, des statistiques de performance sur, par exemple, le temps de
réponse de l’application et la quantité de pagination. En bref, rmss est conçu pour répondre
à la question : ”Combien de méga-octets de mémoire réelle requiert un ESCALA pour
exploiter AIX et une application donnée avec un niveau de performance acceptable ?” ou,
dans un contexte multi-utilisateur, ”Combien d’utilisateurs peuvent exploiter simultanément
cette application sur un système disposant de X mégaoctets de mémoire réelle ?”
Sous AIX version 4.1, la commande rmss est intégrée à la boîte à outils PTX (Performance
Toolbox for AIX). Pour savoir si rmss est disponible, entrez :
lslpp –lI perfagent.tools
Si ce module est installé, rmss est disponible.
Il est important de ne pas oublier que la taille mémoire simulée par rmss est la taille globale
de la mémoire réelle de la machine, dont la mémoire utilisée par AIX et les autres
programmes en cours. Il ne s’agit pas de la quantité de mémoire utilisée spécifiquement par
l’application elle-même. Compte tenu des dégradations de performances qu’elle peut
provoquer, rmss est exclusivement réservée à l’utilisateur root et aux membres du groupe
système. Les sections suivantes décrivent rmss plus en détail :
• ”Méthodes d’exploitation de rmss”
• ”Exploitation de rmss pour modifier la taille de la mémoire et quitter”
• ”Exploitation de rmss pour lancer une commande avec des tailles de mémoire
différentes”
• ”Règles d’exploitation de rmss”.
Méthodes d’exploitation de rmss
rmss peut être activé : (1) pour modifier la taille de la mémoire réelle et quitter ; (2) comme
programme pilote, pour exécuter une application avec différentes tailles de mémoire réelle
et afficher des statistiques sur les performances pour chaque taille. La première technique
donne des informations sur le comportement d’une application dans un système d’une
certaine taille, lorsque l’application est trop complexe pour être exprimée comme une
commande unique, ou lorsque vous souhaitez exploiter des instances multiples d’une
application. La seconde technique est appropriée lorsque l’application peut être activée
comme exécutable ou fichier script shell.
Remarque : Avant de lancer rmss, nous vous conseillons de lancer la commande
schedtune –h 0, page 7-14 pour désactiver le contrôle de charge mémoire VMM. Faute
de quoi, ce contrôle risque d’interférer avec vos mesures, sur des mémoires de petite
taille. A la fin des essais, restaurez les paramètres de contrôle de charge mémoire à leur
valeur antérieure (ou lancez schedtune –D pour revenir aux valeurs par défaut).
Exploitation de rmss pour modifier la taille de la mémoire et quitter
Pour modifier la taille de la mémoire et quitter, utilisez l’indicateur –c :
# rmss –c taille-mémoire
Par exemple pour faire passer la taille mémoire à 12 Mo, entrez :
# rmss –c 12
taille-mémoire est un nombre entier ou décimal de méga–octets (12,25, par exemple).
En outre, taille-mémoire doit être compris entre 4 Mo et la taille physique réelle de la
mémoire de votre machine. Selon la configuration matérielle et logicielle, il se peut que
rmss ne permette pas de réduire la taille mémoire à moins de 8 Mo, à cause de la taille de
7-6
AIX 4.3 Guide d’optimisation
la structure des systèmes inhérents tels que le noyau. Si une taille de mémoire donnée est
refusée par rmss, un message d’erreur est affiché.
rmss diminue la taille effective de la mémoire d’un ESCALA en volant des trames de page
disponibles dans la liste tenue par VMM. Ces trames, conservées dans un fond de trames
inutilisables, sont renvoyées dans la liste des disponibilités lorsque la taille de la mémoire
effective doit être augmentée. De plus, rmss ajuste dynamiquement certaines structures de
données et variables système qui doivent rester proportionnelles à la taille de la mémoire
effective.
La modification de la taille de la mémoire peut prendre jusqu’à 15 ou 20 secondes.
En général, plus la réduction souhaitée est importante, plus rmss prend de temps.
Lorsque rmss a abouti, le message suivant s’affiche :
Simulated memory size changed to 12,00 Mb.
Pour afficher la taille actuelle de la mémoire, utilisez l’indicateur –p :
# rmss –p
rmss répond par :
Simulated memory size is
12.00 Mb.
Si, finalement, vous souhaitez régler la taille de la mémoire sur celle de la mémoire actuelle
de la machine, utilisez l’indicateur –r :
# rmss –r
Quelle que soit la taille de la mémoire virtuelle actuelle, l’indicateur –r ramène la taille de la
mémoire à celle de la mémoire réelle physique de la machine. Dans cet exemple, où un
système de 16 Mo est exploité, rmss répond :
Simulated memory size changed to 16,00 Mb.
Remarque : La commande rmss indique la quantité de mémoire réelle utilisable. Sur les
machines dont la mémoire n’est pas fiable ou déjà utilisée, rmss indique la quantité de
mémoire réelle, c’est-à-dire la mémoire physique réelle moins la mémoire non fiable ou
déjà utilisée par le système. Par exemple, la commande rmss –r peut indiquer :
Simulated memory size changed to 79.9062 Mb.
Dans cet exemple, une partie de la mémoire est considérée comme non fiable ou est
réservée par un périphérique (et n’est donc pas disponible pour l’utilisateur).
Indicateurs –c, –p et –r
Les indicateurs –c, –p et –r de rmss permettent, contrairement à d’autres options,
d’exploiter des applications complexes qui ne peuvent être exprimées en un fichier
exécutable ou un script shell unique. Les indicateurs –c, –p et –r vous obligent, par contre,
à évaluer vous-même les performances. Il existe un moyen simple de le faire : vmstat –s
mesure l’activité au niveau de l’espace de pagination lors de l’exécution d’une application.
Si vous lancez vmstat –s, puis l’application, puis à nouveau vmstat –s, et calculez la
différence entre le nombre de transferts en mémoire d’espace de pagination ”avant” et
”après”, vous obtenez le nombre de transferts effectués pendant le programme. En outre,
en chronométrant le programme, puis en divisant le nombre de transferts par la durée
d’exécution du programme, vous obtenez le taux moyen de transferts de l’espace de
pagination.
Il est également important d’exécuter plusieurs fois l’application avec chaque taille mémoire.
Deux raisons : d’abord, lors de la modification de la taille de la mémoire, rmss vide une
grande quantité de mémoire. Ainsi, la première fois que l’application est lancée après
modification de la taille de la mémoire, il est possible qu’une partie importante du temps
d’exécution soit pris par la lecture des fichiers en mémoire réelle. Cependant, les fichiers
pouvant rester en mémoire après l’exécution de l’application, les temps d’exécution suivants
peuvent être plus courts. L’autre raison d’exécuter plusieurs fois l’application est d’avoir une
idée de ses performances moyennes avec une taille donnée de mémoire. Le ESCALA et
Contrôle et optimisation de la mémoire
7-7
AIX sont des systèmes complexes, et il est impossible de dupliquer l’état du système
chaque fois que votre application est exécutée. Ainsi, la performance d’une application peut
varier de façon significative d’une exécution à l’autre.
En résumé, vous devez tenir compte des étapes suivantes pour activer rmss :
s’il existe plusieurs tailles de mémoire à examiner :
{
changez la taille de la mémoire via rmss –c ;
lancez l’application une première fois ;
pour plusieurs exécutions :
{
lancez vmstat –s pour obtenir le nombre ”avant” de transferts
en mémoire d’espace de pagination ;
lancez et chronométrez l’application ;
lancez vmstat –s pour obtenir le nombre ”après” de transferts
en mémoire d’espace de pagination ;
soustrayez la valeur ”avant” de la valeur ”après” pour
obtenir le nombre de transferts en mémoire pendant
l’exécution ;
divisez le nombre de transferts en mémoire d’espace de pagination par
le temps de réponse
pour obtenir le taux de transferts en mémoire de l’espace
de pagination ;
}
}
lancez rmss –r pour restaurer la taille mémoire normale (ou réamorcez)
Le calcul du nombre d’E/S de pagination (après – avant) peut être automatisé via le script
vmstat.sh inclus dans le module PerfPMR.
Exploitation de rmss pour lancer une commande avec des tailles de mémoire
différentes
Les indicateurs –s, –f, –d, –n et –o sont exploités pour activer rmss comme programme
pilote : rmss exécute une application spécifiée avec des tailles de mémoire différentes et
affiche des statistiques sur ses performances pour chaque taille de mémoire. La syntaxe
pour ce type d’activation de rmss est la suivante :
rmss [ –s smemsize ] [ –f fmemsize ] [ –d memdelta ]
[ –n numiterations ] [ –o outputfile ] command
L’indicateur –n permet de spécifier le nombre d’exécutions et mesure le temps d’exécution
de la commande pour chaque taille de mémoire. –o spécifie le fichier dans lequel écrire le
compte rendu rmss ; command est l’application à lancer et à chronométrer pour chaque
taille de mémoire. Ces indicateurs sont détaillés plus loin.
Les indicateurs –s, –f et –d permettent de spécifier les différentes tailles de mémoire : –s la
taille de départ, –f la taille finale et –d la différence entre les tailles. Toutes ces valeurs sont
des nombres entiers ou décimaux, en méga–octets. Par exemple, pour lancer et mesurer
une commande avec 24, 20, 16, 12 et 8 Mo, utilisez la combinaison suivante :
–s 24 –f 8 –d 4
De même, pour les tailles 16, 24, 32, 40 et 48 Mo, la combinaison est la suivante :
–s 16 –f 48 –d 8
Si vous omettez l’indicateur –s, rmss démarre avec la taille mémoire actuelle de la
machine. Si vous omettez l’indicateur –f, rmss s’arrête à 8 Mo. Si vous omettez
l’indicateur –d, la valeur par défaut (8 Mo) est appliquée.
Quelles sont les valeurs possibles pour –s, –f et –d ? Le plus simple consiste à choisir les
tailles mémoire des ESCALA censés faire tourner l’application concernée. Cependant, une
incrémentation inférieure à 8 Mo peut être utile, car elle vous donne une idée de la marge
de manœuvre dont vous disposez lorsque vous fixez votre choix sur une taille.
Par exemple, si une application donnée s’emballe à 8 Mo mais fonctionne sans transferts
7-8
AIX 4.3 Guide d’optimisation
de pagination à 16 Mo, il est intéressant de savoir à quelle taille, entre 8 et 16 Mo,
l’application commence à s’emballer. Si elle démarre à 15 Mo, vous pouvez configurer le
système avec plus de 16 Mo de mémoire, ou modifier l’application de sorte que la marge de
manœuvre soit plus importante. Mais, si elle démarre à 9 Mo, vous savez que vous
disposez d’une marge suffisante avec une machine à 16 Mo.
L’indicateur –n spécifie le nombre d’exécutions et de mesures d’une commande pour
chaque taille de mémoire. Après avoir lancé et mesuré l’application autant de fois que
spécifié, rmss affiche des statistiques sur les performances moyennes de l’application pour
une taille donnée. Pour lancer la commande 3 fois pour chaque taille de mémoire, entrez :
–n 3
Si –n est omis, rmss détermine au cours de l’initialisation le nombre de fois où l’application
doit être exécutée pour accumuler un temps d’exécution total de 10 secondes.
rmss effectue cette opération pour assurer que les statistiques relatives aux performances
des programmes courts ne seront pas faussées par des éléments externes (démons, par
exemple).
Remarque : Si vous mesurez un programme très bref, le nombre d’exécutions
nécessaires pour accumuler 10 secondes de temps CPU peut être très important.
Chaque exécution du programme mobilisant environ, et au moins, 2 secondes de charge
rmss, il est préférable de spécifier explicitement le paramètre –n pour les programmes
courts.
Quelles sont les valeurs recommandées pour –n ? Si vous savez que l’application s’exécute
en plus de 10 secondes, vous pouvez spécifier –n 1 pour que la commande ne soit
exécutée et mesurée qu’une seule fois pour chaque taille mémoire. Il est intéressant
d’utiliser l’indicateur –n car, au cours de l’initialisation, rmss n’a pas à déterminer le nombre
d’exécutions du programme. Ceci est encore plus intéressant lorsque les commandes à
mesurer sont longues et interactives.
Il ne faut pas oublier que rmss exécute toujours la commande une première fois pour
chaque taille mémoire, à titre de mise en route, avant de la lancer et de la mesurer.
Ceci pour éviter les E/S qui se produisent normalement lorsque l’application ne se trouve
pas déjà en mémoire. Bien que de telles E/S affectent les performances, cela n’est pas
forcément dû à un manque de mémoire réelle. La mise en route n’est pas comptée dans le
nombre spécifié par l’indicateur –n.
L’indicateur –o permet de spécifier un fichier dans lequel écrire le rapport rmss. Si
l’indicateur –o est omis, le rapport est écrit dans le fichier rmss.out.
command spécifie l’application à mesurer : command est un exécutable ou un script shell,
avec ou sans arguments sur la ligne de commande. Il existe toutefois quelques contraintes
sur la forme de cette commande. Elle ne doit pas contenir de réacheminement de l’entrée
ou de la sortie (foo > output, foo < input, par exemple). Ceci parce que rmss
considère tout ce qui se trouve à droite du nom de la commande comme des arguments de
cette commande. Pour effectuer un réacheminement, vous devez placer la commande dans
un fichier script shell.
Normalement, pour enregistrer la sortie de rmss dans un fichier spécifique, vous utilisez
l’option –o. Pour réacheminer, par exemple, la sortie stdout de rmss (pour l’insérer, par
exemple, à la fin d’un fichier existant), vous devez, avec le shell Korn, mettre l’appel de
rmss entre parenthèses, comme suit :
# (rmss –s 24 –f 8 foo) >> sortie
Interprétation des résultats de rmss
Cette section propose quelques interprétations des statistiques de performance produites
par rmss. Commençons par quelques résultats typiques.
L’exemple ”Compte rendu généré pour le programme foo”, page 7-10 a été généré en
lançant rmss sur un programme réel, dont le nom été simplement modifié en foo pour
Contrôle et optimisation de la mémoire
7-9
préserver l’anonymat. La commande normale pour générer ce compte-rendu est la
suivante :
# rmss –s 16 –f 8 –d 1 –n 1 –o rmss.out foo
Compte rendu généré pour le programme foo
Hostname: widgeon.austin.ibm.com
Real memory size:
16,00 Mb
Time of day: Thu Jan 8 19:04:04 1990
Command: foo
Simulated memory size initialized to
16,00 Mb.
Number of iterations per memory size = 1 warm–up + 1 measured = 2.
Memory size
Avg. Pageins Avg. Response Time Avg. Pagein Rate
(megabytes)
(sec.)
(pageins / sec.)
–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
16.00
115.0
123.9
0.9
15.00
112.0
125.1
0.9
14.00
179.0
126.2
1.4
13.00
81.0
125.7
0.6
12.00
403.0
132.0
3.1
11.00
855.0
141.5
6.0
10.00
1161.0
146.8
7.9
9.00
1529.0
161.3
9.5
8.00
2931.0
202.5
14.5
Ce compte rendu comporte quatre colonnes : la première indique la taille de la mémoire, et
la colonne Avg. Pageins le nombre moyen de transferts en mémoire au cours de
l’exécution de l’application avec cette taille de mémoire. Il est important de noter que Avg.
Pageins fait référence à toutes les opérations de transfert en mémoire, y compris le code,
les données et les fichiers lus à partir de tous les programmes, qui se sont déroulées en
même temps que l’application. La colonne Avg. Response Time indique la durée
moyenne d’exécution de l’application, tandis que Avg. Pagein Rate indique le taux
moyen de transferts de pages.
Etudions d’abord la colonne Avg. Pagein Rate. Entre 16 et 13 Mo, le taux de transfert
est assez réduit (< 1,5 transfert/s). Entre 13 et 8 Mo, ce taux augmente, d’abord
graduellement, puis plus rapidement lorsque l’on s’approche de 8 Mo. La colonne Avg.
Response Time a la même structure : relativement bas au départ, puis de plus en plus
important au fur et à mesure que la taille de la mémoire tend vers 8 Mo.
Ici, le taux de transfert en mémoire décroît avec le passage de la taille de la mémoire de
14 Mo (1,4 transfert/s) à 13 Mo (0,6 transfert/s). Il n’y a pas de quoi s’alarmer : il est
impossible d’obtenir des résultats uniformes avec un système réel. L’essentiel est que le
taux de transfert en mémoire reste relativement bas pour une mémoire de 14 Mo et de
13 Mo.
Nous pouvons déduire quelques remarques de ce compte rendu. Si la performance d’une
application est jugée inacceptable à 8 Mo (ce qui est probable), le fait d’ajouter de la
mémoire améliore cette performance de façon significative. Le temps de réponse varie
entre 124 secondes pour 16 Mo et 202 secondes pour 8 Mo, ce qui constitue une
augmentation de 63 %. D’un autre côté, si la performance est jugée inacceptable à 16 Mo,
l’ajout de mémoire ne l’améliore pas beaucoup car, à cette taille, les transferts en mémoire
ne ralentissent pas le programme de façon significative.
Exemples d’exploitation des indicateurs –s, –f, –d, –n et –o
Pour connaître les performances du script shell ccfoo qui comprend la commande
cc –O –c foo.c avec 16, 14, 12, 10, 8 et 6 Mo de mémoire, lancer et mesurer la
commande deux fois pour chaque taille de mémoire, puis écrire le compte rendu dans le
fichier cc.rmss.out, entrez :
7-10
AIX 4.3 Guide d’optimisation
# rmss –s 16 –f 6 –d 2 –n 2 –o cc.rmss.out ccfoo
Compte rendu pour cc
La sortie de ce compte rendu est la suivante :
Hostname: terran
Real memory size:
32,00 Mb
Time of day: Mon Apr 20 16:23:03 1992
Command: ccfoo
Simulated memory size initialized to
16,00 Mb.
Number of iterations per memory size = 1 warm–up + 2 measured = 3.
Memory size
Avg. Pageins
Avg. Response Time
Avg. Pagein Rate
(megabytes)
(sec.)
(pageins / sec.)
––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
16.00
0.0
0.4
0.0
14.00
0.0
0.4
0.0
12.00
0.0
0.4
0.0
10.00
0.0
0.4
0.0
8.00
0.5
0.4
1.2
6.00
786.0
13.5
58.4
Simulated final memory size.
Ce compte rendu montre que la modification est insuffisante. Les performances se
dégradent avec une machine de 6 Mo, mais restent sensiblement les mêmes pour les tailles
supérieures. Nous pouvons réaliser une nouvelle mesure avec une fourchette de tailles de
mémoire moins importante et un delta inférieur comme suit :
rmss –s 11 –f 5 –d 1 –n 2 ccfoo
Cela nous donne une image plus précise de la courbe du temps de réponse du compilateur
pour ce programme :
Hostname: terran
Real memory size:
32,00 Mb
Time of day: Mon Apr 20 16:11:38 1992
Command: ccfoo
Simulated memory size initialized to
11,00 Mb.
Number of iterations per memory size = 1 warm–up + 2 measured = 3.
Memory size
Avg. Pageins
Avg. Response Time
Avg. Pagein Rate
(megabytes)
(sec.)
(pageins / sec.)
––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
11.00
0.0
0.4
0.0
10.00
0.0
0.4
0.0
9.00
0.5
0.4
1.1
8.00
0.0
0.4
0.0
7.00
207.0
3.7
56.1
6.00
898.0
16.1
55.9
5.00
1038.0
19.5
53.1
Simulated final memory size.
Contrôle et optimisation de la mémoire
7-11
Compte rendu pour une copie distante de 16 Mo
L’exemple suivant présente un compte rendu généré (sur une machine client) en lançant
rmss sur une commande qui copie un fichier de 16 Mo depuis une machine distante
(un serveur) via NFS.
Hostname: xray.austin.ibm.com
Real memory size:
48.00 Mb
Time of day: Mon Aug 13 18:16:42 1990
Command: cp /mnt/a16Mfile /dev/null
Simulated memory size initialized to
48.00 Mb.
Number of iterations per memory size = 1 warm–up + 4 measured = 5.
Memory size
Avg. Pageins
Avg. Response Time
Avg. Pagein Rate
(megabytes)
(sec.)
(pageins / sec.)
–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
48.00
0.0
2.7
0.0
40.00
0.0
2.7
0.0
32.00
0.0
2.7
0.0
24.00
1520.8
26.9
56.6
16.00
4104.2
67.5
60.8
8.00
4106.8
66.9
61.4
Remarquez que le temps de réponse et le taux de transfert en mémoire de ce compte
rendu démarrent avec une valeur assez basse, augmentent rapidement jusqu’à 24 Mo de
mémoire avant d’atteindre un palier à 16 et 8 Mo. Ce compte rendu illustre l’importance du
choix d’une fourchette de mémoire assez large lors de l’exploitation de rmss. Si l’utilisateur
n’avait considéré que les tailles de mémoire entre 24 et 8 Mo, il n’aurait pas eu l’opportunité
d’affecter suffisamment de mémoire pour que l’application fonctionne sans transfert en
mémoire.
Compte rendu de find / –ls >/dev/null
L’exemple suivant est un compte rendu généré en lançant rmss sur le script shell
findbench.sh, comportant la commande find / –ls > /dev/null, qui effectue un ls
de chaque fichier du système. La commande à l’origine du compte rendu est la suivante :
# rmss –s 48 –d 8 –f 4.5 –n 1 –o find.out findbench.sh
La taille de la mémoire finale (4,5 Mo) a été choisie car c’est la plus petite taille mémoire
accessible via rmss sur cette machine.
Hostname: xray.austin.ibm.com
Real memory size:
48.00 Mb
Time of day: Mon Aug 13 14:38:23 1990
Command: findbench.sh
Simulated memory size initialized to
48.00 Mb.
Number of iterations per memory size = 1 warm–up + 1 measured = 2.
Memory size
Avg. Pageins
Avg. Response Time
Avg. Pagein Rate
(megabytes)
(sec.)
(pageins / sec.)
––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
48.00
373.0
25.5
14.6
40.00
377.0
27.3
13.8
32.00
376.0
27.5
13.7
24.00
370.0
27.6
13.4
16.00
376.0
27.3
13.8
8.00
370.0
27.1
13.6
4.50
1329.0
57.6
23.1
Comme dans le premier exemple, les temps de réponse moyens et les valeurs du taux de
transfert en mémoire restent presque stables avec la diminution de la taille de la mémoire
jusqu’à 4,5 Mo, seuil à partir duquel les deux paramètres augmentent énormément.
Cependant, le taux de transfert en mémoire est relativement élevé (presque 14 transferts/s)
à partir de 48 Mo et jusqu’à 8 Mo. La conclusion est que, avec certaines applications,
aucune taille de mémoire n’est dans la pratique suffisante pour éliminer les transferts en
7-12
AIX 4.3 Guide d’optimisation
mémoire, car les programmes sont eux–mêmes très consommateurs d’E/S. Parmi les
programmes courants très consommateurs d’E/S, se trouvent les programmes qui balayent
ou accèdent en mode aléatoire à de nombreuses pages de fichier très volumineux.
Conseils d’utilisation des indicateurs –s, –f, –d, –n et –o
L’une des fonctions utiles de rmss, exploité de cette façon, est qu’il peut être interrompu
(par la touche d’interruption, Ctrl–C, par défaut) sans détruire le compte rendu écrit dans
le fichier de sortie. Outre l’écriture du compte rendu dans le fichier sortie, rmss redéfinit la
taille de la mémoire à celle de la mémoire physique de la machine.
Vous pouvez lancer rmss en arrière-plan, même après vous être déconnecté, via la
commande nohup. Pour ce faire, faites précéder la commande rmss de nohup, et
terminez la commande par un perluète (&) :
# nohup rmss –s 48 –f 8 –o foo.out foo &
Règles d’exploitation de rmss
Quelle que soit la méthode utilisée pour activer rmss, il est important de recréer
l’environnement de l’utilisateur final aussi précisément que possible. Par exemple,
utilisez-vous le même modèle de CPU ? Le même modèle de disques ? Le même réseau ?
Les utilisateurs disposeront-ils de fichiers d’application montés depuis un nœud distant via
NFS ou d’un autre système de fichiers distribué ? Ce dernier point est particulièrement
important car les pages des fichiers distants ne sont pas traitées de la même façon par
VMM que celles des fichiers locaux.
De même, il est préférable d’éliminer toute activité système qui n’est pas liée à la
configuration souhaitée ou à l’application que vous souhaitez mesurer. Il convient, par
exemple, d’interdire à d’autres personnes de travailler sur la machine où rmss est actif,
sauf si elles traitent une partie de la charge de travail à mesurer.
Remaque : Il est impossible de lancer plusieurs appels simultanés de rmss.
Une fois toutes les exécutions rmss terminées, mieux vaut mettre le système hors tension
et le réamorcer. Cette opération supprime toutes les modifications effectuées par rmss sur
le système et restaure les paramètres habituels de contrôle de charge mémoire.
Contrôle et optimisation de la mémoire
7-13
Optimisation du contrôle de charge mémoire VMM
L’utilitaire de contrôle de charge de mémoire VMM, décrit page 2-8, permet d’éviter
l’emballement des systèmes surchargés, qui génère une paralysie continue et dans laquelle
les processus du système passent leur temps à se voler des trames de mémoire et à lire ou
écrire des pages sur l’unité de pagination.
Optimisation du contrôle de charge mémoire
Le contrôle de charge mémoire est conçu pour aplanir les pointes de charge peu fréquentes
qui aboutissent à l’emballement du système. Il n’a pas pour objet de pallier en permanence
les défaillances d’un système insuffisamment doté en RAM. Il s’agit de la sécurité du
réseau, ce n’est pas un trampoline. La seule solution à une insuffisance chronique,
persistante de RAM est d’ajouter de la RAM, et non de ”bricoler” – via le contrôle de charge
mémoire – des temps de réponse acceptables. Par contre, le contrôle de charge mémoire
doit vraiment être optimisé dans les cas où la quantité de RAM est supérieure aux valeurs
par défaut, c’est-à-dire dans les configurations où les valeurs par défaut sont trop
modérées.
Ne modifiez pas les paramètres du contrôle de charge mémoire sauf si la charge de travail
est importante et que les paramètres par défaut risquent de ne plus suffire.
Les paramètres par défaut d’origine du système sont toujours en vigueur sauf s’ils ont été
modifiés, alors que les paramètres modifiés ne perdurent pas après un réamorçage. Toutes
les activités d’optimisation du contrôle de charge mémoire doivent être effectuées par un
utilisateur root. L’administrateur système peut modifier des paramètres pour ”adapter”
l’algorithme à une charge de travail particulière ou les désactiver entièrement. C’est l’objet
de la commande schedtune. Le code source et objet de schedtune résident dans
/usr/samples/kernel.
Attention : schedtune réside dans le répertoire samples car il dépend étroitement de
l’implantation de VMM. Le code schedtune est propre à chaque version d’AIX : il a été
mis au point pour le VMM de cette version. L’exploitation d’une version de schedtune
sur une autre version peut aboutir à un incident du système d’exploitation. En outre, les
fonctions de schedtune peuvent varier d’une version à l’autre. Il est déconseillé d’utiliser
des scripts shell ou des entrées inittab comprenant schedtune sur une nouvelle version
sans consulter la documentation schedtune de cette nouvelle version. schedtune n’est
pas pris en charge sous SMIT, et toutes les combinaisons de paramètres n’ont pas été
testées.
schedtune –? affiche une brève description des indicateurs et des options. schedtune
sans indicateur affiche les paramètres courants, comme suit :
–h
SYS
6
THRASH
–p
–m
PROC MULTI
4
2
SUSP
–w
–e
WAIT GRACE
1
2
FORK
–f
TICKS
10
SCHED
–t
TIME_SLICE
0
(Les indicateurs –f et –t ne font pas partie du mécanisme de contrôle de charge mémoire.
Les renseignements les concernant se trouvent avec la description de la syntaxe de
schedtune. Il est également question de l’indicateur –t dans ”Modification de la tranche
horaire du programmateur”, page 6-25.) Après un essai d’optimisation, le contrôle de
charge mémoire peut être restauré à ses valeurs par défaut via schedtune –D.
Pour désactiver le contrôle de charge mémoire, affectez une valeur au paramètre telle que
les processus ne soient jamais interrompus. Ainsi, schedtune –h 0 affecte au seuil
d’emballement une valeur excessive : l’algorithme n’en détecte plus.
Dans certains cas, il est préférable de désactiver le contrôle de charge mémoire dès le
début. Par exemple, si vous exploitez un émulateur de terminal avec fonction de
dépassement de délai pour simuler une charge de travail multi-utilisateur, l’intervention d’un
contrôle de charge mémoire peut retarder suffisamment les réponses pour que le processus
7-14
AIX 4.3 Guide d’optimisation
soit tué par cette fonction. Si vous lancez rmss pour connaître les effets de la diminution
des tailles de mémoire, il est préférable de désactiver le contrôle de charge mémoire pour
éviter qu’il n’interfère avec vos mesures.
Si la désactivation du contrôle de charge mémoire augmente le nombre de situations
d’emballement (avec un temps de réaction amoindri), alors le contrôle de charge mémoire
joue un rôle actif de soutien dans le système. Dans ce cas, l’optimisation des paramètres de
contrôle de charge mémoire – ou l’ajout de mémoire RAM – peut améliorer les
performances.
La définition du niveau de multiprogrammation minimum, m, évite aux m processus d’être
suspendus. Supposons qu’un administrateur système sache qu’au moins dix processus
doivent toujours être résidants et actifs en RAM pour de bonnes performances, et
soupçonne le contrôle de charge mémoire de suspendre les processus de façon trop
brutale. Si schedtune –m 10 est lancé, le système ne suspendra jamais tant de processus
que moins de dix processus restent en compétition pour accéder à la mémoire.
Le paramètre m ne tient pas compte du noyau, des processus fixés en RAM par l’appel
système plock, des processus à priorité fixée à une valeur inférieure à 60 et à ceux en
attente d’événements. La valeur par défaut du système m=2 permet d’assurer que le noyau,
les processus fixés et deux processus utilisateurs feront toujours partie des processus en
compétition pour l’accès à la RAM.
La valeur m=2, adaptée aux configurations mono-utilisateur de bureau, est souvent
insuffisante pour les configurations multiutilisateurs plus importantes ou les serveurs
disposant de grandes quantités de RAM. Sur ces systèmes, affecter la valeur 4 ou 6 à m
peut améliorer les performances.
Lorsque vous avez déterminé le nombre de processus susceptibles de fonctionner sur le
système pendant les pics d’activité, ajoutez schedtune à la fin du fichier /etc/inittab, pour
vous assurer qu’il sera bien exécuté à chaque amorçage du système et que les paramètres
par défaut seront restaurés. Par exemple, la ligne /etc/inittab suivante fait passer le niveau
minimum de multiprogrammation à 4 sous AIX version 4.1 :
schedtune:2:wait:/usr/samples/kernel/schedtune –m 4
La ligne /etc/inittab correspondante sous la version 3.2.5 serait :
schedtune:2:wait:/usr/lpp/bos/samples/schedtune –m 4
N’oubliez pas que cette ligne ne doit pas être utilisée sur une autre version d’AIX sans
consultation préalable de la documentation.
Alors qu’il est possible de modifier les paramètres qui contrôlent le nombre d’interruptions
des processus et le critère de sélection des processus à interrompre, il est impossible de
prévoir avec précision l’effet de telles modifications sur une configuration et une charge de
travail particulières. Le choix des paramètres par défaut est délicat et requiert des outils de
mesure sophistiqués et une observation attentive des charges de travail récurrentes. Soyez
très prudent si vous envisagez d’ajuster des paramètres de contrôle de charge mémoire
autres que ceux détaillés ici.
Contrôle et optimisation de la mémoire
7-15
Optimisation du remplacement de page VMM
L’algorithme de gestion de la mémoire, détaillé page 2-5, tente de maintenir dans les limites
spécifiées la taille de la liste des disponibilités et le pourcentage de mémoire réelle occupée
par des pages de segment persistant. Ces limites peuvent être modifiées via la commande
vmtune, qui ne peut être lancée que par un utilisateur root.
Attention : vmtune réside dans le répertoire samples car il dépend étroitement de
l’implantation de VMM. Le code vmtune qui accompagne chaque version d’AIX a été
mis au point spécialement pour cette version de VMM. L’exploitation d’une version de
vmtune sur une autre version peut aboutir à un incident du système d’exploitation. En
outre, les fonctions de vmtune peuvent varier d’une version à l’autre. Il est déconseillé
de diffuser des scripts shell ou des entrées inittab comprenant vmtune dans une
nouvelle version sans vérifier dans la documentation vmtune de la nouvelle version que
les scripts conservent l’effet désiré.
Paramètres minfree et maxfree
Le but de la liste des disponibilités est de garder trace des trames de page de la mémoire
réelle libérées par la fin de l’exécution des processus et de les fournir immédiatement aux
demandeurs, sans les obliger à attendre le vol des pages ni la fin des E/S associées.
La limite minfree précise la taille de la liste des disponibilités en-deçà de laquelle doit
commencer le vol de pages pour réapprovisionner la liste. maxfree est la taille au-delà de
laquelle le vol prend fin.
L’optimisation de ces limites a les buts suivants :
• assurer à toute activité ayant des objectifs de temps de réponse critiques l’obtention des
trames de page nécessaires dans la liste des disponibilités ;
• éviter au système une surcharge d’E/S suite à des vols de pages prématurés pour
étendre la liste des disponibilités.
Si vous disposez d’une courte liste des programmes à exécuter rapidement, vous pouvez
déterminer leur besoin en mémoire via svmon (voir ”Quantité de mémoire utilisée”,
page 7-2), et affecter la plus grande taille à minfree. Cependant, cette technique risque
d’être trop modérée car toutes les pages utilisées par un processus ne sont pas acquises
en une seule rafale. En outre, vous pouvez passer à côté de demandes dynamiques issues
de programmes ne figurant pas dans la liste, mais qui peuvent diminuer la taille moyenne
de la liste des disponibilités lors de leur exécution.
vmstat est un outil moins précis mais plus complet pour déterminer la valeur appropriée de
minfree. Vous trouverez ci-après un exemple de sortie vmstat 1 obtenu lors d’une
compilation XLC sur un système autrement inactif. La première ligne a été conservée ;
notez qu’elle contient un résumé des mesures CPU ainsi que celles d’autres activités, mais
pas de statistiques sur la mémoire courante.
procs
memory
page
faults
––––– ––––––––––– –––––––––––––––––––––––– ––––––––––––
r b
avm
fre re pi po fr
sr cy in
sy cs
0 0 3085
118
0
0
0
0
0
0 115
2 19
0 0 3086
117
0
0
0
0
0
0 119 134 24
2 0 3141
55
2
0
6 24
98
0 175 223 60
0 1 3254
57
0
0
6 176 814
0 205 219 110
0 1 3342
59
0
0 42 104 249
0 163 314 57
1 0 3411
78
0
0 49 104 169
0 176 306 51
1 0 3528
160
1
0 10 216 487
0 143 387 54
1 0 3627
94
0
0
0 72 160
0 148 292 79
1 0 3444
327
0
0
0 64 102
0 132 150 41
1 0 3505
251
0
0
0
0
0
0 128 189 50
1 0 3550
206
0
0
0
0
0
0 124 150 22
1 0 3576
180
0
0
0
0
0
0 121 145 30
0 1 3654
100
0
0
0
0
0
0 124 145 28
1 0 3586
208
0
0
0 40
68
0 123 139 24
7-16
AIX 4.3 Guide d’optimisation
cpu
–––––––––––
us sy id wa
0 0 99 0
1 3 96 0
3 9 54 34
22 14 0 64
43 16 0 42
30 15 0 55
50 22 0 27
57 9 0 34
82 8 0 11
79 11 0 11
94 6 0 0
96 4 0 0
91 8 0 1
91 9 0 0
Le compilateur n’ayant pas été exécuté récemment, le code du compilateur lui–même doit
être chargé. Le compilateur acquiert environ 2 Mo en 6 secondes environ. Sur ce système
32 Mo, la valeur de maxfree est de 64 et celle de minfree de 56. Le compilateur amène
presque instantanément la taille de la liste des disponibilités en dessous de la valeur
minfree, et pendant quelques secondes une intense activité de vol de page est déployée.
Certains de ces vols requièrent l’écriture des pages de segment de travail modifiées dans
l’espace de pagination, comme indiqué dans la colonne po. Si ces vols occasionnent
l’écriture de pages de segments permanents modifiés, cette E/S n’apparaît pas dans le
compte rendu vmstat (sauf si vmstat doit reporter les E/S du/des volume(s) physique(s)
dans lesquels sont écrites les pages permanentes).
Le but de cet exemple n’est pas de vous inciter à définir minfree à 500 pour prendre en
charge des compilations importantes. Il indique seulement comment exploiter vmstat pour
identifier les situations dans lesquelles la liste des disponibilités doit être réapprovisionnée
lorsqu’un programme est en attente d’espace. Dans ce cas, la durée d’exécution du
compilateur a été allongée d’environ 2 secondes, car le nombre de trames de page
immédiatement disponibles était insuffisant. Si vous analysez la consommation en trames
de pages de votre programme, au cours de l’initialisation ou du traitement normal, vous
aurez rapidement une idée du nombre de trames de page requises pour que le programme
n’attende pas de mémoire.
Lors du choix de la taille de la liste des disponibilités pour la charge de travail interactive,
vous pouvez définir minfree via vmtune. maxfree doit être supérieur à minfree d’au
moins 8 (ou de la valeur de maxpgahead, si elle est supérieure). Si nous concluons de
l’exemple précédent que minfree doit être défini à 128, et que maxpgahead est défini à 16
pour améliorer les performances de l’accès séquentiel, nous devons lancer la commande
vmtune suivante – qui génère la sortie qui suit :
# /usr/lpp/bos/samples/vmtune –f 128 –F 144
minperm maxperm minpgahead maxpgahead minfree maxfree numperm
1392
5734
2
16
56
64
3106
number of memory frames = 8192
number of bad memory pages = 0
maxperm=70.0% of real memory
minperm=17.0% of real memory
minperm maxperm minpgahead maxpgahead minfree maxfree numperm
1392
5734
2
16
128
144
3106
number of memory frames = 8192
number of bad memory pages = 0
maxperm=70.0% of real memory
minperm=17.0% of real memory
Paramètres minperm et maxperm
AIX profite de la variation des besoins en mémoire réelle pour laisser en mémoire des
pages de fichiers déjà lues ou écrites. Ainsi, si des pages de fichier sont réclamées à
nouveau avant que leurs trames de page aient été réaffectées, une opération d’E/S est
évitée. (Même si une trame d’une page de fichier a été volée et placée dans la liste des
disponibilités, si cette page est réclamée avant que la trame ne soit effectivement utilisée à
autre chose, elle sera récupérée dans la liste des disponibilités.) Ces pages de fichier
peuvent appartenir à des systèmes de fichiers locaux ou distants (NFS, par exemple).
Le rapport trames utilisées pour les fichiers/trames utilisées pour les segments de calcul
(textes de travail ou programme) est plus ou moins contrôlé par minperm et maxperm.
Pour une charge de travail particulière, il peut être intéressant de privilégier l’absence d’E/S
de fichiers. Pour une autre charge, la conservation de segments de calcul en mémoire peut
primer. Pour analyser ce rapport dans un environnement non optimisé, lancez la commande
vmtune sans argument :
Contrôle et optimisation de la mémoire
7-17
# vmtune
minperm maxperm minpgahead maxpgahead minfree maxfree numperm
1433
5734
2
16
128
144
3497
number of memory frames = 8192
number of bad memory pages = 0
maxperm=70.0% of real memory
minperm=17.5% of real memory
Les valeurs par défaut sont calculées par l’algorithme suivant :
minperm (en pages) =
0,2
maxperm (en pages) =
0,8
((nombre de trames de mémoire) – 1024) *
((nombre de trames de mémoire) – 1024) *
La colonne numperm donne le nombre de pages de fichier en mémoire, 3497, soit 42,7 %
de mémoire réelle. Si la charge de travail exploite peu de fichiers récemment lus ou écrits, il
est possible de réduire la quantité de mémoire utilisée à cet effet. La commande :
# vmtune –p 15 –P 40
définit minperm à 15 % et maxperm à 40 % de mémoire réelle. Cela permet d’assurer que
VMM ne vole les trames des pages de fichier que lorsque le rapport pages de
fichier/mémoire totale dépasse 40 %. A l’inverse, si l’application renvoie fréquemment à un
jeu réduit de fichiers existants (spécialement si ces fichiers font partie d’un système de
fichiers monté NFS), il est possible d’affecter plus d’espace pour la mise en mémoire cache
locale des pages de fichier avec :
# vmtune –p 30 –P 60
Voir aussi
Commandes schedtune et vmtune.
7-18
AIX 4.3 Guide d’optimisation
Chapitre 8. Contrôle et optimisation des E/S disque
Ce chapitre traite des performances des unités de disques locales.
Si vous êtes peu familier des concepts AIX de groupe de volumes, de volumes logiques et
physiques, et de partitions physiques, reportez-vous à ”Gestion AIX du stockage sur disque
fixe” : présentation des performances, page 2-13.
Cette rubrique traite également des points suivants :
• ”Optimisation des lectures séquentielles anticipées”
• ”Régulation des E/S disque”
• ”Performances et répartition des volumes logiques”
• ”Performances et taille de fragment du système de fichiers”
• ”Performances et compression”
• ”Performances et E/S disque asynchrones”
• ”Performances et E/S disque brutes”
• ”Performances et sync/fsync”
• ”Modification du paramètre max_coalesce du pilote SCSI”
• ”Limites de la file d’attente de l’unité de disque et de la carte SCSI”
• ”Contrôle du nombre de pbufs système”
Cette section traite des points suivants :
• ”Préinstallation”
• ”Élaboration d’une base d’optimisation”
• ”Évaluation des performances disque après installation”
• ”Évaluation du placement physique des données sur disque”
• ”Réorganisation d’un groupe ou d’un volume logique”
• ”Réorganisation d’un système de fichiers”
• ”Performances et espaces de pagination”
• ”Mesure des E/S disque globales via vmstat”
• ”Analyse détaillée des E/S via filemon”
• ”Programmes à disque limité”
• ”Extension de la configuration”
Préinstallation
La configuration des systèmes de fichiers a un impact non négligeable sur l’ensemble des
performances du système et toute modification intervenant après l’installation prend
beaucoup de temps. Décider du nombre et du type des disques fixes ainsi que de la taille et
du placement des espaces de pagination et des volumes logiques sur ces disques est de ce
fait une opération critique de la préinstallation.
Pour des précisions sur la planification de la configuration des disques au moment de la
préinstallation, reportez-vous à ”Préinstallation du disque” page 4-24.
Contrôle et optimisation des E/S disque
8-1
Élaboration d’une base d’optimisation
Avant toute modification de la configuration disque ou toute optimisation des paramètres, il
est bon de définir une base de mesures, qui permette d’enregistrer la configuration et les
performances actuelles. Outre vos propres mesures, vous pouvez créer une base
exhaustive à l’aide du module PerfPMR. Reportez-vous à ”Contrôle avant modification”,
page 2-14.
Évaluation des performances disque après installation
Commencez l’évaluation en lançant iostat avec un paramètre intervalle, pendant une pointe
de charge ou l’exécution d’une application critique pour laquelle vous souhaitez minimiser
les délais d’E/S. Le script suivant exécute iostat à l’arrière–plan tandis qu’un cp appliqué
à un fichier volumineux est exécuté à l’avant–plan, de sorte qu’il y a quelques E/S à
mesurer:
$ iostat 5 3 >io.out &
$ cp big1 /dev/null
Ce qui génère les trois relevés suivants dans io.out:
tty:
tin
0.0
Disks:
hdisk0
hdisk1
hdisk2
cd0
tout
3.2
% tm_act
0.0
0.1
0.2
0.0
cpu:
% user
0.2
% sys
0.6
Kbps
0.3
0.1
0.8
0.0
tps
0.0
0.0
0.1
0.0
msps
% idle
98.9
Kb_read
29753
11971
91200
0
% iowait
0.3
Kb_wrtn
48076
26460
108355
0
Le premier, récapitulatif, indique l’équilibre (ou ici le déséquilibre) global des E/S sur chaque
disque. hdisk1 est quasi inutilisé alors que hdisk2 reçoit près de 63 % du total des E/S.
Le deuxième relevé indique l’intervalle de 5 secondes pendant lequel cp a été exécuté. Les
données doivent être étudiées avec attention. La durée d’exécution de ce cp a été d’environ
2,6 secondes. Ainsi, 2,5 secondes de haute activité d’E/S ont été ”compensées” par
2,5 secondes de temps inoccupé pour arriver aux 39,5 % iowait relevés. Un intervalle
plus court aurait permis de caractériser plus précisément la commande elle-même, mais cet
exemple illustre les précautions à prendre lors de l’examen de relevés indiquant des
moyennes d’activité.
8-2
AIX 4.3 Guide d’optimisation
Évaluation du placement physique des données sur disque
Si la charge de travail se révèle très dépendante des E/S, vous avez intérêt à examiner la
position physique des fichiers sur le disque pour décider s’il convient de les réorganiser.
Pour étudier l’emplacement des partitions du volume logique hd11 dans le volume physique
hdisk0, utilisez :
$ lslv –p hdisk0 hd11
lslv génère :
hdisk0:hd11:/home/op
USED USED USED USED
USED USED USED USED
USED
USED
USED
USED
USED
USED
USED
USED
USED
1–10
11–17
USED
USED
USED
USED
USED
USED
USED
USED
USED
USED
USED
USED
USED
USED
USED
USED
USED
18–27
28–34
USED
USED
USED
USED
USED
USED
USED
USED
USED
USED
USED
USED
USED
USED
USED
USED
35–44
45–50
USED
0052
USED
0053
USED
0054
USED
0055
USED
0056
USED
0057
USED
0058
USED
USED
USED
51–60
61–67
0059
0069
0060
0070
0061
0071
0062
0072
0063
0073
0064
0074
0065
0075
0066
0067
0068
68–77
78–84
Le mot USED signifie que la partition physique est utilisée par un volume logique autre que
hd11. Les chiffres indiquent la partition logique de hd11 affectée à cette partition physique.
Pour consulter le reste de hd11 sur hdisk1, entrez :
$ lslv –p hdisk1 hd11
qui génère :
hdisk1:hd11:/home/op
0035 0036 0037 0038
0045 0046 0047 0048
0039
0049
0040
0050
0041
0051
0042
0043
0044
1–10
11–17
USED
USED
USED
USED
USED
USED
USED
USED
USED
USED
USED
USED
USED
USED
USED
USED
USED
18–27
28–34
USED
USED
USED
USED
USED
USED
USED
USED
USED
USED
USED
USED
USED
USED
USED
USED
35–44
45–50
0001
0011
0002
0012
0003
0013
0004
0014
0005
0015
0006
0016
0007
0017
0008
0009
0010
51–60
61–67
0018
0028
0019
0029
0020
0030
0021
0031
0022
0032
0023
0033
0024
0034
0025
0026
0027
68–77
78–84
Nous constatons que le volume logique hd11 est réparti sur le volume physique hdisk1,
ses premières partitions logiques se trouvant dans les zones médianes-internes et internes
de hdisk1, et les partitions 35 à 51, dans les zones externes. Un travail qui accède à hd11
de façon aléatoire subit inutilement des attentes d’E/S, tandis que l’accesseur disque va et
vient entre les différentes zones de hd11. Ces relevés montent également qu’il n’existe
aucune partition physique libre ni sur hdisk0 ni sur hdisk1.
Contrôle et optimisation des E/S disque
8-3
Si nous examinons hd2 (volume logique contenant le système de fichiers /usr) sur hdisk2
via :
$ lslv –p hdisk2 hd2
nous découvrons quelques partitions physiques libres (FREE) :
hdisk2:hd2:/usr
USED USED USED
FREE FREE FREE
FREE FREE FREE
FREE FREE FREE
FREE
USED
FREE
FREE
FREE
FREE
FREE
FREE
FREE
FREE
FREE
FREE
FREE
FREE
FREE
FREE
FREE
FREE
FREE
FREE
FREE
FREE
FREE
FREE
FREE
FREE
FREE
FREE
FREE
1–10
11–20
21–30
31–40
41–41
USED
USED
FREE
FREE
FREE
USED
USED
FREE
FREE
USED
USED
FREE
FREE
USED
USED
FREE
FREE
USED
USED
FREE
FREE
USED
USED
FREE
FREE
USED
FREE
FREE
FREE
USED
FREE
FREE
FREE
USED
FREE
FREE
FREE
USED
FREE
FREE
FREE
42–51
52–61
62–71
72–81
82–82
USED
0009
USED
0025
USED
0010
0016
0026
0001
0011
0017
0027
0002
0012
0018
0028
0003
0013
0019
0029
0004
0014
0020
0030
0005
0015
0021
0031
0006
USED
0022
0032
0007
USED
0023
0033
0008
USED
0024
0034
83–92
93–102
103–112
113–122
0035
0045
0055
0065
0075
0036
0046
0056
0066
0037
0047
0057
0067
0038
0048
0058
0068
0039
0049
0059
0069
0040
0050
0060
0070
0041
0051
0061
0071
0042
0052
0062
0072
0043
0053
0063
0073
0044
0054
0064
0074
123–132
133–142
143–152
153–162
163–163
0076
0086
0096
FREE
FREE
0077
0087
0097
FREE
0078
0088
0098
FREE
0079
0089
0099
FREE
0080
0090
0100
FREE
0081
0091
FREE
FREE
0082
0092
FREE
FREE
0083
0093
FREE
FREE
0084
0094
FREE
FREE
0085
0095
FREE
FREE
164–173
174–183
184–193
194–203
204–204
Ce relevé présente quelques différences intéressantes par rapport aux précédents.
Le volume logique hd2 est contigu, sauf pour quatre partitions physiques (100 à 103).
D’autres lslv (non indiqués) montrent que ces partitions servent à hd1, hd3 et hd9var
(/home, /tmp et /var, respectivement).
Pour voir comment le fichier copié précédemment, big1, est stocké sur disque, vous
pouvez lancer la commande fileplace :
$ fileplace –pv big1
Le relevé correspondant est le suivant :
File: big1 Size: 3554273 bytes Vol: /dev/hd10 (4096 byte blks)
Inode: 19 Mode: –rwxr–xr–x Owner: frankw Group: system
Physical blocks (mirror copy 1)
–––––––––––––––––––––––––––––––
01584–01591 hdisk0
8 blks,
01624–01671 hdisk0
48 blks,
01728–02539 hdisk0
812 blks,
32 KB,
192 KB,
3248 KB,
Logical blocks
––––––––––––––
0,9%
01040–01047
5,5%
01080–01127
93.5%
01184–01995
956 blocks over space of 869: space efficiency = 90,8%
3 fragments out of 868 possible: sequentiality = 99,8%
Ce qui indique qu’il y a très peu de fragmentation dans le fichier et que les ”trous” sont
petits. Nous pouvons en déduire que le mode de stockage de big1 a une incidence quasi
nulle sur la durée de lecture séquentielle. Mieux, en supposant qu’un fichier de 3,5 Mo
récemment créé subisse cette légère fragmentation, il apparaît que l’ensemble du système
de fichiers est lui-même peu fragmenté.
Remarque : Si un fichier a été créé par recherche d’emplacements et écriture d’articles
très dispersés, seules les pages contenant des articles occupent de la place sur le
disque et apparaissent sur un relevé fileplace. Le système de fichiers ne remplit pas
8-4
AIX 4.3 Guide d’optimisation
automatiquement les pages concernées lorsque le fichier est créé. Si toutefois un fichier
de ce type est lu séquentiellement, via la commande cp ou tar, par exemple, l’espace
entre les articles est interprété comme des zéros binaires. Aussi, le résultat d’une
commande cp peut-il être bien plus grand que le fichier d’entrée, bien que la quantité de
données n’ait pas varié.
Sous AIX version 4.1, la commande fileplace est intégrée à la boîte à outils PTX
(Performance Toolbox for AIX). Pour savoir si fileplace est disponible, entrez :
lslpp –lI perfagent.tools
Si le module est installé, fileplace est disponible.
Réorganisation d’un groupe ou d’un volume logique
Si vous découvrez un volume suffisamment fragmenté pour nécessiter une restructuration,
vous pouvez faire appel à smit pour exécuter la commande reorgvg
(smit –> Mémoire physique et logique –> Gestionnaire de volumes logiques –>
Groupes de volumes –> Définition caractéristiques d’un groupe de volumes –>
Réorganisation d’un groupe de volumes). Le raccourci est :
# smit reorgvg
Lancer cette commande sur rootvg sur le système test, sans spécifier de volumes
logiques, entraîne la migration de tous les volumes logiques vers hdisk2. Après
restructuration, le résultat de la commande :
$ lslv –p hdisk2 hd2
était :
hdisk2:hd2:/usr
USED USED USED
FREE FREE FREE
FREE FREE FREE
FREE FREE FREE
FREE
USED
FREE
FREE
FREE
USED
FREE
FREE
FREE
USED
FREE
FREE
FREE
USED
FREE
FREE
FREE
USED
FREE
FREE
FREE
FREE
FREE
FREE
FREE
FREE
FREE
FREE
FREE
1–10
11–20
21–30
31–40
41–41
USED
USED
FREE
FREE
FREE
USED
USED
FREE
FREE
USED
USED
FREE
FREE
USED
USED
FREE
FREE
USED
USED
FREE
FREE
USED
USED
FREE
FREE
USED
FREE
FREE
FREE
USED
FREE
FREE
FREE
USED
FREE
FREE
FREE
USED
FREE
FREE
FREE
42–51
52–61
62–71
72–81
82–82
USED
0009
0019
0029
USED
0010
0020
0030
0001
0011
0021
0031
0002
0012
0022
0032
0003
0013
0023
0033
0004
0014
0024
0034
0005
0015
0025
0035
0006
0016
0026
0036
0007
0017
0027
0037
0008
0018
0028
0038
83–92
93–102
103–112
113–122
0039
0049
0059
0069
0079
0040
0050
0060
0070
0041
0051
0061
0071
0042
0052
0062
0072
0043
0053
0063
0073
0044
0054
0064
0074
0045
0055
0065
0075
0046
0056
0066
0076
0047
0057
0067
0077
0048
0058
0068
0078
123–132
133–142
143–152
153–162
163–163
0080
0090
0100
FREE
FREE
0081
0091
FREE
FREE
0082
0092
FREE
FREE
0083
0093
FREE
FREE
0084
0094
FREE
FREE
0085
0095
FREE
FREE
0086
0096
FREE
FREE
0087
0097
FREE
FREE
0088
0098
FREE
FREE
0089
0099
FREE
FREE
164–173
174–183
184–193
194–203
204–204
La fragmentation des partitions physiques dans hd2, observée sur le relevé précédent, a
disparu. Nous n’avons toutefois affecté aucune fragmentation au niveau du bloc physique
existant éventuellement dans le système de fichiers /usr. Dans la mesure où la plupart des
fichiers dans /usr sont écrits une fois, pendant l’installation du système, et ne sont plus mis
à jour ensuite, /usr a peu de chance de subir des fragmentations. Ce qui n’est pas le cas
des données utilisateur dans le système de fichiers /home.
Contrôle et optimisation des E/S disque
8-5
Réorganisation d’un système de fichiers
Le système test comporte un volume logique et un système de fichiers, hd11 (point de
montage : /home/op), séparés, destinés aux tests risquant de détruire des données.
Si vous décidez de réorganiser hd11, commencez par sauvegarder les données :
# cd /home/op
# find . –print | pax –wf/home/waters/test_bucket/backuptestfile
Ces commandes créent un fichier de sauvegarde (dans un système de fichiers distinct)
contenant tous les fichiers du système à réorganiser. Si l’espace disque du système est
limité, vous pouvez effectuer cette sauvegarde sur bande.
Pour reconstituer le système de fichiers, vous devez au préalable lancer la commande
unmount, comme suit :
# unmount /home/op
Si des processus utilisent /home/op ou un de ses sous-répertoires, ils doivent être tués
(via kill) pour que unmount aboutisse.
Pour reconstituer le système de fichiers sur le volume logique de /home/op, entrez :
# mkfs /dev/hd11
Une confirmation vous est demandée, avant destruction de l’ancien système de fichiers. Le
nom du système de fichiers n’est pas modifié. Pour revenir à la situation antérieure
(/home/op étant néanmoins vidé), entrez :
# mount /dev/hd11 /home/op
# cd /home/op
Restaurez ensuite les données :
# pax –rf/home/frankw/tuning.io/backuptestfile >/dev/null
La sortie standard est réacheminée vers /dev/null pour éviter l’affichage de tous le noms
de fichiers, affichage qui peut demander beaucoup de temps.
Si vous examinez à nouveau le fichier volumineux examiné précédemment, via :
# fileplace –piv big1
vous constatez qu’il est à présent presque contigu :
File: big1 Size: 3554273 bytes Vol: /dev/hd11 (4096 byte blks)
Inode: 8290 Mode: –rwxr–xr–x Owner: frankw Group: system
INDIRECT BLOCK: 60307
Physical blocks (mirror copy 1)
–––––––––––––––––––––––––––––––
60299–60306 hdisk1
8 blks,
60308–61167 hdisk1
860 blks,
32 KB,
3440 KB,
0,9%
99.1%
Logical blocks
––––––––––––––
08555–08562
08564–09423
868 blocks over space of 869: space efficiency = 99.9%
2 fragments out of 868 possible: sequentiality = 99.9%
L’option –i spécifiée avec la commande fileplace montre que le trou de 1 bloc, entre les huit
premiers blocs du fichier et le reste, contient le bloc indirect, requis pour compléter les
informations d’i-node lorsque la longueur du fichier dépasse huit blocs.
8-6
AIX 4.3 Guide d’optimisation
Performances et espaces de pagination
Les E/S de et vers les espaces de pagination sont aléatoires, effectuées le plus souvent
une page à la fois. Les relevés vmstat indiquent la quantité d’espace de pagination occupé
par les E/S. Les deux exemples suivants montrent l’activité de pagination au cours d’une
compilation C, sur une machine artificiellement restreinte via rmss. Les colonnes pi et po
(pages chargées et pages déchargées de l’espace de pagination) indiquent les E/S dans
l’espace de pagination (exprimées en pages de 4096 octets) au cours de chaque intervalle
de 5 secondes. Le premier relevé, récapitulatif, a été supprimé. Notez que l’activité de
pagination se produit par rafales.
$ vmstat 5
procs
memory
page
faults
––––– ––––––––––– –––––––––––––––––––––––– ––––––––––––
r b
avm
fre re pi po fr
sr cy in
sy cs
0 0 2502
432
0
0
0
0
0
0 134
26 20
0 0 2904
201
4
0
7 43 1524
0 129 227 38
1 0 3043
136
0
0
0 17 136
0 117
46 24
1 0 3019
90
3
0
0
0
0
0 126
74 34
0 0 3049
178
2
0 15 28 876
0 148
32 32
1 0 3057
216
0
1
6 11
77
0 121
39 25
0 0 2502
599
2 15
0
0
0
0 142 1195 69
0 0 2502
596
0
0
0
0
0
0 135
30 22
cpu
–––––––––––
us sy id wa
0 1 99 0
64 12 15 10
92 6 0 2
84 6 0 10
85 6 0 9
93 5 0 2
47 9 11 34
1 1 98 1
Les relevés ”avant” et ”après” vmstat –s suivants indiquent les cumuls d’activités de
pagination. N’oubliez pas que ce sont les valeurs de ”paging space page ins” et
”. . outs” qui représentent l’activité d’E/S réelle. Les décomptes (non qualifiés) de
”page ins” et de ”page outs” indiquent le total des E/S (dans l’espace de pagination,
mais aussi E/S normales de fichiers également traitées par le mécanisme de pagination).
(Les informations ne relevant pas de notre propos ont été supprimées des relevés.)
$ vmstat –s
.
6602 page ins
3948 page outs
544 paging space page ins
1923 paging space page outs
71 total reclaims
.
.
$ vmstat –s
.
7022 page ins
4146 page outs
689 paging space page ins
2032 paging space page outs
84 total reclaims
.
.
Le fait qu’il y ait eu plus de pages déchargées que de pages chargées au cours de la
compilation laisse supposer que le système a été restreint à la limite de son point
d’emballement. Certaines pages ont été référencées deux fois car leur trame a été volée
avant la fin de leur utilisation (c’est-à-dire avant toute modification).
Mesure des E/S disque globales via vmstat
La technique décrite ci-dessus peut également être utilisée pour évaluer la charge d’E/S
disque générée par un programme. Si le système est inoccupé par ailleurs, la séquence :
$
$
$
$
$
vmstat –s >statout
testpgm
sync
vmstat –s >> statout
egrep ”ins|outs” statout
génère un relevé avant et après, indiquant les cumuls d’activités disque, tels que :
5698
5012
0
32
6671
5268
8
225
page ins
page outs
paging space
paging space
page ins
page outs
paging space
paging space
page ins
page outs
page ins
page outs
Contrôle et optimisation des E/S disque
8-7
Au cours de la période d’exécution de la commande (compilation d’un vaste programme C),
le système a lu un total de 981 pages (dont 8 issues de l’espace de pagination) et écrit un
total de 449 pages (dont 193 dans l’espace de pagination).
Analyse détaillée des E/S via filemon
La commande filemon fait appel à l’utilitaire de suivi pour générer une image détaillée de
l’activité d’E/S au cours d’un intervalle défini. Dans la mesure où la commande filemon
invoque cet utilitaire, seul l’utilisateur root ou un membre du groupe system est habilité à
la lancer.
Sous AIX version 4.1, la commande filemon est intégrée à la boîte à outils PTX
(Performance Toolbox for AIX). Pour déterminer si filemon est disponible, entrez :
lslpp –lI perfagent.tools
Si ce module est installé, filemon est disponible.
Le suivi, lancé par la commande filemon, peut être suspendu par trcoff, relancé par trcon
et arrêté par trcstop. Dès que le suivi est terminé, filemon en envoie le compte rendu à
stdout. La séquence suivante illustre l’utilisation de filemon :
# filemon –o fm.test.out ; cp smit.log /dev/null ; trcstop
Voici le relevé généré par cette séquence (sur un système inoccupé par ailleurs) :
Wed Jan 12 11:28:25 1994
System: AIX alborz Node: 3 Machine: 000249573100
0.303 secs in measured interval
Cpu utilization: 55.3%
Most Active Segments
––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
#MBs #rpgs #wpgs segid segtype
volume:inode
––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
0.1
26
0
0984 persistent
/dev/hd1:25
0.0
1
0
34ba .indirect
/dev/hd1:4
Most Active Logical Volumes
––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
util #rblk #wblk
KB/s volume
description
––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
0.66
216
0 357.0 /dev/hd1
/home
Most Active Physical Volumes
––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
util #rblk #wblk
KB/s volume
description
––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
0.65
216
0 357.0 /dev/hdisk1
320 MB SCSI
––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
Detailed VM Segment Stats
(4096 byte pages)
––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
SEGMENT: 0984 segtype:
segment flags:
reads:
read times (msec):
read sequences:
read seq. lengths:
SEGMENT: 34ba segtype:
segment flags:
reads:
read times (msec):
read sequences:
read seq. lengths:
persistent volume: /dev/hd1 inode: 25
pers
26
(0 errs)
avg 45.644 min
9.115 max 101.388 sdev
3
avg
8.7 min
1 max
22 sdev
.indirect volume: /dev/hd1 inode: 4
pers jnld sys
1
(0 errs)
avg 16.375 min 16.375 max 16.375 sdev
1
avg
1.0 min
1 max
1 sdev
33.045
9.5
0.000
0.0
––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
Detailed Logical Volume Stats
(512 byte blocks)
––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
8-8
AIX 4.3 Guide d’optimisation
VOLUME: /dev/hd1 description: /home
reads:
27
(0 errs)
read sizes (blks):
avg
8.0 min
8 max
8 sdev
0.0
read times (msec):
avg 44.316 min
8.907 max 101.112 sdev 32.893
read sequences:
12
read seq. lengths:
avg
18.0 min
8 max
64 sdev
15.4
seeks:
12
(44.4%)
seek dist (blks):
init
512
avg
312.0 min
8 max
1760 sdev
494.9
time to next req(msec): avg
8.085 min
0.012 max 64.877 sdev 17.383
throughput:
357.0 KB/sec
utilization:
0.66
––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
Detailed Physical Volume Stats
(512 byte blocks)
––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
VOLUME: /dev/hdisk1 description: 320 MB SCSI
reads:
14
(0 errs)
read sizes (blks):
avg
15.4 min
8 max
read times (msec):
avg 13.989 min
5.667 max
read sequences:
12
read seq. lengths:
avg
18.0 min
8 max
seeks:
12
(85.7%)
seek dist (blks):
init 263168,
avg
312.0 min
8 max
seek dist (cyls):
init
399
avg
0.5 min
0 max
time to next req(msec): avg 27.302 min
3.313 max
throughput:
357.0 KB/sec
utilization:
0.65
32 sdev
25.369 sdev
8.3
5.608
64 sdev
15.4
1760 sdev
494.9
2 sdev
64.856 sdev
0.8
22.295
Le relevé Most Active Segments donne la liste des fichiers les plus actifs. Pour
identifier les fichiers inconnus, vous pouvez traduire le nom du volume logique, /dev/hd1,
vers le point de montage du système de fichiers, /home, et lancer la commande find :
# find /home –inum 25 –print
qui renvoie :
/home/waters/smit.log
Lancer filemon sur des systèmes traitant de véritables travaux génère des relevés bien
plus longs, avec l’éventualité de devoir agrandir l’espace du tampon de suivi.
La consommation d’espace et de temps CPU par filemon peuvent entraîner une sérieuse
dégradation des performances : testez filemon sur un système non productif avant de vous
aventurer sur un système réellement exploité.
Remarque : Bien que filemon indique la moyenne, le minimum, le maximum et la
déviation standard dans ses rubriques relatives aux statistiques, ces résultats ne
peuvent servir de base à la définition d’intervalles fiables ou à d’autres conclusions
statistiques formelles. La répartition des points de données n’est en général ni aléatoire
ni symétrique.
Programmes à disque limité
Les problèmes liés au disque sont de différents ordres, avec des solutions diversifiées :
• Si de vastes travaux en arrière-plan, très consommateurs d’E/S, interfèrent avec les
temps de réponses interactives, vous pouvez activer la régulation d’E/S.
• S’il apparaît qu’un petit nombre de fichiers sont lus et relus à répétition, envisagez
d’ajouter de la mémoire réelle pour que la mise en tampon de ces fichiers soit plus
efficace.
• Si iostat indique que les activités d’E/S sont inégalement réparties sur les unités de
disque et que l’une de ces unités accuse une charge dépassant 70 à 80 %, envisagez de
réorganiser le système de fichiers.
Contrôle et optimisation des E/S disque
8-9
• Si les accès sont essentiellement de type aléatoire, envisagez d’ajouter des disques et
de mieux répartir les fichiers concernés.
• Si les accès effectués par le travail sont majoritairement séquentiels et impliquent
plusieurs unités de disque, envisagez d’ajouter une ou plusieurs cartes disque. Il peut
être intéressant de construire un volume logique réparti, pour les fichiers séquentiels
volumineux dont les performances sont critiques.
La section suivante donne plus de précisions sur les ratios unités/cartes disque.
Extension de la configuration
Malheureusement, toute opération d’optimisation des performances a des limites. La
question devient alors : ”De quel matériel ai–je besoin, en quelle quantité et comment en
tirer le maximum ?” La question est particulièrement épineuse avec des travaux limités au
niveau des disques, du fait du nombre de variables. Pour améliorer les performances de ce
type de travaux, vous pouvez :
• Ajouter des unités de disque et y répartir les données : la charge des E/S est ainsi
divisée entre davantage d’accesseurs.
• Acquérir des unités de disque plus rapides pour compléter ou remplacer les unités
existantes, pour les données très sollicitées.
• Ajouter une ou plusieurs cartes disque SCSI pour connecter les unités nouvelles et/ou
existantes.
• Ajouter de la RAM au système et augmenter les valeurs des paramètres VMM minperm
et maxperm pour améliorer la mise en mémoire cache des données très sollicitées.
Vu la complexité de la question, étroitement liée à l’importance de la charge de travail et de
la configuration, et vu la rapidité d’évolution de la vitesse des disques, des cartes et des
processeurs, nous ne vous donnerons pas ici de consignes précises, mais de simples
conseils de base.
• Si vous cherchez à optimiser les accès séquentiels :
– Ne raccordez pas plus de trois unités (nouvelles) de 1 Go à une carte disque SCSI–2
donnée.
Les performances maximales d’une carte disque SCSI–2, en traitement séquentiel
continu, dans des conditions idéales, sont d’environ 6,8 Mo/s.
• Si vous cherchez à optimiser les accès séquentiels :
– Ne raccordez pas plus de six unités (nouvelles) de 1 Go à une carte disque SCSI–2
donnée.
Les performances maximales d’une carte disque SCSI–2, en traitement aléatoire (sur
des pages de 4 ko) continu, dans des conditions idéales, sont d’environ 435 pages/s.
Pour obtenir une analyse plus fine de votre configuration et de votre charge de travail, vous
pouvez utiliser un simulateur, tel BEST/1.
Voir aussi
Commandes backup, fileplace, lslv, lsps, lspv, reorgvg, smit et unmount.
”Performances du gestionnaire de mémoire virtuelle (VMM)”
”Programmes à CPU limitée”
”Position et taille des espaces de pagination”
8-10
AIX 4.3 Guide d’optimisation
Optimisation des lectures séquentielles anticipées
La fonction VMM de lecture séquentielle anticipée, décrite à ”Lecture séquentielle
anticipée”, peut améliorer les performances des programmes accédant séquentiellement à
des fichiers volumineux.
Les cas où l’activation de cette fonction améliore les performances sont rares. Néanmoins,
l’analyste des performances doit comprendre l’interaction entre cette fonction et l’application
ainsi qu’avec les autres paramètres d’optimisation des E/S disque. La figure ”Exemple de
lecture séquentielle anticipée” illustre une situation classique.
Données
réf.
A
B C
D
E
F
...
numéro
page
0
1 2 3
4
7
8
15 16
23
Exemple de lecture séquentielle anticipée
Dans cet exemple, minpgahead a la valeur 2 et maxpgahead, la valeur 8 (valeurs par
défaut). Le programme traite le fichier séquentiellement. Seules les références des données
significatives pour la fonction de lecture anticipée sont illustrées (A à F). Les étapes sont les
suivantes :
A
Le premier accès au fichier provoque la lecture de la première page (page 0)
de ce fichier. A ce niveau, VMM ne fait aucune hypothèse sur la nature de
l’accès (séquentiel ou aléatoire).
B
Lorsque le programme accède au premier octet de la page suivante (page 1),
sans autre accès aux autres pages du fichier, VMM conclut à un accès
séquentiel. Il programme la lecture de minpgahead (2) pages (pages 2 et 3).
L’accès B entraîne ainsi la lecture de 3 pages.
C
Lorsque le programme accède au premier octet de la première page lue par
anticipation (page 2), VMM double la valeur du nombre de pages à lire par
anticipation (qui passe à 4) et programme la lecture des pages 4 à 7.
D
Lorsque le programme accède au premier octet de la première page lue par
anticipation (page 4), VMM double la valeur du nombre de pages à lire par
anticipation (qui passe à 8) et programme la lecture des pages 8 à 15.
E
Lorsque le programme accède au premier octet de la première page lue par
anticipation (page 8), VMM détermine que le nombre de pages à lire par
anticipation a atteint la valeur de maxpgahead et programme la lecture des
pages 16 à 23.
F
VMM poursuit la lecture de maxpgahead pages lorsque le programme accède
au premier octet du groupe précédent des pages à lire par anticipation, jusqu’à
la fin du fichier.
(Si le programme passe en cours de route à un autre type d’accès, la fonction
de lecture anticipée est arrêtée. Elle est relancée avec minpgahead pages si
VMM détecte une reprise des accès séquentiels par le programme.)
Les paramètres minpgahead et maxpgahead peuvent être modifiés via la commande
vmtune. Si vous envisagez de le faire, n’oubliez pas que :
• Les valeurs doivent appartenir à l’ensemble : 0, 1, 2, 4, 8, 16. Toute autre valeur peut
avoir l’effet inverse de celui escompté ou des effets fonctionnels non souhaités.
– Les valeurs doivent être des puissances de 2, du fait de l’algorithme de doublement.
– Les valeurs de maxpgahead supérieures à 16 (lecture anticipée de plus de 64 ko)
excèdent la capacité de certains pilotes de disque.
Contrôle et optimisation des E/S disque
8-11
– Des valeurs supérieures de maxpgahead peuvent être utilisées sur des systèmes où
les performances en mode séquentiel des volumes logiques répartis sont d’une
importance capitale.
• Donner à minpgahead la valeur 0 annihile de fait le mécanisme. Ce qui peut avoir de
fâcheuses conséquences sur les performances.
• La valeur par défaut (8) de maxpgahead est celle qui entraîne les performances
maximales des E/S séquentielles pour les unités de disque courantes.
• Le passage de la valeur de lecture anticipée de minpgahead à maxpgahead est
suffisamment rapide : pour les fichiers de taille courante, il n’y a aucun intérêt à
augmenter la valeur de minpgahead.
8-12
AIX 4.3 Guide d’optimisation
Régulation des E/S disque
La régulation des E/S disque a pour but d’empêcher les programmes générant beaucoup
de sorties de saturer les fonctions d’E/S du système et de ralentir les temps de réponse des
programmes peu demandeurs. La régulation des E/S force les niveaux haut et bas par
segment (c’est-à-dire, en fait, par fichier) à la somme des E/S en attente. Lorsqu’un
processus tente d’écrire dans un fichier dont le niveau d’écriture en attente est au plus haut,
le processus est mis en veille jusqu’à ce que le nombre d’E/S en attente redevienne
inférieur ou égal au niveau bas. La logique de traitement des E/S reste identique. Seules les
sorties issues de processus générateurs de volumes élevés sont quelque peu ralenties. Les
niveaux haut et bas sont définis via smit par les options Environnements système et
processus –> Modif/affich caractéristiques du système d’exploitation (et entrée du
nombre de pages correspondant aux deux niveaux). Leur valeur par défaut est de 0, ce qui
désactive la régulation. Les nouvelles valeurs des paramètres de régulation prennent
normalement effet immédiatement et restent en vigueur jusqu’à nouvelle modification.
Exemple
L’effet de la régulation sur les performances peut être étudié en lançant une session vi sur
un nouveau fichier, tandis qu’un autre processus copie (via cp) un fichier de 64 Mo. La
copie a lieu du disk1 vers le disk0 et l’exécutable vi réside sur le disk0. Pour que la
session vi démarre, elle doit se charger elle–même et effectuer quelques autres E/S, ce
qu’elle effectue en mode aléatoire, une page à la fois. Cette opération mobilise environ
50 E/S physiques, qui peuvent être terminées en 0,71 secondes, sous réserve qu’il n’y ait
de concurrence pour l’accès au disque. Si le niveau haut est défini à 0 (valeur par défaut),
les écritures logiques résultant de cp passent avant les écritures physiques et une longue
file d’attente se construit. Chaque E/S initiée par vi doit attendre son tour dans la file avant
que l’E/S suivante puisse être émise et vi ne peut ainsi pas démarrer avant la fin de cp.
La figure ”Résultats d’un test de régulation d’E/S” illustre les délais d’exécution de cp et
d’initialisation de vi avec différents paramètres de régulation. Cette étude a été effectuée
sur un Modèle 530 équipé de deux disques de 857 Mo et de 32 Mo de mémoire vive.
Niveau
haut
Niveau
bas
cp (s)
vi (s)
0
0
0
0
50
50,2
9
17
17
33
33
6
12
8
24
16
76.8
57.9
63.9
52.0
55.1
vi non fait
vi terminé après cp
est terminé
2.7
3.6
3.4
9.0
4.9
Résultats d’un test de régulation d’E/S
Notez que la durée de cp est toujours plus élevée lorsque la régulation est activée.
La régulation sacrifie quelques sorties de programmes très consommateurs d’E/S pour
améliorer les temps de réponse d’autres programmes. La difficulté pour un administrateur
est de trouver un équilibre débit/temps de réponse qui réponde aux priorités de l’entreprise.
Les niveaux haut et bas ont été choisis par tâtonnements et erreurs, sur la base de notre
connaissance du chemin des E/S. Ce choix n’est pas simple du fait de la combinaison des
écritures différées et asynchrones. Les niveaux hauts de la forme 4x + 1 sont
particulièrement efficaces, car :
• La fonction d’écriture différée envoie sur disque les 4 pages précédentes lorsqu’une
écriture logique a lieu sur le premier octet de la cinquième page.
Contrôle et optimisation des E/S disque
8-13
• Si le niveau haut de régulation était un multiple de 4 (disons 8), un processus l’atteindrait
lorsqu’il demande une écriture qui s’étend jusqu’à la 9ème page. Il serait alors mis en
veille – avant que l’algorithme d’écriture différée ait la moindre chance de détecter que la
quatrième page utilisée est terminée et que les quatre pages sont prêtes à être écrites.
• Le processus sera alors maintenu en veille avec quatre pages pleines prêtes à sortir,
jusqu’à ce que le niveau de ses écritures passe en dessous du niveau bas de régulation.
• Si, par ailleurs, le niveau haut a été défini à 9, l’écriture différée va avoir à programmer
les quatre pages pour la sortie avant que le processus ne soit suspendu.
Une des limites de la régulation intervient lorsqu’un processus écrit dans des tampons de
taille supérieure à 4 ko, auquel cas le contrôle possible baisse singulièrement.
Si, lorsqu’une écriture est envoyée à VMM, le niveau haut n’a pas été atteint, VMM exécute
un lancement des E/S sur toutes les pages du tampon, même s’il en résulte un
dépassement du niveau haut. La régulation fonctionne bien sur cp car cette commande
écrit par tranches de 4 ko, mais si cp écrivait dans des tampons plus grands, les délais
illustrés à la figure ”Résultats du test de régulation des E/S” pour le lancement de vi
seraient supérieurs.
Niveau
haut
Niveau
bas
cp (s)
vi (s)
0
0
0
0
50
50,2
9
17
17
33
33
6
12
8
24
16
76.8
57.9
63.9
52.0
55.1
vi non fait
vi terminé après cp
est terminé
2.7
3.6
3.4
9.0
4.9
Résultats d’un test de régulation d’E/S
La régulation des E/S disque est un paramètre d’optimisation qui peut améliorer les temps
de réponse interactifs dans le cas où des programmes (en avant ou arrière-plan) qui
écrivent d’importants volumes interfèrent avec des requêtes en avant-plan. Mal utilisée, elle
peut à l’inverse réduire le débit de façon excessive. Les paramètres de la figure Résultats
du test de régulation des E/S constituent une bonne base de départ, mais seule
l’expérience vous aidera à déterminer les paramètres adaptés à votre charge de travail.
Parmi les programmes susceptibles d’imposer d’activer la régulation des E/S, citons :
• Les programmes générant par algorithmes de forts volumes de sorties et ne subissant de
ce fait aucune contrainte quant à la durée de la lecture : une régulation peut être
nécessaire sur des processeurs rapides et pas sur des processeurs lents.
• Les programmes écrivant de longs fichiers peu modifiés, peu de temps après leur lecture
intégrale (par une commande antérieure, par exemple).
• Les filtres, telle la commande tar, qui lisent un fichier et le réécrivent après un traitement
minimal. Le besoin de régulation est d’autant plus pressant si l’entrée est lue à partir
d’une unité de disque plus rapide que l’unité sur laquelle est écrite la sortie.
8-14
AIX 4.3 Guide d’optimisation
Performances et répartition des volumes logiques
La répartition en bandes est une technique qui consiste à distribuer les données d’un
volume logique sur plusieurs unités de disque, de sorte que la capacité d’E/S des disques
puisse être exploitée en parallèle pour l’accès aux données du volume logique. (La fonction
de création de volumes logiques répartis en bandes n’est pas disponible sous la version
3.2.5.) Le but principal de l’opération est d’accroître les performances au niveau de la
lecture et de l’écriture de longs fichiers séquentiels. La figure ”Volume logique réparti
/dev/lvs0” en donne un exemple.
carte disque
première
partition
logique
élément 1
élément 2
élément 3
première bande
élément 4
...
élément 5
...
élément 6
...
deuxième bande
élément n
élément n+1
élément n+2
élément n+3
élément n+4
élément n+5
premier
volume
physique
premier
volume
physique
deuxième
volume
physique
.
.
.
deuxième partition logique
Volume logique réparti /dev/lvs0
Sur un volume logique classique, les adresses des données correspondent à la séquence
de blocs de la partition physique sous-jacente. Sur un volume logique réparti en bandes,
ces adresses suivent la séquence des éléments de bande. Une bande complète est
constituée d’un élément par unité physique contenant une partie du volume logique réparti.
Le LVM détermine les blocs et les unités physiques correspondant au bloc en cours de
lecture ou d’écriture. Si plusieurs disques sont concernés, les E/S requises sont
programmées simultanément pour toutes les unités.
Par exemple, supposons que lvs0 est constitué d’éléments de bande de 64 ko, est
composé de six partitions de 2 Mo et contient un système de fichiers journalisé (JFS).
Si une application est en cours de lecture d’un fichier séquentiel long et que la lecture
anticipée a atteint un point de stabilité, chaque lecture va entraîner la programmation de
deux ou trois E/S vers chaque unité de disque, pour un total de huit pages (en supposant
que le fichier se trouve sur des blocs consécutifs du volume logique). Les opérations de
lecture sont exécutées dans l’ordre déterminé par le pilote de l’unité de disque.
Les données requises sont reconstituées à partir des différents éléments des entrées et
retournées à l’application.
Bien que chaque unité de disque ait un délai de latence initial différent, fonction de la
position du mécanisme d’accès au début de l’opération, une fois que le processus a atteint
un état stable, les trois disques procèdent aux lectures à une vitesse proche de leur vitesse
maximale.
Contrôle et optimisation des E/S disque
8-15
Conception d’un volume logique réparti
Pour définir un volume logique réparti, vous spécifiez :
unités
A l’évidence, il faut disposer d’au moins deux disques physiques. Les
unités choisies doivent en outre être peu chargées d’autres activités au
moment des E/S séquentielles critiques.
Certaines combinaisons de carte/unité de disque nécessitent de diviser
la charge de travail d’un volume logique réparti entre deux ou plusieurs
cartes.
taille d’élément Bien qu’en théorie toute puissance de 2 comprise entre 4 et 128 ko
de bande
convienne, vous devez tenir compte des lectures anticipées, puisque la
plupart des lectures passeront par ce mécanisme. L’objectif est que
chaque lecture anticipée génère au moins une E/S sur chaque unité de
disque (idéalement un nombre égal).
taille
Le nombre de partitions physiques affectées au volume logique doit être
un multiple du nombre de disques utilisés.
attributs
Ne peuvent être mis en miroir, c’est-à-dire que copies = 1.
Optimisation des E/S d’un volume logique réparti
Dans des situations d’évaluation, les techniques suivantes ont généré les plus forts débits
d’E/S séquentielles :
• Taille d’élément de bande de 64 ko.
• max_coalesce de 64 ko (valeur par défaut). Égal à la taille d’un élément de bande.
• minpgahead de 2.
• maxpgahead de 16 fois le nombre d’unités de disque. Ceci entraîne la lecture anticipée
de page par unités de la taille d’un élément de bande (64 ko) multiplié par le nombre
d’unités de disque. Chaque lecture anticipée provoque donc la lecture d’un élément de
bande de chaque unité de disque.
• Requêtes d’E/S pour (64 ko fois le nombre d’unités de disque). Egal à la valeur de
maxpgahead.
• Modification de maxfree en fonction de celle de maxpgahead. Reportez–vous à
”Paramètres minfree et maxfree”, page 7-16.
• Tampons d’E/S alignés sur 64 octets. Si le volume logique doit occuper des unités
physiques connectées à au moins deux cartes disque, les tampons d’E/S utilisés doivent
être affectés dans la limite de 64 octets. Ceci pour éviter que le LVM ne sérialise les E/S
sur les différents disques. Le code suivant génère un pointeur de tampon aligné sur
64 octets :
char *buffer;
buffer = malloc(MAXBLKSIZE+64);
buffer = ((int)buffer + 64) & ~0x3f;
Si les volume logiques répartis se trouvent sur des volume logiques bruts et que des
écritures de plus de 1,125 Mo sont effectuées sur ces volumes logiques bruts répartis,
augmenter le paramètre lvm_bufcnt de vmtune peut augmenter le débit des écritures.
8-16
AIX 4.3 Guide d’optimisation
Performances et taille de fragment du système de fichiers
La fonction de fragmentation (AIX version 4.1 seulement) permet d’affecter l’espace d’un
système de fichiers par tranches inférieures à 4 ko. A la création d’un système de fichiers,
l’administrateur système peut spécifier la taille de ces fragments : 512, 1024, 2048 et
4096 octets (valeur par défaut). Les fichiers plus petits qu’un fragment sont stockés dans un
seul fragment, économisant ainsi de l’espace, ce qui est le but premier de l’opération.
Les fichiers de taille inférieure à 4096 octets sont stockés dans le minimum nécessaire de
fragments contigus. Les fichiers de taille comprise entre 4096 octets et 32 ko (inclus) sont
stockés dans un ou plusieurs blocs entiers (4 ko) et dans autant de fragments que requis
pour contenir le reste. Les fichiers de plus de 32 ko sont stockés entièrement dans des
blocs complets.
Quelle que soit la taille d’un fragment, un bloc complet est supposé contenir 4096 octets.
Si, toutefois, la taille de fragment d’un système de fichiers est inférieure à 4096, un bloc
peut être constitué d’une séquence quelconque de fragments contigus totalisant
4096 octets. Il ne doit pas nécessairement commencer à la limite d’un multiple de
4096 octets.
Le système de fichiers tente d’affecter aux fichiers des fragments contigus. Dans cette
optique, il répartit les fichiers dans le volume logique pour éviter les interférences
d’affectation inter-fichiers et la fragmentation.
Le principal écueil qui guette les systèmes de fichiers dotés d’une taille de fragment minime
est la fragmentation de l’espace. La présence de petits fichiers disséminés au sein du
volume logique rend difficile, voire impossible, l’affectation de blocs contigus à ou même
simplement proches d’un fichier quelque peu volumineux. L’accès à ce type de fichiers
devient moins performant. Poussée à l’extrême, la fragmentation de l’espace peut rendre
impossible l’affectation d’espace à un fichier, même s’il existe suffisamment de fragments
isolés libres.
Une part de la décision de créer un système de fichier avec de petits fragments doit être
une stratégie de défragmentation de l’espace dans ce système de fichiers via la commande
defragfs. Cette stratégie doit également tenir compte du coût de performance induit par
l’exécution de defragfs.
Contrôle et optimisation des E/S disque
8-17
Performances et compression
Lorsqu’un fichier est écrit dans un système de fichiers pour lequel la compression est
active, l’algorithme correspondant comprime les données par tranches de 4 096 octets
(une page) et écrit les données compressées dans le minimum de fragments contigus.
A l’évidence, si la taille de fragment du système de fichiers est de 4 ko, il n’y a pas de gain
d’espace disque compensant l’effort de compression des données. (La compression et les
fragments de taille inférieure à 4 ko sont une nouveauté de AIX version 4.1.)
Bien que la compression génère un gain d’espace, il convient toutefois de ménager un peu
d’espace libre dans le système de fichiers.
• En effet, dans la mesure où le degré de compression de chaque bloc de 4096 octets
n’est pas connu à l’avance, le système de fichiers commence par réserver un bloc entier.
Les fragments inutilisés sont libérés après la compression, mais la réservation initiale
peut entraîner un message de type ”manque d’espace” prématuré.
• Il faut de l’espace pour l’exécution de la commande defragfs.
8-18
AIX 4.3 Guide d’optimisation
Performances et E/S disque asynchrones
Les applications peuvent appeler les sous-routines aio_read et aio_write pour effectuer
des E/S disque asynchrones. Le contrôle revient à l’application dès que la requête est mise
en file d’attente. Celle-ci peut alors continuer le traitement pendant l’exécution des
opérations sur disque.
Bien que l’application puisse poursuivre le traitement, un processus noyau (kproc) appelé
serveur prend en charge chaque requête depuis le moment où elle est extraite de la file
d’attente jusqu’à la fin de son exécution. Le nombre de serveurs limite le nombre d’E/S
disque asynchrones exécutables simultanément. Le nombre de serveurs est défini via smit
(smit–>Unités–>E-S asynchrones–>Modif/affich caractéristiques d’E-S
asynchrones–>{MINIMUM|MAXIMUM} nombre de serveurs ou smit aio) ou via chdev.
Le nombre minimal de serveurs est le nombre de serveurs à lancer à l’amorçage du
système. Le maximum limite le nombre de serveurs qui peuvent être démarrés en réponse
à un grand nombre de requêtes simultanées.
Les valeurs par défaut sont minservers=1 et maxservers=10. Sur les systèmes où peu
d’applications font appel à des E/S asynchrones, ces valeurs conviennent généralement.
Dans un environnement riche en unités de disque et en applications clés qui utilisent des
E/S asynchrones, ces valeurs par défaut sont largement insuffisantes. Le déficit de serveurs
entraîne un ralentissement apparent des E/S disque. Non seulement le temps passé par les
requêtes dans la file d’attente est démesuré, mais la faiblesse du ratio serveurs/unités de
disque signifie que les algorithmes d’optimisation des recherches disposent de trop peu de
requêtes à exploiter pour chaque unité de disque.
Dans les environnements où les performances au niveau des E/S disque asynchrones sont
capitales et le volume des requêtes élevé, nous vous conseillons de :
• donner à maxservers une valeur au moins égale à 10*(nombre de disques dont l’accès
est asynchrone)
• donner à minservers la valeur de maxservers/2.
Pour un système équipé de 3 disques dont l’accès est asynchrone, vous pouvez à cet effet
lancer la commande :
# chdev –l aio0 –a minservers=’15’ –a maxservers=’30’
Remarque : Les actions AIO effectuées sur un volume logique RAW ne font pas appel
aux processus serveur kproc. En l’occurrence, les paramètres ”maxservers” et
”minservers” n’ont aucun effet.
Contrôle et optimisation des E/S disque
8-19
Performances et E/S disque brutes
Un programme dispose de trois moyens pour accéder à un disque en mode brut :
• Les fichiers spéciaux d’unités disque brutes par bloc sont dotés de noms de la forme
/dev/hdiskn et sont utilisés par certains sous-systèmes. Ces unités ne doivent pas être
exploitées par les programmes d’application.
• Les fichiers spéciaux d’unités disque brutes par caractère sont dotés de noms de la
forme /dev/rhdiskn. L’exploitation de ces unités par les programmes d’application est
déconseillée. Si vous décidez néanmoins d’adopter cette technique, vérifiez qu’aucun
volume logique AIX n’occupe une partie de l’unité de disque physique en cours d’accès.
L’effet sur les performances de l’interaction entre accès brut et accès du type système de
fichiers à la même unité physique est imprévisible. Assurez–vous de ne pas écraser les
512 premiers octets du disque puisque c’est là qu’est enregistré l’ID du volume physique.
• Il est possible d’accéder en mode brut à un volume logique sur lequel aucun système de
fichiers n’a été créé. Toutes les opérations write, read, lseek, etc., doivent être
effectuées sur des multiples de 512 octets. Violer cette règle a pour conséquence, entre
autres, une très nette dégradation des performances.
8-20
AIX 4.3 Guide d’optimisation
Performances et sync/fsync
La synchronisation forcée du contenu de la mémoire réelle et des disques s’opère de
différentes façons :
• Un programme d’application effectue un appel fsync() pour un fichier donné : toutes les
pages contenant des données modifiées pour ce fichier sont alors écrites sur disque.
L’écriture prend fin lorsque l’appel fsync() revient au programme.
• Un programme d’application effectue un appel sync() : toutes les pages du fichier en
mémoire contenant des données modifiées sont alors programmées pour une écriture
sur disque. L’écriture ne prend pas nécessairement fin lorsque l’appel sync() revient au
programme.
• Un utilisateur lance la commande sync, laquelle à son tour émet un appel sync().
Là aussi, certaines écritures peuvent ne pas être terminées lorsque l’utilisateur est invité
à entrer une autre commande (ou que la commande suivante d’un script shell est traitée).
• Le démon sync, /usr/sbin/syncd, lance un appel sync() à intervalle régulier
– généralement de 60 secondes. Ceci garantit que le système n’accumule pas de
grandes quantités de données existant uniquement en RAM volatile.
Outre une faible consommation de CPU, une synchronisation :
• regroupe les écritures au lieu de les éparpiller ;
• écrit au moins 28 ko de données système, même en l’absence d’activité d’E/S depuis la
dernière synchronisation ;
• accélère l’écriture des données sur disque, en annulant l’algorithme d’écriture différée.
Cet effet est particulièrement visible sur les programmes qui émettent un fsync() après
chaque écriture.
Contrôle et optimisation des E/S disque
8-21
Modification du paramètre max_coalesce du pilote SCSI
Si la file d’attente de l’unité de disque SCSI contient un grand nombre de requêtes d’E/S
disque, l’unité tente de les fusionner pour en diminuer le nombre. La taille maximale de
requête (en termes de données transmises) que l’unité SCSI est autorisée à constituer est
définie par le paramètre max_coalesce. Normalement, max_coalesce a la valeur 64 ko.
Pour exploiter au maximum les volumes logiques répartis et les piles de disques, il peut être
souhaitable d’augmenter la valeur de max_coalesce. Pour ce faire, une strophe de la base
de données ODM PdAt doit spécifier la nouvelle valeur de max_coalesce. Si vous avez
déjà inséré une strophe de ce type, vous pouvez en obtenir la version courante via :
# odmget –q \
”uniquetype=disk/scsi/osdisk AND attribute=max_coalesce” \
PdAt > foo
S’il n’existe aucune strophe de ce type, créez, via un éditeur, le fichier foo contenant :
PdAt:
uniquetype = ”disk/scsi/osdisk”
attribute = ”max_coalesce”
deflt = ”0x20000”
values = ”0x20000”
width = ””
type = ”R”
generic = ””
rep = ”n”
nls_index = 0
Notez que max_coalesce, en octets, est exprimé par un nombre hexadécimal. La valeur
des champs deflt et values (0x20000) donne à max_coalesce la valeur de 128 ko.
Remplacez ensuite l’ancienne strophe de PdAt (le cas échéant) par foo, comme suit :
# odmdelete –o PdAt \
–q ”uniquetype=/disk/scsi/osdisk AND attribute=max_coalesce”
# odmadd < foo
Pour appliquer la modification, reconstituez le noyau et réamorcez le système, via :
# bosboot –a –d hdisk0
# shutdown –rF
8-22
AIX 4.3 Guide d’optimisation
Limites de la file d’attente de l’unité de disque et de la
carte SCSI
AIX a la possibilité de forcer les limites du nombre de requêtes d’E/S issues de la carte
SCSI vers un bus ou une unité de disque SCSI donné. Ces limites ont pour but d’exploiter la
capacité du matériel à gérer des requêtes multiples, tout en assurant que les algorithmes
d’optimisation de la recherche des pilotes d’unités peuvent effectivement opérer.
Pour les unités non BULL, il est parfois judicieux de modifier les valeurs par défaut des
limites de la file d’attente AIX, choisies à l’origine pour faire face aux situations les moins
favorables. Les sections suivantes traitent des cas où il convient de modifier ces valeurs.
Unité de disque non BULL
Pour les unités de disque BULL, le nombre par défaut de requêtes pouvant être émises
simultanément est de 3. Cette valeur est basée sur des considérations de performance
complexes et aucune interface directe n’est fournie pour la modifier. La longueur par défaut
d’une file d’attente matérielle des unités de disque non BULL est de 1. Si une unité non
BULL spécifique n’a pas la capacité de mettre en tampon plusieurs requêtes, la description
système de cette unité doit être modifiée en conséquence.
Par exemple, voici les caractéristiques par défaut d’une unité de disque non BULL affichées
par la commande lsattr :
$ lsattr –D –c disk –s scsi –t osdisk
pvid
none Physical volume identifier
False
clr_q
no
Device CLEARS its Queue on error
q_err
yes Use QERR bit
q_type
none Queuing TYPE
queue_depth
1
Queue DEPTH
reassign_to
120 REASSIGN time out value
rw_timeout
30
READ/WRITE time out value
start_timeout 60
START unit time out value
Pour modifier ces paramètres, vous pouvez passer par smit (raccourci chgdsk) et par la
commande chdev. Par exemple, si votre système contient l’unité de disque SCSI non BULL
hdisk5, la commande :
# chdev –l hdisk5 –a q_type=simple –a queue_depth=3
active la fonction de mise en file d’attente pour cette unité et définit à 3 la longueur de cette
file d’attente.
Pile de disques non BULL
Une pile de disques est considérée par AIX comme un seul disque, assez volumineux. Une
pile de disques non BULL, comme une unité de disque non BULL, est de la classe disk,
sous-classe scsi, type osdisk (c’est–à–dire ”Other SCSI Disk Drive”). Une pile de disques
contenant en réalité un certain nombre de disques physiques, chacun prenant en charge de
multiples requêtes, la longueur de la file d’attente pour la pile de disques doit être
suffisamment élevée pour permettre une exploitation efficace de toutes les unités
physiques. Par exemple, si hdisk7 est une pile de huit disques non BULL, effectuez la
modification comme suit :
# chdev –l hdisk7 –a q_type=simple –a queue_depth=24
Si la pile de disques est connectée via un bus SCSI–2 Fast/Wide, il faudra peut-être
modifier également la limite définie pour les requêtes externes pour ce bus.
Contrôle et optimisation des E/S disque
8-23
Limitation des requêtes externes sur une carte disque
La carte SCSI–2 Fast/Wide accepte deux bus SCSI : l’un pour les unités internes, l’autre
pour les unités externes. Une limite sur le nombre total de requêtes en attente est définie
pour chaque bus (valeur par défaut : 40, valeur maximale 128). Si une pile de disques BULL
est connectée à un bus de carte SCSI–2 Fast/Wide, la limite pour le bus est augmentée
pour tenir compte de la taille de la file d’attente de la pile de disques. S’il s’agit d’une pile de
disques non BULL, la limite pour le bus doit être définie manuellement. Par exemple, pour
limiter à 70 le nombre de requêtes externes de la carte scsi3, spécifiez :
# chdev –l scsi3 –a num_cmd_elems=70
Sur le contrôleur haute performance SCSI–2, le nombre de requêtes en file d’attente est
limité à 30 et cette limite ne peut être modifée. De ce fait, vous devez vérifier que la somme
des longueurs des files d’attente reliées à un contrôleur de ce type ne dépasse pas 30.
La carte SCSI ESCALA d’origine ne prend pas en charge la mise en file d’attente.
Ne connectez pas d’unité de piles de disques à une carte de ce type.
8-24
AIX 4.3 Guide d’optimisation
Contrôle du nombre de pbufs système
Le gestionnaire LVM (Logical Volume Manager) utilise un élément appelé ”pbuf” pour
contrôler les E/S disque en attente. Sous AIX version 3, il est requis un pbuf par page lue ou
écrite. Sur les systèmes effectuant beaucoup d’E/S séquentielles, le pool de pbufs peut se
trouver rapidement dégarni. La commande vmtune permet d’augmenter le nombre de
pbufs pour compenser cette déperdition.
Sous AIX version 4.1, un seul pbuf est utilisé par requête d’E/S séquentielle, quel que soit le
nombre de pages en cause. Ce qui diminue grandement la probabilité de manquer de
pbufs.
Contrôle et optimisation des E/S disque
8-25
8-26
AIX 4.3 Guide d’optimisation
Chapitre 9. Contrôle et optimisation des E/S de
communication
Ce chapitre traite de différents protocoles de communication, et notamment des moyens de
les contrôler et de les optimiser. Il comporte les sections suivantes :
• ”Performances UDP/TCP/IP”
• ”Optimisation de TCP et UDP”
• ”Récapitulatif des paramètres d’optimisation UDP, TCP/IP et mbuf”
• ”Optimisation de NFS”
• ”Service des stations de travail sans disque”
• ”Optimisation des connexions asynchrones pour transferts haut débit”
• ”Evaluation des performances réseau avec netpmon”
• ”Analyse des problèmes de performance avec iptrace”
Contrôle et optimisation des E/S de communication
9-1
Performances UDP/TCP/IP
Pour appréhender les caractéristiques des performances de UDP et de TCP/IP, quelques
notions sur l’architecture sous-jacente s’imposent. La figure ”Flux des données
UDP/TCP/IP” illustre la structure traitée ici.
tampon
d’envoi
tampon de
lecture
application
espace utilisateur
copie
mbuf
espace système
envoi socket
tampon
copie
tampon de
mbuf
réception socket
datagrammes
flux
TCP
(conformité MTU)
UDP
conformité MTU
TCP
UDP
file d’entrée IP
application de MTU
mbufs file de transmission
DMA
socket
couche ou
sous-système
(par exemple,
NFS, DFS)
couche
TCP ou
UDP
Couche IP
couche IF
file de réception
unité
pilote
DMA
adaptateur
support
Flux des données UDP/TCP/IP
Cette figure illustre le cheminement des données depuis une application sur un système à
une autre sur un système distant. Le traitement des couches, détaillé plus loin, peut être
résumé comme suit (en ne tenant pas compte du traitement des erreurs et des limites des
tampons) :
• La requête d’écriture émanant de l’application provoque la copie des données du
segment de travail de l’application dans le tampon d’envoi du socket.
• La couche ou le sous-système socket transmet les données à UDP ou à TCP.
• Si les données sont plus volumineuses que le MTU (maximum transfer unit) du réseau :
– TCP fragmente la sortie en segments conformes à la limite MTU.
9-2
AIX 4.3 Guide d’optimisation
– UDP délègue la fragmentation de la sortie à la couche IP.
• Au besoin, IP fragmente la sortie en éléments compatibles avec le MTU.
• La couche IF (interface) vérifie qu’aucun paquet sortant ne dépasse la limite MTU.
• Les paquets sont placés dans la file de sortie de l’unité et transmis par l’adaptateur de
réseau au système destinataire.
• A l’arrivée, les paquets sont placés dans la file de réception du pilote d’unité, et transmis
à IP via la couche Interface.
• Si l’IP du système destinataire détermine que l’IP du système expéditeur a fragmenté un
bloc de données, il rassemble les fragments dans leur forme d’origine et passe les
données à TCP ou à UDP :
– TCP réassemble les segments d’origine et place l’entrée dans le tampon de réception
du socket.
– UDP passe simplement l’entrée dans le tampon de réception du socket.
• Lorsque l’application émet une requête de lecture, les données ad hoc sont copiées
depuis le tampon de réception du socket (se trouvant dans la mémoire du noyau) dans le
segment de travail de l’application.
Gestion de la mémoire du sous-système de communication (mbuf)
Pour prévenir la fragmentation de la mémoire du noyau et une surcharge d’appels à
xmalloc(), les pools de tampons usuels sont partagés par les différentes couches du
sous-système de communication. La fonction de gestion des mbuf contrôle deux pools de
tampons : un pool de tampons de faible capacité (256 octets chacun), simplement appelés
mbuf, et un pool de tampons de capacité élevée (4 096 octets chacun), généralement
appelés grappes mbuf ou grappes. Les pools sont constitués d’éléments fixes de mémoire
virtuelle du noyau – ce qui signifie qu’ils résident en permanence en mémoire physique et
ne font jamais partie de pages évacuées. En conséquence, la capacité de mémoire réelle,
disponible pour la pagination dans les programmes d’application et les données, est
diminuée d’un volume équivalent à l’augmentation de la capacité des pools mbuf.
Outre le fait d’éviter la duplication, le partage des pools mbuf et grappes permet aux
différentes couches de se passer les pointeurs, réduisant les appels de gestion mbuf et les
copies de données.
Couche socket
Les sockets fournissent l’interface de programmation API au sous-système de
communication. Il en existe plusieurs types, offrant différents niveaux de service par le biais
de protocoles de communication différenciés. Les sockets de type SOCK_DGRAM utilisent
le protocole UDP. Les sockets de type SOCK_STREAM utilisent le protocole TCP.
La sémantique d’ouverture, de lecture et d’écriture relative aux sockets est semblable à
celle qui régit la manipulation des fichiers.
La taille des tampons de la mémoire virtuelle du système (c’est-à-dire la capacité totale des
pools mbuf) utilisés en entrée et sortie des sockets est limitée par les valeurs par défaut du
système (il est possible de passer outre ces valeurs pour un socket donné par un appel à la
routine setsockopt()) :
udp_sendspace Taille des tampons des sockets de datagrammes. Les valeurs par
et
défaut sont respectivement de 9216 et 41600.
udp_recvspace
tcp_sendspace
et
tcp_recvspace
Taille des tampons des sockets de flux. Par défaut : 16384 (les deux).
Contrôle et optimisation des E/S de communication
9-3
Pour afficher ces valeurs, entrez :
$ no –a
Pour les définir (en tant qu’utilisateur root), entrez, par exemple :
# no –o udp_sendspace=nouvelle-valeur
Nouvelle-valeur doit être inférieure ou égale au paramètre sb_max, qui contrôle la taille
maximale d’espace utilisable par un tampon d’envoi ou de réception de socket. sb_max est
affiché par no –a et défini (avanttoute tentative d’augmentation de sa valeur courante) par
la commande no :
# no –o sb_max=nouvelle-limite
Remarque : La taille des tampons d’envoi et de réception de socket ne doit pas
dépasser sb_max octets, sb_max constituant une valeur plafond au niveau de la
consommation d’espace tampon. Les deux quantités ne sont toutefois pas mesurées de
la même manière : la taille du tampon limite la quantité de données qui peut s’y trouver ;
sb_max limite le nombre d’octets de mbuf qui peut se trouver dans le tampon à un
instant donné. Dans un environnement Ethernet par exemple, chaque grappe mbuf de
4 096 octets peut contenir juste 1500 octets de données. Dans ce cas, sb_max doit être
2,73 fois supérieur à la taille de tampon de socket, pour atteindre la capacité spécifiée.
Empiriquement, nous préconisons de donner à sb_max une valeur au moins double de
la taille du tampon de socket.
Flux d’envoi
Lorsqu’une application écrit dans un socket, les données sont copiées de l’espace
utilisateur dans le tampon d’envoi du socket, dans l’espace du noyau. Selon la quantité de
données copiées, le socket les place dans le mbuf ou dans les grappes. Une fois la copie
terminée, la couche socket appelle la couche transport (TCP ou UDP), et lui passe un
pointeur sur la liste des mbuf liés (chaîne mbuf).
Flux de réception
Du côté réception, une application ouvre un socket et y lit des données. Si le tampon de
réception n’en contient pas, la couche socket met la routine de l’application à l’état ”veille”
(bloqué) jusqu’à l’arrivée de données. Lorsque des données arrivent, elles sont placées
dans la file du tampon de réception du socket et la routine de l’application peut être diffusée.
Les données sont ensuite copiées dans le tampon de l’application (dans l’espace
utilisateur), la chaîne mbuf est libérée et le contrôle revient à l’application.
Création de socket
Sous AIX Version 4.3.1 et ultérieures, la valeur sockthresh détermine la proportion de la
mémoire réseau du système qui peut être utilisée avant que la création de socket ne soit
désactivée. La valeur de sockthresh est fournie sous la forme d’un pourcentage de
thewall. Elle est par défaut de 85% et peut prendre toute valeur comprise entre 1 et 100, à
condition toutefois que sockthresh ne soit pas inférieure à la quantité de mémoire
actuellement utilisée.
L’option sockthresh a pour but d’éviter que de trop nombreuses connexions soient
ouvertes, conduisant à l’utilisation de la totalité de la mémoire réseau disponible sur la
machine. Dans ce cas de figure, il ne resterait plus de mémoire pour les autres opérations
et la machine, bloquée, devrait être redémarrée. Utilisez sockthresh pour définir à partir
de quel point les nouveaux sockets sont refusés. Les appels vers socket() et socketpair()
échoueront (erreur ENOBUFS), et les requêtes de connexion entrantes seront annulées de
manière transparente. Ainsi, la mémoire réseau restant disponible sur la machine pourra
être utilisée par les connexions existantes et aucun blocage de la machine ne sera à
craindre.
Le décompte netstat –m sockets not created because sockthresh was
reached est incrémenté chaque fois que la création d’un nouveau socket est refusé parce
que la quantité de mémoire réseau déjà utilisée est supérieure à la valeur de sockthresh.
9-4
AIX 4.3 Guide d’optimisation
Pour afficher sockthresh, entrez :
$ no –o sockthresh
Pour le définir (en tant qu’utilisateur root), entrez :
# no –o sockthresh=Nouvelle–valeur
Pour affecter à sockthresh sa valeur par défaut, entrez :
# no –d sockthresh
Fonctions UDP et TCP
Les deux sections suivantes décrivent les fonctions UDP et TCP. Pour faciliter la
comparaison entre les deux, chaque section est divisée en rubriques : connexion, détection
des erreurs, reprise sur erreur, contrôle du flux, taille des données et gestion du MTU.
Couche UDP
UDP offre un protocole économique pour les applications dotées de fonctions susceptibles
de traiter les incidents de communication. UDP convient bien aux applications de style
”requête-réponse”. Une application de ce type devant de toutes façons gérer les incidents
de réponse, il suffit de peu pour lui faire gérer les erreurs de communication comme une
des causes possibles d’un défaut de réponse. C’est pourquoi, outre son faible coût, des
sous-systèmes tels NFS, ONC RPC, DCE RPC et DFS utilisent UDP.
Connexion
Aucun. UDP est un protocole sans état. Chaque requête reçue de
l’appelant est gérée indépendamment de celles qui la précèdent ou la
suivent. (Si la sous-routine connect() est appelée pour un socket de
datagramme, les informations sur la destination sont considérées
comme une technique pour placer en mémoire cache l’adresse résolue,
pour un usage ultérieur. Il n’y a pas de liaison effective entre le socket
et l’adresse, ou d’incidence sur l’UDP du système destinataire.)
Détection
d’erreur
Création et vérification de total de contrôle. L’UDP expéditeur établit le
total de contrôle et l’UDP destinataire le vérifie. Si le contrôle est
négatif, le paquet est abandonné.
Recouvrement
d’erreur
Aucun. UDP n’accuse pas réception des paquets et ne détecte pas leur
perte – en cours de transmission ou par saturation du pool de tampons.
En conséquence, UDP ne retransmet jamais de paquet. La reprise doit
être exécutée par l’application.
Contrôle de flux
Aucun. Lorsqu’UDP est invité à émettre, il envoie un paquet à IP.
Lorsqu’un paquet arrive en provenance d’IP, il est placé dans le tampon
de réception du socket. Si la file du tampon de la carte/du pilote d’unité
est saturée, le paquet est abandonné sans aucune notification d’erreur.
C’est à l’application ou au sous-système expéditeur de détecter l’erreur
(délai imparti dépassé) et de relancer la transmission.
Taille des
données
Doit tenir dans un seul tampon. Ce qui implique que les pools de
tampons de deux côtés de UDP disposent de tampons dont la taille
réponde aux besoins des applications. La taille maximale d’un paquet
UDP est de 64 ko. Bien entendu, une application qui génère des blocs
plus grands peut les scinder elle-même en plusieurs datagrammes
– ce que fait DCE, par exemple – mais il est plus simple de passer
par TCP.
Gestion de MTU Aucun. Le traitement des données de taille supérieure à la taille du
MTU (maximum transfer unit) pour l’interface est laissé à la charge d’IP.
Si IP doit fragmenter les données pour les adapter au MTU, la perte
des fragments devient une erreur, qui doit être gérée par l’application
ou le sous-système.
Contrôle et optimisation des E/S de communication
9-5
Flux d’envoi
Si udp_sendspace est suffisamment grand pour contenir le datagramme, les données de
l’application sont copiées dans des mbuf de la mémoire du noyau. Si le datagramme est
plus grand que udp_sendspace, une erreur est renvoyée à l’application.
Si le datagramme est supérieur ou égal à 936 octets, il est copié dans une ou plusieurs
grappes de 4 ko. Le reste (et l’éventuel datagramme complet), de moins de 936 octets est
copié dans 1–4 mbufs. Par exemple, une écriture de 8704 octets est copiée dans deux
grappes et le reste dans trois mbuf. UDP ajoute l’en-tête UDP (dans le même mbuf, si
possible), effectue un total de contrôle sur les données et appelle la routine IP ip_output.
Flux de réception
UDP vérifie le total de contrôle et met les données en file d’attente sur le socket adéquat. Si
la limite udp_recvspace est dépassée, le paquet est rejeté. (Le décompte de ces rejets est
consigné par netstat –s sous l’intitulé ”udp:” ”socket buffer overflows.”)
Si l’application est en attente d’un receive ou d’un read sur le socket, elle est placée en file
d’attente d’exécution. receive copie alors le datagramme dans l’espace d’adressage de
l’utilisateur et libère le mbuf : l’opération receive est terminée. Normalement, le destinataire
adresse un accusé de réception et un message à l’expéditeur.
Couche TCP
TCP fournit un protocole de transmission fiable. TCP convient aux applications qui, au
moins par périodes, sont essentiellement en mode entrée ou en mode sortie. TCP assurant
que les paquets arrivent à destination, l’application est libérée de la détection d’erreur et
des tâches de reprise. Parmi les applications exploitant le transport via TCP, citons : ftp,
rcp et telnet. DCE peut l’utiliser s’il est configuré pour exploiter un protocole orienté
connexion.
9-6
Connexion
Explicite. L’instance de TCP recevant la requête de connexion d’une
application (dite l’initiateur) établit une session avec son homologue sur
l’autre système (dit l’écouteur). Tous les échanges de données et de
paquets de contrôle ont lieu dans le cadre de cette session.
Détection
d’erreur
Création et vérification de total de contrôle. Le TCP expéditeur établit le
total de contrôle et le TCP destinataire le vérifie. Si le contrôle est
négatif, le destinataire ne reçoit pas d’accusé de réception du paquet.
Recouvrement
d’erreur
Intégrale. TCP détecte les erreurs au niveau des totaux de contrôle et
les pertes de paquet ou de fragment, via le dépassement de délai. En
cas d’erreur, TCP retransmet les données jusqu’à ce que la réception
aboutisse (ou notifie l’application d’une erreur irrémédiable).
Contrôle de flux
Renforcée. TCP adopte une technique dite de fenêtre coulissante pour
vérifier la livraison à l’application destinataire. Le concept de fenêtre
coulissante est illustré à la figure ”Fenêtre coulissante TCP”.
(Les enregistrements illustrés ont pour seul objet de clarifier les choses.
TCP traite les données comme un flux d’octets et ne garde pas trace
des limites d’articles, qui sont définies par l’application).
AIX 4.3 Guide d’optimisation
fenêtre de
transmission
données
non acquittées
données
acquittées
expéditeur TCP
ec5
art6
art7
application expéditrice
(en veille)
art8
flux des données
ec5
destinataire TCP
...
art4
art6
art
espace disponible pour
données en transit
r
fenêtre de réception
application réceptrice
(en traitement)
Fenêtre coulissante TCP
Contrôle et optimisation des E/S de communication
9-7
Sur la figure, l’application expéditrice est en veille, car elle a tenté
d’écrire des données qui auraient conduit TCP à saturer le tampon du
socket d’envoi (tcp_sendspace). Le TCP expéditeur détient toujours la
fin de art5, l’intégralité de art6 et art7, et le début de art8. Le TCP
destinataire n’a pas encore reçu la fin de art7, ni art8. L’application
réceptrice a reçu art4 et le début de art5 lors de sa dernière lecture du
socket, et elle procède actuellement au traitement des données.
Lorsqu’elle effectuera une nouvelle lecture du socket, elle recevra (en
supposant une lecture suffisamment vaste) la fin de art5, art6, et les
parties de art7 et art8 arrivées à ce moment.
Au moment de cette lecture, le TCP destinataire acquitte ces données,
le TCP expéditeur les abandonne, l’écriture en cours se termine et
l’application expéditrice passe à l’état actif. (Pour éviter de surcharger le
trafic réseau lorsque l’application lit de faibles quantités de données,
TCP diffère l’acquittement jusqu’à ce que l’application réceptrice ait lu
une quantité de données au moins égale à la moitié de la taille de la
fenêtre réceptrice ou au double de la taille maximale de segment.)
Au cours de l’établissement d’une session, l’initiateur et l’écouteur
dialoguent pour déterminer leur capacité respective de mise en tampon
des données en entrée et en sortie. La taille de la fenêtre est celle de la
plus petite des tailles. A mesure que les données sont inscrites dans le
socket, elles sont placées dans le tampon de l’expéditeur. Lorsque le
destinataire indique qu’il dispose d’espace, l’expéditeur transmet
suffisamment de données pour remplir cet espace (s’il en dispose, bien
entendu). Lorsque l’application réceptrice lit le socket, le TCP récepteur
renvoie autant de données qu’il en détient dans son tampon. Il informe
ensuite l’expéditeur que les données ont bien été transmises. Ce n’est
qu’alors que l’expéditeur supprime les données de son propre tampon,
déplaçant effectivement la fenêtre vers la droite, en proportion des
données transmises. Si la fenêtre est saturée, parce que l’application
réceptrice ne suit pas, la routine expéditrice est bloquée (ou reçoit un
errno spécifique) lorsqu’elle tente d’écrire dans le socket.
La figure ”Taille des fenêtres TCP” illustre la relation entre la taille des
tampons du socket et celle de la fenêtre.
tcp_sendspace
inutilisé
tcp_recvspace
initiateur
tailles
maximales
des fenêtres
écouteur
tcp_recvspace
tcp_sendspace
Taille des fenêtres TCP
9-8
AIX 4.3 Guide d’optimisation
tcp_recvspace est, dans les deux exemples, inférieur à tcp_sendspace : dans la mesure où la technique de déplacement de fenêtre
impose que les deux systèmes aient la même capacité de tampon disponible, la taille de la fenêtre est définie à son minimum dans les deux
directions. L’espace nominal supplémentaire disponible illustré n’est
jamais utilisé.
Si le paramètre rfc1323 est à 1, la taille maximale de la fenêtre TCP est
de 4 Go (et non de 64 ko).
Taille des
données
Indéfinie. TCP ne traite ni articles ni blocs, mais un flux continu d’octets.
Si la capacité d’un tampon d’envoi excède celle que peut traiter le
tampon de réception, le flux d’octets est segmenté en paquets de la
taille du MTU. Dans la mesure où il gère l’insuffisance d’espace tampon
de façon transparente, TCP ne garantit pas que le nombre et la taille
des données reçues soient identiques à celles envoyées. C’est à
l’application d’identifier (des deux côtés), le cas échéant, les limites des
blocs ou des articles dans le flux de données.
Remarque : Pour échanger des messages de type requête/réponse via
TCP, l’application doit passer par setsockopt pour activer l’option
TCP_NODELAY. Ce qui provoque l’envoi immédiat du message par
TCP (dans le cadre des contraintes de la fenêtre coulissante), même
s’il n’atteint pas la taille MTU. Sinon, TCP attend jusqu’à
200 millisecondes d’autres données avant de transmettre le message.
Ce qui induit une baisse des performances.
Gestion de MTU Géré par segmentation dans TCP. Lors de l’établissement de la
connexion, l’initiateur et l’écouteur négocient la taille de segment
maximale (MSS) à utiliser. Le MSS est normalement inférieur au MTU
(voir ”Optimisation de la taille maximale de segment (MSS) TCP”,
page 9-21). Si le paquet de sortie dépasse le MSS, TCP effectue la
segmentation, rendant inutile la fragmentation dans IP. Le TCP
récepteur place normalement les segments dans la file de réception du
socket à mesure de leur arrivée. Si le TCP récepteur détecte la perte
d’un segment, il refuse l’acquittement et renvoie les segments suivants
tant qu’il ne reçoit pas le segment manquant.
Il n’existe bien entendu rien qui ressemble à une fonction libre. Les autres opérations
exécutées par TCP pour assurer la fiabilité de la connexion induisent un surcoût au niveau
processeur d’environ 7 à 12 % par rapport à UDP.
Flux d’envoi
Lorsque la couche TCP reçoit une requête d’écriture de la couche socket, elle affecte un
nouveau mbuf pour les informations d’en-tête et copie les données dans le tampon d’envoi
du socket, dans le mbuf d’en tête TCP (s’il y a de la place), ou dans une nouvelle chaîne
mbuf. Si les données copiées se trouvent dans des grappes, de nouvelles grappes ne sont
pas créées : un champ pointeur est défini dans le nouvel en-tête mbuf (cet en-tête fait partie
de la structure mbuf et n’a aucune relation avec l’en-tête TCP), pointant sur les grappes
contenant les données, évitant ainsi la charge d’une ou plusieurs copies de 4 ko. TCP
effectue ensuite un total de contrôle sur les données, met à jour les diverses variables d’état
utilisées pour le contrôle de flux et autres services, et, enfin, appelle la couche IP avec le
mbuf d’en-tête désormais lié à la nouvelle chaîne mbuf.
Flux de réception
Lorsque la routine d’entrée TCP reçoit des données d’IP, elle effectue un total de contrôle
sur l’en-tête et les données TCP, pour détecter d’éventuelles altérations, détermine la
connexion à laquelle sont destinées les données, supprime les informations d’en-tête, lie la
chaîne mbuf au tampon de réception du socket associé à la connexion, et fait appel à un
service socket pour activer l’application (si elle est en veille, comme expliqué plus haut).
Contrôle et optimisation des E/S de communication
9-9
Couche IP
Le protocole Internet (IP) fournit un service datagramme de base aux couches hautes.
S’il reçoit un paquet plus grand que le MTU de l’interface, il le fragmente et envoie les
fragments au système destinataire, lequel les réassemble sous leur forme d’origine. En cas
de perte d’un fragment au cours de la transmission, le paquet incomplet est rejeté par le
destinataire. Le délai d’attente par IP d’un fragment manquant est défini par le paramètre
ipfragttl, affiché et renseigné via la commande no.
La taille maximale de la file d’attente de paquets IP reçus de l’interface réseau est
contrôlée par le paramètre ipqmaxlen, défini et affiché via no. Si la taille de la file d’attente
en entrée atteint ce chiffre, les paquets suivants sont abandonnés.
Flux d’envoi
Lorsque la routine de sortie IP reçoit un paquet émis par UDP ou TCP, elle identifie
l’interface à laquelle envoyer la chaîne mbuf, met à jour et effectue un total de contrôle sur
la partie IP de l’en-tête, et passe le paquet à la couche interface (IF).
IP détermine le pilote et la carte d’unité à utiliser, en fonction du numéro du réseau. La table
d’interface du pilote définit le MTU maximal pour ce réseau. Si le datagramme est plus petit
que le MTU, IP insère l’en-tête IP dans le mbuf existant, effectue un total de contrôle sur
l’en-tête IP et appelle le pilote pour envoyer la trame. Si la file d’envoi du pilote est saturée,
une erreur EAGAIN est renvoyée à IP, qui la transmet à UDP, lequel la transmet à son tour
à l’application. L’expéditeur n’a plus qu’à patienter et réessayer.
Si le datagramme est plus grand que le MTU (ce qui ne se produit que dans UDP), IP le
divise en fragments de taille égale à celle du MTU, ajoute à chaque fragment un en-tête IP
(dans un mbuf), et appelle le pilote pour chaque trame de fragment. Si la file d’envoi du
pilote est saturée, une erreur EAGAIN est renvoyée à IP. IP rejette tous les fragments non
envoyés associés à ce datagramme et renvoie EAGAIN à UDP, qui le transmet à
l’application expéditrice. UDP renvoie EAGAIN à l’application expéditrice. IP et UDP ne
plaçant pas les messages en file d’attente, il appartient à l’application de différer l’envoi et
de le tenter ultérieurement.
Flux de réception
Sous AIX version 3, lorsque la routine d’entrée IP reçoit le contrôle suite à une interruption
hors niveau planifiée par IF, elle ôte la chaîne mbuf de la file d’attente, vérifie le total de
contrôle de l’en-tête IP pour s’assurer qu’il n’est pas altéré, et détermine si le paquet est
destiné à ce système. Dans l’affirmative, et si la trame n’est pas un fragment, IP passe la
chaîne mbuf à la routine d’entrée TCP ou UDP.
Sous AIX version 4.1, la couche demux (démultiplexeur – couche IF dans la version 3)
appelle IP sur la routine d’interruption. Toute activité de planification ou de mise (ou retrait)
en file d’attente est interrompue. IP vérifie le total de contrôle de l’en-tête IP pour s’assurer
qu’il n’est pas altéré, et détermine si le paquet est destiné à ce système. Dans l’affirmative,
et si la trame n’est pas un fragment, IP passe la chaîne mbuf à la routine d’entrée TCP
ou UDP.
Si la trame reçue est un fragment de datagramme (ce qui ne peut se produire que dans
UDP), IP bloque la trame. A réception des fragments suivants, ils sont fusionnés en un
datagramme logique, lequel, une fois complet, est transmis à UDP. IP bloque les fragments
d’un datagramme incomplet jusqu’à expiration du délai ipfragttl (spécifié via no). Le délai
ipfragttl par défaut est de 30 secondes (valeur ipfragttl de 60). En cas de perte de
fragments (suite à un incident réseau, une insuffisance d’espace mbuf, une saturation de la
file de transmission, etc.), IP ne les reçoit jamais. A l’expiration de ipfragttl, IP rejette les
fragments reçus. Ce qui est consigné par netstat –s sous l’intitulé ”ip:”
”fragments dropped after timeout”.”
9-10
AIX 4.3 Guide d’optimisation
Couche IF (couche Demux sous AIX version 4.1)
Flux d’envoi
Lorsque la couche IF reçoit un paquet émis par IP, elle associe un en-tête de liaison de
couche au début du paquet, vérifie que le format des mbuf est conforme aux spécifications
d’entrée du pilote d’unité, puis appelle la routine d’écriture du pilote de l’unité.
Flux de réception
Sous AIX version 3, lorsque la couche IF reçoit un paquet du pilote d’unité, elle supprime
l’en-tête de liaison, place la chaîne mbuf sur la file d’attente d’entrée IP (par le biais de
pointeurs, et non par copie) et planifie une interruption hors niveau pour exécuter le
traitement d’entrée IP.
Sous AIX version 4.1, lorsque la couche demux reçoit un paquet du pilote d’unité, elle
appelle IP sur la routine d’interruption pour exécuter le traitement d’entrée IP.
Cartes réseau local et pilotes d’unité
Différents types de cartes réseau sont acceptés dans l’environnement AIX. Ces cartes se
distinguent non seulement par les protocoles et supports de communication qu’elles
prennent en charge, mais également par leur interface avec le bus d’E/S et le processeur.
De même, les pilotes d’unité se différencient par la technique de transfert des données
entre la mémoire et les cartes. La description ci-après s’applique globalement à la plupart
des cartes et des pilotes d’unité, quelques points de détail étant néanmoins différents.
Flux d’envoi
Au niveau de la couche du pilote d’unité, la chaîne mbuf contenant le paquet est placée sur
la file de transmission. Le nombre maximal de tampons de sorties qui peut être en file
d’attente est contrôlé par le paramètre système xmt_que_size. Dans certains cas, les
données sont copiées dans les tampons DMA du pilote. La carte est ensuite appelée à
démarrer les opérations DMA.
A ce niveau, le contrôle revient à la routine de sortie TCP ou UDP, laquelle continue à
émettre tant qu’elle a des données à envoyer. Le contrôle revient ensuite à l’application, qui
s’exécute en mode asynchrone pendant que la carte transmet des données. Une fois la
transmission terminée, la carte interrompt le système et les routines d’interruption d’unité
sont appelées pour adapter les files de transmission et libérer les mbuf qui contenaient les
données transmises.
Flux de réception
Lorsque des trames sont reçues par une carte, elles sont transférées dans une file de
réception gérée par le pilote. Cette file d’attente peut être constituée de mbuf ou d’un pool
de tampons distinct géré par le pilote d’unité. Dans les deux cas, les données se trouvent
dans une chaîne mbuf lorsqu’elles passent du pilote d’unité à la couche IF.
Certains pilotes reçoivent les trames DMA dans une zone de mémoire fixe. Ils affectent
ensuite des mbuf et y copient les données. Les pilotes/cartes recevant des trames MTU
volumineuses peuvent réceptionner les trames DMA directement dans des grappes mbuf.
Le pilote passe le contrôle de la trame au protocole approprié (IP dans cet exemple) en
appelant une fonction de démultiplexage qui identifie le type de paquet et place le mbuf
contenant le tampon dans la file d’entrée de ce protocole. A défaut de mbuf disponible, ou si
la file d’entrée du plus haut niveau est saturée, les trames entrantes sont rejetées.
Contrôle et optimisation des E/S de communication
9-11
Optimisation de TCP et UDP
Les valeurs optimales des paramètres de communication varient selon le type de réseau et
les caractéristiques des E/S de communication du système dominant et des programmes
d’application. Les sections ci–après décrivent les principes généraux d’optimisation des
communications, et poursuivent avec des conseils spécifiques destinés à différents types de
réseaux locaux.
Recommandations
Vous pouvez viser soit un débit maximal, soit une utilisation minimale de la mémoire. Les
conseils qui suivent s’appliquent à l’une ou l’autre des approches, parfois aux deux.
Optimisation du débit de sortie
Protocoles requête-réponse
• Pour maximiser le nombre de transactions par seconde, optez pour des messages
courts.
• Pour maximiser le nombre d’octets par seconde, optez pour des messages supérieurs ou
égaux à 1000 octets et juste inférieurs ou égaux à un multiple de 4096 octets.
• Si les requêtes et les réponses sont de taille fixe et tiennent dans un seul datagramme,
passez par UDP :
– Si possible, définissez des tailles d’écriture qui soient des multiples de la taille du MTU
diminuée de 28 octets pour laisser la place aux en-têtes standard IP et UDP.
– Il est plus efficace qu’une application écrive des messages longs, qui sont ensuite
fragmentés et réassemblés par IP, plutôt que de multiplier les écritures.
– Chaque fois que possible, faites appel à la routine connect pour associer une adresse
au socket UDP. Cette opération peut être impossible sur un serveur communiquant
avec plusieurs clients via un seul socket.
• Si les requêtes et les réponses sont de taille variable, passez par TCP assorti de l’option
TCP_NODELAY. Nous avons mesuré que la charge de TCP est négligeable par rapport à
celle d’UDP, notamment si des tailles d’écriture optimales sont spécifiées.
– Pour éviter que des données ne soient copiées dans le noyau, définissez des tailles
d’écriture supérieures à 936 octets.
– Optez pour des écritures de taille égale ou légèrement inférieures à un multiple de la
taille MTU. Ceci pour éviter l’envoi d’un segment (paquet) ne contenant que quelques
octets.
Flux
• TCP offre un débit de sortie supérieur à celui d’UDP et assure la fiabilité de la
transmission.
• La taille des écritures doit être un multiple de 4 096 octets. Si possible, les écritures
doivent être de la taille du MSS (voir ”Optimisation de la taille maximum de segment
(MSS) TCP”).
Optimisation de la mémoire
• Si votre trafic est essentiellement local, optez pour la plus grande taille de MTU acceptée
par le type de votre réseau : vous minimiserez la fragmentation de paquets échangés par
les systèmes locaux. Avec, en contrepartie, une fragmentation dans les passerelles
connectant votre réseau à d’autres réseaux locaux dotés de MTU de taille inférieure
(voir ”Optimisation de la taille maximum de segment (MSS) TCP”).
• Chaque fois que possible, les programmes d’application doivent lire et écrire des
volumes :
9-12
AIX 4.3 Guide d’optimisation
– soit inférieurs ou égaux à 935 octets,
– soit égaux ou légèrement inférieurs à 4 096 octets (ou des multiples) :
Le premier sera placé dans les mbufs 1 à 4, les suivants feront bon usage des grappes
de 4 096 octets utilisées pour les écritures de taille supérieure à 935 octets. Ecrire
936 octets entraîne un gaspillage de 3 160 octets par écriture : l’application peut saturer
udp_recvspace (avec sa valeur par défaut de 65 536) avec 16 écritures – ne totalisant
que 14 976 octets de données.
Passer par TCP gaspille temps et mémoire. TCP tente de former des données
délimitées en paquets de la taille du MTU. Si le MTU du réseau est plus grand que
14 976 octets, TCP place la routine d’envoi à l’état veille dès que la limite de
tcp_sendspace est atteinte. Il reçoit un acquittement (ACK) de dépassement de délai
du récepteur pour forcer l’écriture des données.
Remarque : Si vous modifiez des paramètres via la commande no, les modifications ne
sont effectives que jusqu’à l’amorçage système suivant : les paramètres sont alors
réinitialisés à leur valeur par défaut. Pour pérenniser des modifications, placez la
commande no appropriée dans le fichier /etc/rc.net.
Optimisation des files de transmission et de réception de la carte
La plupart des gestionnaires de communication proposent une série de paramètres
optimisables qui permettent de contrôler les ressources de transmission et de réception.
Ces paramètres déterminent en général les limites des files d’attente de transmission et de
réception, mais ils peuvent également contrôler le nombre et la taille des tampons ou
d’autres ressources. La limitation porte sur le nombre de tampons ou de paquets qui
peuvent être placés en file d’attente avant transmission, ou sur le nombre de tampons
disponibles pour la réception de paquets. Ces paramètres peuvent être optimisés de
manière à permettre un placement suffisant en file d’attente au niveau de la carte, afin de
gérer les pointes de charge générées par le système ou le réseau.
Files d’attente de transmission
Les gestionnaires de périphériques peuvent limiter la “file de transmission”. Les limites
peuvent être matérielles ou logicielles, selon le type de gestionnaire et de carte. Certains
gestionnaires ne proposent qu’une file d’attente matérielle, alors que d’autres offrent des
files matérielles et logicielles. D’aucuns autorisent un contrôle de la file matérielle en interne
et la modification des limites de la file logicielle. En principe, le gestionnaire de périphérique
place le paquet à transmettre directement dans la file d’attente matérielle de la carte. Si le
CPU système est rapide par rapport au réseau, ou sur un système SMP, il peut arriver que
le système produise les paquets à transmettre plus rapidement que le réseau ne peut les
absorber. La file d’attente matérielle sera donc saturée. Dans ce cas de figure, certains
gestionnaires proposent alors une file d’attente logicielle qui accueille les paquets en attente
de transmission. Lorsque la limite de la file logicielle est atteinte, les paquets à transmettre
sont annulés. Les performances peuvent s’en trouver affectées puisque les protocoles de
haut niveau doivent retransmettre le paquet.
Avant AIX version 4.2.1, les limites supérieures des files de transmission étaient comprises
entre 150 et 250, selon les cartes. Les valeurs système par défaut étaient généralement
faibles, de l’ordre de 30. Depuis AIX version 4.2.1, les limites des files de transmission ont
été portées sur la plupart des gestionnaires à 2048 tampons. Les valeurs par défaut ont
également suivi cette augmentation, jusqu’à 512 pour la plupart des gestionnaires. Ces
valeurs par défaut ont été augmentées car les systèmes SMP et CPU ayant gagné en
rapidité, ils arrivaient à saturation avec les limites plus faibles autrefois définies.
Contrôle et optimisation des E/S de communication
9-13
Dans le cas de cartes présentant des limites de files matérielles, la modification de ces
valeurs entraîne une augmentation de la consommation de mémoire réelle en raison des
blocs de contrôle et tampons qui leur sont associés. Ces limites ne doivent donc être
rehaussées que si le besoin s’en fait sentir ou, sur les gros systèmes, si l’accroissement de
l’utilisation de la mémoire est négligeable. Dans le cas de limites de files de transmission
logicielles, l’augmentation de ces valeurs ne joue pas sur l’utilisation de la mémoire. Elle
permet seulement de mettre en file d’attente des paquets déjà alloués par les protocoles
des couches hautes.
Files d’attente de réception
Certaines cartes vous permettent de configurer le nombre de ressources à utiliser pour la
réception des paquets en provenance du réseau. Ces ressources peuvent définir le
nombre de tampons de réception (et leur taille) ou consister simplement en un paramètre
de file de réception (qui contrôle indirectement le nombre des tampons de réception).
Il peut s’avérer nécessaire d’augmenter les ressource de réception afin de gérer les pointes
de charge du réseau.
AIX 3.2.x et AIX 4.x
Avec les versions AIX 3.2.x, les gestionnaires permettaient à des applications spéciales de
lire les paquets reçus directement depuis le gestionnaire de périphérique. Le gestionnaire
de périphérique gérait une ’file d’attente de réception’ où ces paquets étaient placés en
attente. Un paramètre de taille de la file de réception permettait alors de limiter le nombre
de paquets pouvant être placés en attente pour ces applications. Sous AIX version 4.1,
cette interface n’est plus prise en charge, sauf pour les anciennes cartes MicroChannel à
condition que bos.compat LPP soit installé. Pour plus d’informations sur des cartes
spécifiques, reportez–vous à la table des paramètres.
Pour les cartes PCI et les cartes Microchannel plus récentes, les paramètres de file de
réception déterminent le nombre de tampons de réception mis à la disposition de la carte
pour la réception des paquets entrants.
Tampons spécifiques au périphérique
AIX version 4.1.4 et ultérieures prennent en charge des Mbufs spécifiques au périphérique.
Ce dernier peut ainsi affecter son propre jeu de tampons et le pré–configurer à l’intention de
DMA. Les performances s’en trouvent améliorées puisque la charge supplémentaire induite
par le mappage DMA n’intervient qu’une seule fois. Par ailleurs, la carte peut affecter les
tailles de tampon les plus adaptées à sa taille de MTU. Ainsi, ATM, HIPPI et le
commutateur SP2 acceptent une taille de MTU (paquet) de 64 ko. La taille maximale de
mbuf système est de 16 Ko. En accordant à la carte des tampons de 64 ko, vous permettez
l’écriture directe de grands blocs de 64 ko dans les tampons de 64 ko détenus par la carte,
au lieu de leur copie vers plusieurs tampons de 16 ko (ce qui permet une meilleure
affectation de la charge et libère les tampons excédentaires).
Les cartes acceptant des Mbuf spécifiques aux périphériques sont MCA ATM, MCA HIPPI
et les différentes cartes SP2 à grande vitesse.
Le revers de la médaille de ces tampons spécifiques au périphérique est un niveau de
complexité accru pour l’administrateur système. L’administrateur doit faire appel à des
commandes spécifiques au périphérique pour consulter les statistiques liées aux tampons
de carte et modifier les paramètres en conséquence. Si les statistiques révèlent que
certains paquets ont été annulés par manque de ressources en tampons, les tailles de
tampons doivent être augmentées.
Compte tenu de la diversité des gestionnaires et des utilitaires servant à modifier leurs
paramètres, ils ne sont pas décrits dans ce manuel. Les paramètres MCA ATM sont
répertoriés dans le tableau ci–après. Les statistiques ATM peuvent être consultées à l’aide
de la commande atmstat –d atm0 (substituez votre numéro d’interface à celui de
l’exemple).
9-14
AIX 4.3 Guide d’optimisation
Quand les paramètres doivent–ils être augmentés ?
• Lorsque le CPU est plus rapide que le réseau et que plusieurs applications utilisent le
même réseau. Ce cas de figure est classique sur un grand système multiprocesseur
(SMP).
• Lorsque les options de la commande ”no” définissent des valeurs élevées pour
tcp_sendspace ou tcp_recvspace, ou lors de l’exécution d’applications pouvant
émettre des appels système afin d’augmenter la taille des tampons de socket d’envoi et
de réception TCP. Ces valeurs élevées peuvent entraîner la transmission par le CPU
d’un grand nombre de paquets vers la carte, ces paquets devant alors être placés en
attente. Les procédures sont identiques pour udp_sendspace et udp_recvspace
pour les applications UDP.
• Lorsque le trafic est très intermittent (en rafales).
• Un trafic important de petits paquets peut consommer plus de ressources qu’un trafic
important de grands tampons. Ceci est dû au fait que les grands tampons étant plus
longs à envoyer sur le réseau, le débit des paquets est plus lent pour les gros paquets.
Comment savoir si les paramètres doivent être augmentés ?
Plusieurs utilitaires d’état peuvent servir à cet effet. A partir d’AIX version 4.1.0, les
statistiques de la carte indiquent le niveau haut de la file de transmission et le nombre de
dépassements. Vous pouvez utiliser netstat –v, ou faire appel directement aux utilitaires
statistiques de la carte (entstat pour Ethernet, tokstat pour Token Ring, fddistat pour FDDI,
atmstat pour ATM, etc.)
Voici par exemple le résultat de la commande entstat –d en0. Il indique les statistiques
concernant en0. L’option –d génère toutes les statistiques détaillées pour cette carte et doit
être utilisée pour garantir l’affichage de l’intégralité des statistiques. Le champ ”Max
Packets on S/W Transmit Queue:” indique le niveau haut de la file de transmission. Le
champ ”S/W Transmit Queue Overflow:” indique le nombre de dépassements de la file
d’attente logicielle.
Remarque : Ces valeurs peuvent faire référence à la ”file d’attente matérielle” si la carte
ne propose pas de ”file d’attente logicielle”. S’il existe des dépassements de la file de
transmission, il convient d’augmenter les limites de la file matérielle ou logicielle pour ce
gestionnaire.
Des ressources insuffisantes en réception sont indiquées par le champ ”Packets Dropped:”
et, selon le type de carte, sont signalées par ”Out of Rcv Buffers” ou ”No Resource Errors:”
ou toute autre indication comparable.
Contrôle et optimisation des E/S de communication
9-15
ETHERNET STATISTICS (en1) :
Device Type: IBM 10/100 Mbps Ethernet PCI Adapter (23100020)
Hardware Address: 00:20:35:b5:02:4f
Elapsed Time: 0 days 0 hours 7 minutes 22 seconds
Transmit Statistics:
––––––––––––––––––––
Packets: 1869143
Bytes: 2309523868
Interrupts: 0
Transmit Errors: 0
Packets Dropped: 0
Receive Statistics:
–––––––––––––––––––
Packets: 1299293
Bytes: 643101124
Interrupts: 823040
Receive Errors: 0
Packets Dropped: 0
Bad Packets: 0
Max Packets on S/W Transmit Queue: 41
S/W Transmit Queue Overflow: 0
Current S/W+H/W Transmit Queue Length: 1
Broadcast Packets: 1
Multicast Packets: 0
No Carrier Sense: 0
DMA Underrun: 0
Lost CTS Errors: 0
Max Collision Errors: 0
Late Collision Errors: 0
Deferred: 3778
SQE Test: 0
Timeout Errors: 0
Single Collision Count: 96588
Multiple Collision Count: 56661
Current HW Transmit Queue Length: 1
Broadcast Packets: 0
Multicast Packets: 0
CRC Errors: 0
DMA Overrun: 0
Alignment Errors: 0
No Resource Errors: 0
Receive Collision Errors: 0
Packet Too Short Errors: 0
Packet Too Long Errors: 0
Packets Discarded by Adapter: 0
Receiver Start Count: 0
General Statistics:
–––––––––––––––––––
No mbuf Errors: 0
Adapter Reset Count: 0
Driver Flags: Up Broadcast Running
Simplex 64BitSupport
Une autre méthode consiste à utiliser l’utilitaire ’netstat –i’. Si cet utilitaire indique une valeur
non nulle dans la colonne ”Oerrs” pour une interface, cela signifie que vous êtes en
présence d’un dépassement de file d’attente en sortie. Ceci est valable pour toutes les
versions d’AIX.
9-16
AIX 4.3 Guide d’optimisation
Comment connaître la valeur des paramètres ?
Vous pouvez faire appel à la commande de liste des attributs lsattr –E –l
[nom–carte] ou utiliser SMIT pour afficher la configuration de la carte.
Selon les cartes, les noms des variables diffèrent. Ainsi, le paramètre correspondant à la
file de transmission peut être ”sw_txq_size”, ”tx_que_size” ou ”xmt_que_size” pour n’en
citer que quelques–uns. De même, les paramètres correspondant au pool de tampons et à
la taille de la file de réception peuvent être appelés ”rec_que_size”, rx_que_size”ou encore
”rv_buf4k_min”.
Voici le résultat de la commande lsattr –E –l atm0 sur une carte PCI 155 Mbs ATM. Il
indique que sw_txq_size a la valeur 250 et que les tampons de réception
rv_buf4K_min ont la valeur x30.
==== lsattr –E
dma_mem
regmem
virtmem
busintr
intr_priority
use_alt_addr
alt_addr
sw_txq_size
max_vc
min_vc
rv_buf4k_min
interface_type
adapter_clock
uni_vers
========
0x400000
0x1ff88000
0x1ff90000
3
3
no
0x0
250
1024
32
0x30
0
1
auto_detect
N/A
Bus Memory address of Adapter Registers
Bus Memory address of Adapter Virtual Memory
Bus Interrupt Level
Interrupt Priority
Enable ALTERNATE ATM MAC address
ALTERNATE ATM MAC address (12 hex digits)
Software Transmit Queue size
Maximum Number of VCs Needed
Minimum Guaranteed VCs Supported
Minimum 4K–byte pre–mapped receive buffers
Sonet or SDH interface
Provide SONET Clock
N/A
False
False
False
False
False
True
True
True
True
True
True
True
True
True
Voici un exemple de paramètres pour Microchannel 10/100 Ethernet généré en utilisant
lsattr –E –l ent0. Il indique que tx_que_size et rx_que_size ont tous deux la
valeur 256.
bus_intr_lvl
intr_priority
dma_bus_mem
bus_io_addr
dma_lvl
tx_que_size
rx_que_size
use_alt_addr
alt_addr
media_speed
ip_gap
11
3
0x7a0000
0x2000
7
256
256
no
0x
100_Full_Duplex
96
Bus interrupt level
Interrupt priority
Address of bus memory used for DMA
Bus I/O address
DMA arbitration level
TRANSMIT queue size
RECEIVE queue size
Enable ALTERNATE ETHERNET address
ALTERNATE ETHERNET address
Media Speed
Inter–Packet Gap
False
False
False
False
False
True
True
True
True
True
True
Comment modifier les paramètres ?
Le moyen le plus simple consiste à détacher l’interface (ifconfig en0 detach, par exemple)
puis à utiliser SMIT –> devices –> communications –> [type carte] –> change/show... pour
afficher les paramètres de la carte. Une fois les paramètres affichés, placez le curseur sur
celui que vous souhaitez modifier et appuyez sur F4 pour voir la fourchette des valeurs
minimale et maximale pour ce champ ou les différentes tailles possibles. Vous pouvez
sélectionner l’une de ces tailles et appuyez sur Entrée pour valider la requête et mettre à
jour la base de données ODM. Remettez la carte en ligne (ifconfig en0 [nomhôte], par
exemple). L’autre méthode permettant de modifier les paramètres est la commande chdev.
chdev –l [ifname] –a [nom–attribut]=nouvelle_valeur
Par exemple, pour ramener la valeur du paramètre tx_que_size ci–dessus sur en0
à 128, utilisez la séquence de commandes suivante. Vous noterez que ce gestionnaire
n’acceptant que quatre tailles différentes, il est préférable de faire appel à SMIT pour voir
quelles sont ces valeurs.
Contrôle et optimisation des E/S de communication
9-17
ifconfig en0 detach
chdev –l ent0 –a tx_que_size=128
ifconfig en0 [hostname] up
Les informations qui suivent documentent les différents paramètres d’optimisation de carte.
Ces paramètres et les valeurs indiquées concernent AIX 4.3.1 et peuvent être soumis à
modification. Ils sont destinés à vous aider à comprendre les divers paramètres, ou si le
système n’est pas disponible, à vous permettre de voir ces paramètres.
Les noms des paramètres, leurs valeurs par défaut et les fourchettes de valeurs sont issus
de la base de données ODM. Le champ de commentaires est issu de la commande
lsattr –E –l nom–interface.
Le champ Remarques contient des commentaires supplémentaires.
Carte MicroChannel (MCA)
Feature Code: 2980
(codename can’t say)
Ethernet High–Performance LAN Adapter (8ef5)
Parameter
Default
––––––––––– ––––––––
xmt_que_size
512
rec_que_size
30
rec_pool_size 37
Range
––––––––
20–2048
20–150
16–64
Comment
Notes
––––––––––––––––––––––––– ––––––––––
TRANSMIT queue size
SW TX queue
RECEIVE queue size
See Note 1
RECEIVE buffer pool size On Adapter
Remarques :
1. Il s’agit d’une file de réception logicielle fournie uniquement à des fins de compatibilité
avec les applications AIX 3.2.x utilisant l’interface du gestionnaire de périphérique
réseau pour lire les paquets directement à partir du gestionnaire. Cette file limite le
nombre de paquets entrants qui peuvent être placés en attente avant d’être reçus par
ces applications. Ce paramètre n’est défini que si bos.compat est installé.
Cette file d’attente n’est pas utilisée par la pile TCP/IP normale.
Feature Code: 2992
(codename Durandoak)
Ethernet High–Performance LAN Adapter (8f95)
Parameter
Default
Range
Comment
––––––––––––– ––––––––– –––––––– –––––––––––––––––––
xmt_que_size
512
20–2048 TRANSMIT queue size
Notes
––––––––––
SW queue
Feature Code: 2994
(codename SanRemo)
IBM 10/100 Mbps Ethernet TX MCA Adapter (8f62)
Parameter
Default
––––––––––– ––––––––
tx_que_size
64
rx_que_size
32
Range
––––––––––––––––
16,32,64,128,256
16,32,64,128,256
Comment
Notes
–––––––––––––––––––– ––––––––––
TRANSMIT queue size
HW queue
RECEIVE queue size
HW queue
Feature Code: 2970
(codename Monterey)
Token–Ring High–Performance Adapter (8fc8)
Parameter
Default Range
––––––––––––– –––––––– ––––––––
xmt_que_size 99
32–2048
rec_que_size 30
20–150
9-18
AIX 4.3 Guide d’optimisation
Comment
–––––––––––––––––––––
TRANSMIT queue size
RECEIVE queue size
Notes
––––––––––––
SW queue
See Note 1
Feature Code: 2972
(codename Wildwood)
Token–Ring High–Performance Adapter (8fa2)
Parameter
Default Range
Comment
––––––––––––– –––––––– –––––––– ––––––––––––––––––––––––––––
xmt_que_size 512
32–2048 TRANSMIT queue size
rx_que_size
32
32–160
HARDWARE RECEIVE queue size
Notes
––––––––––
SW queue
HW queue
Feature Code: 2727
(codename Scarborgh)
FDDI Primary Card, Single Ring Fiber
Parameter
Default Range
––––––––––––– –––––––– ––––––––
tx_que_size
512
3–2048
rcv_que_size 30
20–150
Comment
Notes
––––––––––––––––––––––––––––– –––––––––––
Transmit Queue Size (in mbufs)
Receive Queue
See Note 1
Feature Code: 2984
(codename Bumelia)
100 Mbps ATM Fiber Adapter (8f7f)
Parameter
Default
Range
Comment
Notes
––––––––––––––– ––––––– –––––––––– –––––––––––––––––––––––––––––– –––––
sw_queue
512
0–2048 Software transmit queue len. SW Queue
dma_bus_width
0x1000000 0x800000–0x40000000,0x100000
Amount of memory to map for DMA See Note 3
max_sml_bufs
50
40–400
Maximum Small ATM mbufs
Max 256 byte buffers
max_med_bufs
100
40–1000
Maximum Medium ATM mbufs Max 4KB buffers
max_lrg_bufs
300
75–1000
Maximum Large ATM mbufs
Max 8KB buffers,
See note 2
max_hug_bufs
50
0–400
Maximum Huge ATM mbufs
Max 16KB buffers
max_spec_bufs
4
0–400
Maximum ATM MTB mbufs
Max of max_spec_bufsize
spec_buf_size
64
32–1024
Max Transmit Block (MTB) size kbytes)
sml_highwater
20
10–200
Minimum Small ATM mbufs
Min 256 byte buffers
med_highwater
30
20–300
Minimum Medium ATM mbufs Min 4KB buffers
lrg_highwater
70
65–400
Minimum Large ATM mbufs
Min 8KB buffers
hug_highwater
10
4–300
Minimum Huge ATM mbufs
Min 16KB buffers
spec_highwater 20
0–300
Minimum ATM MTB mbufs
Min 64KB buffers
best_peak_rate 1500
1–155000 Virtual Circuit Peak Segmentation Rate
2. MCA ATM, le côté rcv (réception) utilise également de grands tampons (8 ko). La
logique de réception n’utilise que des tampons de 8 ko ; par conséquent, si cette taille se
révèle trop faible, les performances seront affectées.
Les autres tailles de tampons ne sont destinées qu’aux tampons de transmission.
3. MCA ATM, Si vous augmentez le nombre total de tampons, vous aurez peut–être à
modifier le paramètre dma_bus_width = 0x1000000. La largeur du bus mémoire
DMA détermine la quantité totale de mémoire utilisée pour les tampons ATM.
Augmentez la valeur de ce paramètre si vous recevez un message d’erreur lorsque vous
tentez d’augmenter le nombre maximum de tampons ou les limites du niveau haut.
Feature Code: 2989
(codename Clawhammer)
155 Mbps ATM Fiber Adapter (8f67)
Parameter
Default
Range
––––––––––––– –––––––– ––––––––
(same as ATM 100 adapter above)
Comment
Notes
–––––––––– –––––––
Contrôle et optimisation des E/S de communication
9-19
Cartes PCI
Feature Code 2985
(codename Klickitat)
IBM PCI Ethernet Adapter (22100020)
Parameter
Default
–––––––––––– ––––––––
tx_que_size
64
rx_que_size
32
Range
Comment
––––––––––––––––– –––––––––––––––––––
16,32,64,128,256 TRANSMIT queue size
16,32,64,128,256 RECEIVE queue size
Notes
–––––––––
HW Queues
HW Queues
Feature Code 2968
(codename Phoenix)
IBM 10/100 Mbps Ethernet PCI Adapter (23100020)
Parameter
Default
Range
Comment
Notes
–––––––––––––––– ––––––– –––––––––––––––– ––––––––––––––––––– ––––––––––––
tx_que_size
256
16,32,64,128,256 TRANSMIT queue size
HW Queue Note 1
rx_que_size
256
16,32,64,128,256 RECEIVE queue size
HW Queue Note 2
rxbuf_pool_size 384
16–2048
# buffers in receive Dedicated receive
buffer pool
buffers Note 3
Remarques sur Phoenix :
1. Avant AIX 4.3.2, la valeur par défaut de tx_queue_size était 64
2. Avant AIX 4.3.2, la valeur par défaut de rx_queue_size était 32
3. AIX 4.3.2, le gestionnaire a ajouté un nouveau paramètre pour contrôler le nombre de
tampons dédiés à la réception de paquets.
Feature Code: 2969
(codename Galaxy)
Gigabit Ethernet–SX PCI Adapter (14100401)
Parameter
–––––––––––––
tx_que_size
rx_que_size
receive_proc
Default Range
––––––– ––––––––
512 512–2048
512
512
6
0–128
Comment
Notes
–––––––––––––––––––––––––––––––––– –––––––––
Software Transmit Queueu size
SW Queue
Receive queue size
HW Queue
Minimum Receive Buffer descriptors
Feature Code: 2986
(codename Candlestick)
3Com 3C905–TX–IBM Fast EtherLink XL NIC
Parameter
Default
–––––––––––––– ––––––––
tx_wait_q_size
32
rx_wait_q_size
32
Range
––––––
4–128
4–128
Comment
––––––––––––––––––––––––––––
Driver TX Waiting Queue Size
Driver RX Waiting Queue Size
Notes
––––––––––
HW Queues
HW Queues
Feature Code: 2742
(codename Honeycomb)
SysKonnect PCI FDDI Adapter (48110040)
Parameter
Default
––––––––––––– ––––––––
tx_queue_size
30
RX_buffer_cnt
42
Range
––––––––
3–250
1–128
Comment
Notes
––––––––––––––––––– –––––––––––––––
Transmit Queue Size
SW Queue
Receive frame count Rcv buffer pool
Feature Code: 2979
(codename Skyline)
IBM PCI Tokenring Adapter (14101800)
Parameter
–––––––––––––
xmt_que_size
rx_que_size
9-20
Default
––––––––
96
32
AIX 4.3 Guide d’optimisation
Range
Comment
Notes
––––––– ––––––––––––––––––––––––––– ––––––––
32–2048 TRANSMIT queue size
SW Queue
32–160 HARDWARE RECEIVE queue size HW queue
Feature Code: 2979
(codename Cricketstick)
IBM PCI Tokenring Adapter (14103e00)
Parameter
–––––––––––––
xmt_que_size
rx_que_size
Default
––––––––
512
64
Range
––––––––
32–2048
32–512
Comment
Notes
–––––––––––––––––––– ––––––––
TRANSMIT queue size SW Queue
RECEIVE queue size
HW Queue
Feature Code: 2988
(codename Lumbee)
IBM PCI 155 Mbps ATM Adapter (14107c00)
Parameter
–––––––––––––
sw_txq_size
rv_buf4k_min
Default
Range
––––––––– ––––––––––
100
0–4096
48(0x30) 0–512(x200)
Comment
Notes
–––––––––––––––––––––––––––––– –––––––
Software Transmit Queue size
SW Queue
Minimum 4K–byte pre–mapped receive Buffers
Optimisation de la taille maximum de segment (MSS) TCP
Le protocole TCP comporte un mécanisme permettant aux deux extrémités d’une
connexion de négocier la taille maximale de segment (MSS) à utiliser sur la liaison. Chaque
extrémité se sert du champ OPTIONS de l’en–tête TCP pour proposer un MSS. Le MSS
choisi est la plus petite des valeurs proposées par les deux extrémités.
Le but de cette négociation est d’éviter les délais d’attente et la baisse de débit
consécutives à la fragmentation des paquets lorsqu’ils passent par des routeurs ou des
passerelles pour n’être réassemblés que sur l’hôte destinataire.
La valeur de MSS indiquée par le logiciel TCP au cours de la configuration de la connexion
diffère selon que l’autre extrémité est un système local, sur le même réseau physique
(c’est-à-dire ayant le même numéro de réseau), ou un système d’un réseau distant.
Réseau local
Si l’autre système est local, le MSS notifié par TCP est basé sur le MTU (maximum transfer
unit) de l’interface du réseau local :
TCP MSS = MTU – taille en–tête TCP – taille en–tête IP.
Il s’agit du maximum possible sans fragmentation IP : cette valeur est donc optimale par
définition, et aucune optimisation du MSS n’est requise pour les réseaux locaux.
Réseau distant
Lorsque l’autre extrémité se trouve sur un réseau distant, TCP sous AIX spécifie pour MSS
une valeur par défaut de 512 octets. Cette valeur conservatoire est basée sur le fait que
tous les routeurs IP prennent en charge un MTU d’au moins 576 octets.
Le MSS optimal pour les réseaux distants est basé sur le plus petit MTU des réseaux
intervenant sur la route entre la source et la destination. Il s’agit généralement d’un nombre
dynamique qui ne peut être établi que par une certaine recherche au niveau du MTU du
chemin. Le protocole TCP ne fournit aucun mécanisme permettant de déterminer ce
nombre, c’est pourquoi la valeur par défaut est couramment adoptée. Il est toutefois
possible de lancer une recherche du PMTU TCP à l’aide de la commande :
no –o tcp_pmtu_discover=1”
L’un des effets secondaires de ce paramètre est l’augmentation de la table de routage (une
entrée de plus par connexion TCP active). L’option de la commande no ”route_expire” doit
avoir une valeur non nulle afin que toute entrée de routage en mémoire cache non utilisée
soit supprimée de la table à l’issue de la durée d’inactivité ”route_expire”.
Contrôle et optimisation des E/S de communication
9-21
Cette valeur par défaut, qui convient bien à Internet en général, peut se révéler inutilement
restrictive pour les interréseaux d’un domaine administratif. Dans un environnement de ce
type, les tailles des MTU des réseaux physiques constitutifs sont connues et le MTU
minimal de même que le MSS optimal peuvent être déterminés par l’administrateur. AIX
offre plusieurs moyens pour forcer TCP à utiliser ce MSS optimal. Les hôtes source et cible
doivent tous deux prendre en charge ces fonctions. Dans un environnement hétérogène,
multifournisseur, la disponibilité de la fonction sur les deux systèmes peut être un facteur
déterminant dans le choix de la solution.
Routes statiques
Pour passer outre la valeur par défaut de MSS (512), il suffit de spécifier une route statique
vers un réseau distant spécifique et d’associer l’option –mtu à la commande route pour
spécifier le MTU à ce réseau. Dans ce cas, spécifiez le MTU minimal effectif de la route, au
lieu de calculer une valeur MSS.
Dans un environnement stable et limité, cette méthode permet un contrôle précis du MSS
réseau par réseau. Elle présente néanmoins quelques inconvénients :
• Elle est incompatible avec le routage dynamique.
• Elle devient peu pratique si le nombre de réseaux distants devient conséquent.
• Les routes statiques doivent être définies aux deux extrémités, pour que les deux côtés
négocient avec un MSS supérieur au MSS par défaut.
Option tcp_mssdflt de la commande no
La valeur par défaut (512) adoptée par TCP pour les réseaux distants peut être modifiée via
le paramètre tcp_mssdflt de la commande no. La modification s’applique à l’ensemble du
système.
La valeur destinée à remplacer la valeur de MSS par défaut doit être la valeur minimale de
MTU diminuée de 40 pour laisser la place aux en-têtes TCP et IP.
Dans un environnement où le MTU est supérieur au MTU par défaut, cette méthode offre
l’avantage d’éliminer la nécessité de définir le MSS réseau par réseau. Inconvénients :
• Augmenter la valeur par défaut peut entraîner une fragmentation au niveau du routeur IP
si la destination se trouve sur un réseau réellement éloigné et que les MTU des réseaux
intervenants sont inconnus.
• Le paramètre tcp_mssdflt doit avoir la même valeur sur l’hôte destination.
Sous-réseau et option subnetsarelocal de la commande no
Il est possible de faire partager à plusieurs réseaux physiques le même numéro de réseau,
par le biais de sous-réseaux (voir ”Adressage TCP/IP”). L’option subnetsarelocal de la
commande no spécifie, sur l’ensemble du système, si les sous-réseaux doivent être
considérés comme locaux ou distants. Avec subnetsarelocal=1 (valeur par défaut), l’hôte A
sur le sous-réseau 1 considère l’hôte B sur le sous-réseau 2 comme se trouvant sur le
même réseau physique.
La conséquence est que lorsque les hôtes A et B établissent une connexion, ils négocient le
MSS en supposant qu’ils se trouvent sur le même réseau. Chaque hôte indique un MSS sur
la base du MTU de son interface réseau. Ce qui conduit généralement au choix d’un MSS
optimal.
Cette approche présente plusieurs avantages :
• Elle ne requiert aucun liaison statique ; MSS est automatiquement négocié.
• Elle ne désactive ni ne supplante la négociation du MSS par TCP : de légères différences
de MTU entre réseaux adjacents peuvent ainsi être correctement gérées.
9-22
AIX 4.3 Guide d’optimisation
Inconvénients :
• Risque de fragmentation au niveau du routeur IP lorsque deux réseaux à fort MTU sont
reliés via un réseau à faible MTU. La figure ”Fragmentation inter–sous–réseaux” illustre
ce problème.
hôte
A
FDDI
routeur 1
MTU = 4 352
Ethernet
routeur 2
MTU = 1 500
FDDI
hôte
B
MTU = 4 352
Fragmentation inter-sous-réseaux
Dans ce scénario, les hôtes A et B établissement une connexion sur la base d’un MTU
commun de 4 352. Un paquet transitant de A vers B sera fragmenté par le routeur 1 et
défragmenté par le routeur 2 (et vice versa).
• Source et destination doivent considérer les sous-réseaux comme locaux.
Optimisation des performances du protocole IP
Au niveau de la couche IP, le seul paramètre optimisable est ipqmaxlen, qui contrôle la
longueur de la file d’entrée IP – citée précédemment (qui n’existe que sous AIX version 3).
Les paquets peuvent arriver très vite et saturer cette file d’entrée. Sous AIX, il n’y a aucun
moyen simple de savoir si cela s’est produit. Seul un compteur de dépassement peut être
affiché via la commande crash. Pour vérifier cette valeur, lancez la commande crash et, à
l’invite, entrez : knlist ipintrq. Le résultat est une valeur hexadécimale, variable
selon le système. Ajoutez ensuite 10 (hexa) à cette valeur et indiquez le total comme
argument de la commande od. Par exemple :
# crash
> knlist ipintrq
ipintrq: 0x0149ba68
> od 0149ba78 1
0149ba78: 00000000 <––
Valeur du compteur de déplacement de la
file d’entrée IP
>quit
Si le nombre résultant est strictement positif, un dépassement a eu lieu. La longueur
maximale de cette file d’attente est définie via la commande no. Par exemple :
no –o ipqmaxlen=100
permet la mise en file d’attente de 100 paquets. La valeur exacte à utiliser est déterminée
par la vitesse maximale de réception en rafale. Si celle-ci ne peut être déterminée, le
nombre de dépassement peut aider à déterminer l’augmentation requise. L’augmentation de
la taille de la file d’attente n’induit aucune consommation mémoire supplémentaire. Cette
augmentation peut néanmoins allonger le temps passé dans le gestionnaire d’interruption
hors niveau, dans la mesure où IP doit traiter davantage de paquets dans sa file d’entrée.
Ce qui risque d’affecter le temps CPU requis par les processus. Le choix est entre un faible
taux de rejet de paquets et la disponiblité de la CPU pour d’autres traitements. Le mieux est
d’augmenter ipqmaxlen par petits incréments si le choix n’est pas évident.
Optimisation des performances Ethernet
Ethernet a contribué à l’élaboration de l’algorithme du ”plus petit commun dénominateur”
pour le choix du MTU. Si une configuration inclut des réseaux Ethernet et d’autres réseaux
locaux, et que le trafic est soutenu, les MTU de tous les réseaux devront peut-être être
définis à 1 500 octets pour éviter la fragmentation lorsque les données arrivent sur un
réseau Ethernet.
Contrôle et optimisation des E/S de communication
9-23
• La valeur par défaut (1 500), qui est aussi la valeur maximale de MTU, ne doit pas être
modifiée.
• La taille de bloc de l’application doit être un multiple de 4 096 octets.
• Les paramètres relatifs à l’espace socket peuvent conserver leur valeur par défaut.
• Si la charge de travail prévoit une utilisation intensive de services faisant appel à UDP,
tels que NFS ou RPC, il convient d’augmenter la valeur de sb_max pour prendre en
compte le fait que chaque MTU de 1 500 octets utilise un tampon de 4 096 octets.
Optimisation des performances anneau à jeton (4 Mo)
La valeur par défaut de MTU (1 492 octets) convient aux réseaux en anneau à jeton
interconnectés à des réseaux Ethernet ou à des réseaux hétérogènes dont le MTU minimal
est inconnu.
• Sauf en cas de trafic intense entre le réseau et les réseaux externes, le MTU doit être
augmenté à sa valeur maximale (3 900 octets).
• La taille de bloc de l’application doit être un multiple de 4 096 octets.
• Les paramètres relatifs à l’espace socket peuvent conserver leur valeur par défaut.
• Si la charge de travail prévoit une utilisation intensive de services faisant appel à UDP,
tels que NFS ou RPC, il convient d’augmenter la valeur de sb_max pour prendre en
compte le fait que chaque MTU de 1 492 octets utilise un tampon de 4 096 octets.
Optimisation des performances anneau à jeton (16 Mo)
La valeur par défaut de MTU (1 492 octets) convient aux réseaux en anneau à jeton
interconnectés à des réseaux Ethernet ou à des réseaux hétérogènes dont le MTU minimal
est inconnu.
• Sauf en cas de trafic intense entre le réseau et les réseaux externes, le MTU doit être
augmenté à la valeur de 8 500 octets. Ce qui permet aux paquets NFS de 8 ko de tenir
dans un seul MTU. Augmenter encore le MTU à son maximum de 17 000 octets entraîne
rarement une amélioration significative du débit.
• La taille de bloc de l’application doit être un multiple de 4 096 octets.
• Les paramètres relatifs à l’espace socket peuvent conserver leur valeur par défaut.
• Si la charge de travail prévoit une utilisation intensive de services faisant appel à UDP,
tels que NFS ou RPC, et que le MTU doit conserver sa valeur par défaut à cause des
interconnexions, il convient d’augmenter la valeur de sb_max pour prendre en compte le
fait que chaque MTU de 1 492 octets utilise un tampon de 4 096 octets.
Optimisation des performances FDDI
En dépit d’un MTU relativement faible, ce support haute vitesse tire parti des augmentations
substantielles de la taille du tampon de socket.
• Sauf en cas de trafic intense entre le réseau et les réseaux externes, le MTU doit
conserver sa valeur par défaut (4 352 octets).
• Lorsque possible, une application exploitant TCP doit écrire par tranches de multiples de
4 096 octets à la fois (8 ou 16 ko de préférence), pour un débit maximal.
• Spécifiez no –o sb_max=(2*nouvelle-taille) pour relever le plafond de l’espace tampon
du socket.
• Spécifiez no –o *_*space=nouvelle-taille pour donner à l’espace d’envoi et de réception
du socket TCP et UDP la valeur par défaut de nouvel-espace. Nouvel–espace doit être
au moins égal à 57 344 octets (56 ko).
9-24
AIX 4.3 Guide d’optimisation
• Pour ESCALA modèle *90 ou plus rapide, utilisez no –o rfc1323=1 pour que la taille des
tampons de socket puisse être définie à une valeur supérieure à 64 ko. Suivez ensuite la
procédure précédente avec nouvelle-taille au moins égal à 128 ko.
Optimisation des performances ATM
• Sauf en cas de trafic intense entre le réseau et les réseaux externes, le MTU doit
conserver sa valeur par défaut (9 180 octets).
• Lorsque possible, une application exploitant TCP doit écrire par tranches de multiples de
4 096 octets à la fois (8 ou 16 ko de préférence), pour un débit maximal.
• Spécifiez no –o sb_max=(2*nouvelle-taille) pour relever le plafond de l’espace tampon
du socket.
• Spécifiez no –o *_*space=nouvelle-taille pour donner à l’espace d’envoi et de réception
du socket TCP et UDP la valeur par défaut de nouvel-espace. nouvel–espace doit être
au moins égal à 57 344 octets (56 ko).
• Pour ESCALA modèle *90 ou plus rapide, utilisez no –o rfc1323=1 pour que la taille des
tampons de socket puisse être définie à une valeur supérieure à 64 ko. Suivez ensuite la
procédure précédente avec nouvelle-taille au moins égal à 128 ko.
Optimisation des performances SOCC
• Le MTU doit conserver sa valeur par défaut (61 428 octets).
• Lorsque possible, une application exploitant TCP doit écrire par tranches de multiples de
28 672 octets à la fois (28 ko), pour un débit maximal.
• La valeur par défaut de l’espace d’envoi et de réception du socket TCP et UDP doit être
définie à 57 344 octets.
Optimisation des performances HIPPI
• Le MTU doit conserver sa valeur par défaut (65 536 octets).
• Lorsque possible, une application exploitant TCP doit écrire par tranches de
65 536 octets à la fois, pour un débit maximal.
• Donnez à sb_max une valeur supérieure à 2*655 360.
• La valeur par défaut de l’espace d’envoi et de réception du socket TCP et UDP doit être
définie à 655 360 octets. Spécifiez no –o rfc1323=1 pour que la taille des tampons de
socket puisse être définie à une valeur supérieure à 64 ko.
Contrôle et optimisation des E/S de communication
9-25
Optimisation du pool mbuf
Remarque : Cette section ne concerne que la version 3.2.5. Sous AIX version 4.1, le
mécanisme d’affectation des mbuf est sensiblement différent. Vous pouvez fixer la
quantité maximale de mémoire qui sera utilisée par le programme d’affectation du
réseau, comme vous le faites sous la version 3.2.5, c’est-à-dire avec la commande no et
le paramètre thewall. Les autres options d’optimisation disponibles sous la version 3.2.5
ont été supprimées de la version 4.1 car le mécanisme d’affectation des mbuf a une
fonction d’optimisation automatique.
Le sous-système réseau utilise une fonction de gestion de la mémoire qui dépend d’une
structure de données appelée mbuf. Les mbuf servent essentiellement à stocker des
données entrantes et sortantes du réseau. Disposer de pools mbuf de la taille adéquate
peut améliorer sensiblement les performances du réseau. A l’inverse, une configuration
inadéquate des pools mbuf affecte les performances réseau et système. Le système
d’exploitation AIX permet de configurer le pool mbuf en cours d’exploitation. Cet avantage
suppose de savoir quand et comment adapter les pools.
C’est l’objet des sections suivantes :
• ”Fonction de gestion des mbuf : généralités”
• ”Optimisation des pools mbuf : quand ?”
• ”Optimisation des pools mbuf : comment ?”
Fonction de gestion des mbuf : généralités
La fonction de gestion des mbuf contrôle deux pools de tampons : un pool de tampons de
faible capacité (256 octets chacun), simplement appelés mbuf, et un pool de tampons de
capacité élevée (4 096 octets chacun), généralement appelés grappes mbuf ou grappes.
Les pools sont créés à partir de la mémoire système, par une requête d’affectation au
gestionnaire de mémoire virtuelle (VMM). Les pools sont constitués d’éléments fixes de
mémoire virtuelle – ce qui signifie qu’ils résident en permanence en mémoire physique et ne
font jamais partie de pages évacuées. En conséquence, la capacité de mémoire réelle,
disponible pour la pagination dans les programmes d’application et les données, est
diminuée d’un volume équivalent à l’augmentation de la capacité des pools mbuf. Ne
l’oubliez pas lorsque vous augmentez la taille des pools mbuf.
La taille initiale des pools mbuf dépend du système. Un nombre minimal de (petits) mbufs et
de grappes est affecté à chaque système, mais ces minimums sont augmentés en fonction
de la configuration spécifique des systèmes. Un des facteurs pris en compte est le nombre
de cartes de communication équipant le système. La taille par défaut est initialement
configurée pour gérer des réseaux de charge faible à moyenne (trafic de 100 à
500 paquets/seconde). La taille des pools augmente dynamiquement avec l’augmentation
de la charge du réseau. Le pool de grappe diminue si la charge du réseau diminue (le pool
mbuf n’est jamais réduit). Pour optimiser les performances du réseau, l’administrateur doit
équilibrer la taille des pools mbuf en fonction de la charge du réseau (paquets/seconde). Si
cette dernière est axée sur le trafic UDP (comme sur un serveur NFS, par exemple), la taille
du pool mbuf doit être double du taux de paquets/seconde. Ceci parce que le trafic UDP
consomme un petit mbuf supplémentaire.
Pour assurer l’efficacité du service d’affectation de mbuf, il est tentant de maintenir libres en
permanence un minimum de tampons dans les pools. Les paramètres lowmbuf et lowclust
permettent (via la commande no) de définir ces limites inférieures.
Le paramètre lowmbuf spécifie le nombre minimal de tampons libres du pool mbuf. Le
paramètre lowclust spécifie le nombre minimal de tampons libres du pool de grappe.
Lorsque le nombre de tampons passe en-deçà du seuil défini par lowmbuf ou lowclust, les
pools sont agrandis. Cette extension n’est pas immédiate, mais planifiée pour être effectuée
par un service du noyau appelé netm. Lorsque le service netm est distribué, les pools sont
9-26
AIX 4.3 Guide d’optimisation
agrandis de façon à répondre aux minimums définis par lowclust et lowmbuf. C’est la
structure VMM qui impose que cette opération soit le fait d’un processus du noyau.
Le service de noyau netm limite en outre la croissance du pool de grappes. Le paramètre
mb_cl_hiwat définit cette limite supérieure.
Le paramètre mb_cl_hiwat contrôle le nombre maximal de tampons libres que peut
contenir le pool de grappes. Lorsque le seuil défini par mb_cl_hiwat est dépassé, netm est
planifié pour libérer quelques grappes et les restituer à VMM.
Le système de noyau netm est exécuté selon une priorité élevée (fixée à 37). De ce fait,
distribuer trop de netm peut avoir un effet négatif non seulement sur les performances du
réseau, mais également sur celles du système – pour cause de conflit avec les autres
processus utilisateur et système. Des pools mal configurés peuvent provoquer
l’emballement des netm, dû à des incompatibilités entre les besoins du trafic réseau et des
seuils mal définis. La distribution du système de noyau netm peut être minimisée en
configurant les pools mbuf pour qu’ils répondent aux besoins du réseau et du système.
La fonction de gestion mbuf se sert encore d’un dernier paramètre réseau, thewall.
thewall contrôle la taille de RAM maximale (en kilo-octets) susceptible d’être affectée par la
fonction de gestion mbuf à partir de VMM. Ce paramètre sert à éviter tout déséquilibre des
ressources VMM, qui aurait un fâcheux effet sur les performances système.
Optimisation des polls mbuf : quand ?
Quand et de quelle quantité optimiser les pools mbuf est directement lié à la charge du
réseau à laquelle est soumise une machine donnée. Un serveur gérant plusieurs clients fait
partie des machines dont il est bon d’optimiser les pools mbuf. Pour ce faire, il est essentiel
que l’administrateur connaisse bien la charge du réseau pour un système donné.
Vous pouvez, via la commande netstat, connaître approximativement la charge du réseau
en paquets/seconde. Par exemple :
netstat –I tr0 5
indique le trafic en entrée et en sortie, issu de la carte tr0 et de toutes les cartes LAN du
système. Le listing ci-dessous indique l’activité entraînée par une vaste opération
provoquée par une commande ftp :
$ netstat –I tr0 2
input
(tr0)
output
packets errs packets errs colls
20615
227
3345
0
0
17
0
1
0
0
174
0
320
0
0
248
0
443
0
0
210
0
404
0
0
239
0
461
0
0
253
1
454
0
0
246
0
467
0
0
99
1
145
0
0
13
0
1
0
0
input
packets
20905
17
174
248
210
239
253
246
99
13
(Total)
output
errs packets errs colls
227
3635
0
0
0
1
0
0
0
320
0
0
0
443
0
0
0
404
0
0
0
461
0
0
1
454
0
0
0
467
0
0
1
145
0
0
0
1
0
0
Contrôle et optimisation des E/S de communication
9-27
La commande netstat peut être assortie d’un indicateur, –m, qui donne des détails sur
l’usage et la disponibilité des mbuf et des grappes :
253 mbufs in use:
50 mbufs allocated to data
1 mbufs allocated to packet headers
76 mbufs allocated to socket structures
100 mbufs allocated to protocol control blocks
10 mbufs allocated to routing table entries
14 mbufs allocated to socket names and addresses
2 mbufs allocated to interface addresses
16/64 mapped pages in use
319 Kbytes allocated to network (39% in use)
0 requests for memory denied
0 requests for memory delayed
0 calls to protocol drain routines
La ligne 16/64 mapped pages in use indique qu’il existe 64 grappes fixes, dont 16
sont actuellement utilisées.
Ce compte rendu peut être comparé aux paramètres système définis, via la commande no
–a. Les lignes intéressantes à cet égard sont :
lowclust
lowmbuf
thewall
mb_cl_hiwat
=
=
=
=
29
88
2048
58
Il est clair que sur le système test, les 319 Kbytes allocated to network sont très
en-deçà de la valeur de thewall (2 048 ko) et que les (64 – 16 = 48) grappes libres sont
également en-deçà de la limite mb_cl_hiwat (58).
Le compteur requests for memory denied, tenu à jour par la fonction de gestion des
mbuf, est incrémenté chaque fois qu’une requête d’affectation de mbuf n’aboutit pas.
Normalement, la valeur de requests for memory denied est 0. Si une surcharge de
trafic se produit sur un système, les pools mbuf configurés par défaut peuvent se révéler
insuffisants : le compteur d’erreur est alors incrémenté chaque fois qu’une requête
d’affectation de mbuf échoue. Le compteur atteint rapidement des chiffres de l’ordre des
milliers, compte tenu du nombre de paquets arrivant dans un court laps de temps. Les
statistiques requests for memory denied correspondent aux paquets abandonnés sur
le réseau. Ces paquets supposent des retransmissions, c’est-à-dire une baisse des
performances. Si la valeur de requests for memory denied est supérieure à zéro, il
peut être utile d’optimiser les paramètres mbuf — voir Optimisation des pools mbuf –
comment ?.
Le décompte Kbytes allocated to the network, tenu à jour par la fonction de
gestion des mbuf, représente la quantité de mémoire système actuellement affectée aux
deux pools mbuf. La limite supérieure de ce décompte, définie par thewall, permet
d’empêcher la fonction de gestion mbuf de consommer trop de mémoire physique sur un
système. La valeur par défaut de thewall limite cette fonction à 2 048 ko (comme indiqué
sur le comte rendu généré par la commande no –a). Si la valeur de Kbytes allocated
to the network est proche de thewall, il peut être utile d’optimiser les paramètres mbuf.
Reportez-vous à ”Optimisation des pools mbuf : comment ?”.
Il est des cas où les indicateurs ci-dessus laissent supposer qu’il faut étendre les pools
mbuf, alors qu’en fait, il y a un problème système auquel il convient d’abord de remédier.
Par exemple :
• manque de mémoire mbuf
• données en attente non lues à partir d’un socket ou d’une autre structure d’attente
interne.
9-28
AIX 4.3 Guide d’optimisation
Une perte de mémoire mbuf dénote une situation dans laquelle un code noyau ou une
extension noyau a omis de libérer une ressource mbuf et détruit le pointeur vers
l’emplacement mémoire correspondant, perdant à tout jamais l’adresse du mbuf. Si cette
situation est récurrente, toutes les ressources mbuf finiront par être inaccessibles. Si les
statistiques mbuf générées par netstat montrent un accroissement progressif de l’usage
des mbuf, n’accusant jamais de baisse, ou une utilisation intensive des mbuf sur un
système relativement peu chargé, il y a sans doute une perte de mémoire mbuf.
Les développeurs d’extensions noyau se doivent de toujours intégrer dans leurs tests un
contrôle sur les pertes de mémoire.
Il se peut également que de nombreux mbuf restent en attente dans un socket suite à une
erreur dans une application. Normalement, un programme d’application lit les données d’un
socket, entraînant la réattribution des mbuf à la fonction de gestion du mbuf.
Un administrateur peut gérer les statistiques générées par la commande netstat –m et
chercher un éventuel usage intensif du mbuf alors que le trafic réseau ne le justifie pas. Il
peut également examiner la liste des processus en cours (via ps –ef) et étudier de près
ceux qui utilisent le sous-système réseau avec une forte consommation de temps CPU.
Il convient alors d’isoler l’application en cause et de la corriger.
Optimisation des polls mbuf : comment ?
Avec un minimum de connaissance sur leur organisation et leur gestion, optimiser les pools
mbuf est, sous AIX, une opération simple, qui peut être effectuée en cours d’exploitation.
L’utilisateur racine dispose de la commande no pour modifier les paramètres du pool mbuf.
Voici quelques règles :
• Si vous modifiez les attributs lowclust et lowmbuf, vous devrez peut-être commencer
par augmenter thewall, pour éviter que l’extension du pool n’atteigne le seuil thewall.
• Dans tous les cas, la valeur de l’attribut mb_cl_hiwat doit être au moins double de celle
de lowclust. Ceci pour éviter tout emballement de netm (voir plus haut).
• Si vous modifiez lowclust, vous devez modifier lowmbuf d’une valeur au moins
équivalente. Il existe un mbuf pointant sur chaque grappe.
• Après extension des pools, lancez la commande vmstat pour vérifier que les taux de
pagination n’ont pas augmenté. Si vous ne parvenez pas à amener les pools au niveau
souhaité sans pour autant affecter les taux de pagination, un supplément de mémoire est
sans doute à prévoir.
Voici un exemple de script shell qui peut être exécuté à la fin de /etc/rc.net pour optimiser
les pools mbuf pour un serveur NFS prenant en charge un trafic réseau d’environ
1500 paquets/seconde.
Contrôle et optimisation des E/S de communication
9-29
#!/bin/ksh
# echo ”Tuning mbuf pools...”
# set maximum amount of memory to allow for allocation (10MB)
no –o thewall=10240
# set minimum number of small mbufs
no –o lowmbuf=3000
# generate network traffic to force small mbuf pool expansion
ping 127.0.0.1 1000 1 >/dev/null
# set minimum number of small mbufs back to default to prevent netm from
# running unnecessarily
no –d lowmbuf
# set maximum number of free clusters before expanding pool
# (about 6MB)
no –o mb_cl_hiwat=1500
# gradually expand cluster pool
N=10
while [ $N –lt 1500 ]
do
no –o lowclust=$N
ping 127.0.0.1 1000 1 >/dev/null
let N=N+10
done
# set minimum number of clusters back to default to prevent netm
# from running unnecessarily
no –d lowclust
Vous pouvez lancer netstat –m à la suite du script ci-dessus pour vérifier la taille du pool
de grappes (appelées pages mappées par la commande netstat ). Pour vérifier la taille du
pool de mbuf, vous disposez de la commande crash qui permet d’examiner une structure
de données noyau, mbstat (voir le fichier /usr/include/sys/mbuf.h). L’adresse du noyau de
mbstat peut être affichée dans le cadre de crash, via la commande od mbstat. Entrez
ensuite od <adresse-noyau> pour obtenir un cliché du premier mot de la structure
mbstat, qui contient la taille du pool mbuf. Si vous utilisez AIX version 4.1 ou version 3.2
avec pTF U437500, le dialogue est semblable à :
$ crash
> od mbstat
001f7008: 00000180
> quit
La taille du pool mbuf est ainsi de 18016 (38410).
Si vous utilisez AIX version 3.2 sans le PTF U437500, le dialogue est semblable à :
$ crash
> od mbstat
000e2be0: 001f7008
> od 1f7008
001f7008: 00000180
> quit
La taille du pool mbuf est ainsi de 18016 (38410).
9-30
AIX 4.3 Guide d’optimisation
Récapitulatif des paramètres d’optimisation UDP, TCP/IP et
mbuf
Les paragraphes suivants répertorient tous les attributs et techniques d’optimisation pour
chacun des paramètres d’optimisation des communications.
thewall
Objet :
Limite supérieure absolue de la quantité de mémoire réelle susceptible
d’être utilisée par le sous-système de communication.
Valeurs :
AIX 4.2.1 et versions antérieures : Par défaut : 1/8 de la mémoire réelle.
Intervalle : jusqu’à 1/2 de la mémoire réelle ou 65536 (64 méga–octets),
selon la plus petite valeur.
AIX 4.3.0 : Par défaut : 1/8 de la mémoire réelle. Intervalle : jusqu’à 1/2 de
la mémoire réelle ou 131072 (128 méga–octets), selon la plus petite
valeur.
AIX 4.3.1 : Par défaut : 1/2 de la mémoire réelle. Intervalle : jusqu’à 1/2 de
la mémoire réelle ou 131072 (128 méga–octets), selon la plus petite
valeur.
Affichage :
no –a ou no –o thewall
Modification :
no –o thewall=nouvelle-valeur
nouvelle-valeur est en ko, et non en octets.
La modification est immédiate pour les nouvelles connexions.
La modification est effective jusqu’à l’amorçage système suivant.
Diagnostics :
Aucun.
Optimisation : Augmentez la taille, de préférence à un multiple de 4 ko.
Voir :
”Optimisation du pool mbuf”, page 9-26.
Objet :
Sous AIX Version 4.3.1 ou ultérieure, permet d’éviter la création de
nouveaux sockets lorsque presque toute la mémoire réseau est utilisée.
Valeurs :
Par défaut : 85% de thewall. Intervalle : 1–100
Affichage :
no –a or no –o sockthresh
Modification :
no –o sockthresh=nouvelle-valeur
sockthresh
nouvelle–valeur est un pourcentage de thewall.
La modification est immédiate.
La modification est effective jusqu’à l’amorçage système suivant.
Remarque : La modification échoue si l’utilisateur tente de
sélectionner une nouvelle valeur inférieure à la quantité de mémoire
actuellement utilisée.
Diagnostics :
Aucun.
Optimisation : Diminuez le pourcentage.
Voir :
”Couche socket”, page 9-3.
Contrôle et optimisation des E/S de communication
9-31
sb_max
Objet :
Limite supérieure absolue de la taille des tampons de socket TCP et UDP.
Limite setsockopt(), udp_sendspace, udp_recvspace, tcp_sendspace
et tcp_recvspace.
Valeurs :
Par défaut : 65536 Intervalle : N/A.
Affichage :
no –a ou no –o sb_max
Modification :
no –o sb_max=nouvelle-valeur
La modification est immédiate pour les nouvelles connexions.
La modification est effective jusqu’à l’amorçage système suivant.
Diagnostics :
Aucun.
Optimisation : Augmentez la taille, de préférence à un multiple de 4 096. Doit être
environ double de la limite du plus grand tampon de socket.
Voir :
”Couche socket”, page 9-3.
Objet :
1 indique que tcp_sendspace et tcp_recvspace peuvent dépasser
64 ko.
Valeurs :
Par défaut : 0 Intervalle : 0 ou 1
Affichage :
no –a ou no –o rfc1323
Modification :
no –o rfc1323=nouvelle-valeur
rfc1323
La modification est immédiate.
La modification est effective jusqu’à l’amorçage système suivant.
Diagnostics :
Aucun.
Optimisation : Effectuez la modification avant de tenter de donner à tcp_sendspace et
tcp_recvspace une valeur supérieure à 64 ko.
Voir :
”Couche TCP”, page 9-6.
udp_sendspace
Objet :
Valeur par défaut de la taille du tampon d’envoi du socket UDP.
Valeurs :
Par défaut : 9216 Intervalle : 0 à 65536
Doit être inférieur ou égal à sb_max.
Affichage :
no –a ou no –o udp_sendspace
Modification :
no –o udp_sendspace=nouvelle-valeur
La modification est immédiate pour les nouvelles connexions.
La modification est effective jusqu’à l’amorçage système suivant.
Diagnostics :
Aucun.
Optimisation : Augmentez la taille, de préférence à un multiple de 4 096.
Voir :
”Couche socket”, page 9-3.
udp_recvspace
Objet
Valeur par défaut de la taille du tampon de réception du socket UDP.
Valeurs :
Par défaut : 41600 Intervalle : N/A.
Doit être inférieur ou égal à sb_max.
9-32
AIX 4.3 Guide d’optimisation
Affichage :
no –a ou no –o udp_recvspace
Modification :
no –o udp_recvspace=nouvelle-valeur
La modification est immédiate pour les nouvelles connexions.
La modification est effective jusqu’à l’amorçage système suivant.
Diagnostics :
n non nul dans le compte rendu de netstat –s de udp: n socket buffer
overflows
Optimisation : Augmentez la taille, de préférence à un multiple de 4 096.
Voir :
”Couche socket”, page 9-3.
tcp_sendspace
Objet
Valeur par défaut de la taille du tampon d’envoi du socket TCP.
Valeurs :
Par défaut : 16384 Intervalle : 0 à 64 ko si rfc1323=0,
Intervalle : 0 à 4 Go si rfc1323=1.
Doit être inférieur ou égal à sb_max.
Doit être égal à tcp_recvspace et uniforme sur tous les systèmes AIX
fréquemment sollicités.
Affichage :
no –a ou no –o tcp_sendspace
Modification :
no –o tcp_sendspace=nouvelle-valeur
La modification est immédiate pour les nouvelles connexions.
La modification est effective jusqu’à l’amorçage système suivant.
Diagnostics :
Débit faible
Optimisation : Augmentez la taille, de préférence à un multiple de 4 096.
Voir :
”Couche socket”, page 9-3.
tcp_recvspace
Objet :
Valeur par défaut de la taille du tampon de réception du socket TCP.
Valeurs :
Par défaut : 16384 Intervalle : 0 à 64 ko si rfc1323=0,
Intervalle : 0 à 4 Go si rfc1323=1.
Doit être inférieur ou égal à sb_max.
Doit être égal à tcp_sendspace et uniforme sur tous les systèmes AIX
fréquemment sollicités.
Affichage :
no –a ou no –o tcp_recvspace
Modification :
no –o tcp_recvspace=nouvelle-valeur
La modification est immédiate pour les nouvelles connexions.
La modification est effective jusqu’à l’amorçage système suivant.
Diagnostics :
Débit faible
Optimisation : Augmentez la taille, de préférence à un multiple de 4 096.
Voir :
”Couche socket”, page 9-3.
Objet :
Nombre maximal d’entrées de la file d’entrée IP.
Valeurs :
Par défaut : 50 Intervalle : N/A.
ipqmaxlen
Contrôle et optimisation des E/S de communication
9-33
Affichage :
no –a ou no –o ipqmaxlen
Modification :
no –o ipqmaxlen =nouvelle-valeur
La modification est immédiate.
La modification est effective jusqu’à l’amorçage système suivant.
Diagnostics :
Utilisez la commande crash pour accéder au compteur de dépassement
de la file d’entrée IP.
Optimisation : Augmentez la taille.
Voir :
”Optimisation des performances du protocole IP”, page 9-23.
xmt_que_size
Objet :
Spécifie le nombre maximal de tampons d’envoi susceptibles d’être en file
d’attente pour l’unité.
Valeurs :
Par défaut : 30 Intervalle : 20 à 150
Affichage :
lsattr –E –l tok0 –a xmt_que_size
Modification :
ifconfig tr0 detach
chdev –I tok0 –a xmt_que_size=nouvelle-valeur
ifconfig tr0 nom-hôte up
Le changement reste effectif même après réamorçage du système.
Diagnostics :
netstat –i
Oerr > 0
Optimisation : Augmentez la taille. Doit être naturellement définie à 150 sur les systèmes
orientés réseau, et notamment les serveurs.
Voir :
”Cartes réseau local et pilotes d’unités”, page 9-11.
rec_que_size
Objet :
(optimisable sous AIX version 3 exclusivement). Spécifie le nombre
maximal de tampons de réception qui peuvent être en file d’attente pour
l’interface.
Valeurs :
Par défaut : 30 Intervalle : 20 à 150
Affichage :
lsattr –E –l tokn –a rec_que_size
Modification :
ifconfig tr0 detach
chdev –I tokn –a rec_que_size=nouvelle-valeur.
ifconfig tr0 nom-hôte up
Le changement reste effectif même après réamorçage du système.
Diagnostics :
Aucun.
Optimisation : Augmentez la taille. Doit être naturellement définie à 150 sur les systèmes
orientés réseau, et notamment les serveurs.
Voir :
9-34
”Cartes réseau local et pilotes d’unités”, page 9-11.
AIX 4.3 Guide d’optimisation
MTU
Objet :
Limite la taille des paquets transmis via le réseau.
Valeurs :
trn (4 Mo) : Par défaut : 1492 Intervalle : 60 à 3900
trn (16 Mo) : Par défaut : 1492 Intervalle : 60 à 17960
enn: Par défaut : 1500 Intervalle : 60 à 1500
fin: Par défaut : 4352 Intervalle : 60 à 4352
hin: Par défaut : 65536 Intervalle : 60 à 65536
son: Par défaut : 61428 Intervalle : 60 à 61428
lon: Par défaut : 1500 (version 3.2.5), 16896 (AIX version 4.1), Intervalle :
60 à 65536
Affichage :
lsattr –E –l trn
Modification :
chdev –l trn –a mtu=nouvelle-valeur.
Ne peut être modifié en cours d’exploitation de l’interface. Tous les
systèmes du réseau local (LAN) devant être dotés du même MTU, ils
doivent être modifiés simultanément. Le changement reste effectif même
après réamorçage.
Diagnostics :
Statistiques de fragmentation de paquets
Optimisation : Augmentez la taille MTU pour les interfaces en anneau à jeton :
trn (4 Mo) : 4056
trn (16 Mo) : 8500
Pour l’interface en boucle lon sous la version 3.2.5, augmentez à 16896.
Pour les autres interfaces, conservez la valeur par défaut.
Voir :
”Cartes réseau local et pilotes d’unités”, page 9-11.
Voir aussi
Les commandes crash, ifconfig, lsattr, netstat et no.
La sous–routine setsockopt.
Contrôle et optimisation des E/S de communication
9-35
Optimisation de NFS
NFS fournit à des programmes d’un système un accès transparent à des fichiers sur un
autre système, par le biais du montage du répertoire distant (via mount). Normalement, à
l’amorçage du serveur, la commande exportfs rend les répertoires disponibles, et les
démons gérant le télé-accès (nfsd) sont lancés. De même, le montage des répertoires
distants et l’initialisation du nombre requis de biod pour la gestion du télé-accès sont
effectués au cours de l’amorçage du système client.
La figure ”Interaction client-serveur NFS” illustre la structure du dialogue entre un serveur et
des clients NFS. Lorsqu’une routine d’un système client tente de lire ou d’écrire un fichier
dans un répertoire monté par NFS, la requête est réacheminée du mécanisme d’E/S normal
vers l’un des démons d’E/S par bloc NFS du client (biod). Le biod envoie la demande au
serveur ad hoc, où il est affecté à l’un des démons NFS du serveur (nfsd). Pendant le
traitement de cette requête, ni le biod ni le nfsd concerné n’exécutent aucune tâche.
client A
routine m
serveur Z
biod i
nfsd a
biod j
nfsd b
biod k
biod a
nfsd c
.
.
nfsd x
biod b
nfsd y
biod c
nfsd z
LAN
client B
routine n
Interaction client-serveur NFS
Nombre de biod et de nfsd requis
Les biod et les nfsd ne traitant qu’une requête à la fois, et le délai de réponse NFS étant
souvent le plus important du total du temps de réponse, il n’est pas souhaitable que des
routines soient bloquées suite à l’absence d’un biod ou d’un nfsd. Voici quelques
remarques sur la configuration des démons NFS :
• Augmenter le nombre de démons ne peut compenser un défaut de mémoire ou de
puissance du client ou du serveur, ou l’inadéquation de la largeur de bande du disque
serveur. Avant de changer le nombre de démons, vérifiez, via les commandes iostat et
vmstat, les niveaux d’utilisation des ressources serveur et client.
• Les démons NFS sont relativement peu coûteux : un biod consomme 36 ko de mémoire
(9 pages dont 4 fixes), un nfsd en consomme 28 ko (7 pages dont 2 fixes). Bien entendu,
les pages non fixes ne se trouvent en mémoire réelle que si nfsd ou biod a été
récemment actif. En outre, les nfsd AIX inactifs ne consomment pas de temps CPU.
• Toutes les requêtes NFS passent par un nfsd, seules les lectures et écritures passent
par un biod.
Nombre initial de nfsd et de biod
Déterminer le bon nombre de nfsd et de biod est un processus itératif. Les estimations
empiriques ne constituent au mieux qu’un point de départ.
Par défaut, il existe six biod sur un client et huit nfsd sur un serveur. Ces valeurs par défaut
constituent un point de départ satisfaisant pour les petits systèmes, mais devront sûrement
être augmentées sur les systèmes client gérant plus de deux utilisateurs ou les serveurs
gérant plus de deux clients. Voici quelques conseils :
9-36
AIX 4.3 Guide d’optimisation
• Pour chaque client, estimez le nombre maximal de fichiers susceptibles d’être écrits
simultanément. Configurez au moins deux biod par fichier. Si les fichiers sont
volumineux (plus de 32 ko), vous pouvez commencer avec quatre biod par fichier pour
prendre en charge les activités de lecture anticipée ou d’écriture différée. Il n’est pas rare
de mobiliser cinq biod pour écrire un fichier volumineux.
• Sur chaque serveur, commencez par configurer autant de nfsd que la somme des biod
configurés sur les clients pour gérer les fichiers à partir de ce serveur. Ajoutez 20 % pour
les requêtes NFS autres que de lecture/écriture.
• Si les stations client sont rapides, mais connectées à un serveur plus lent, vous devrez
peut-être limiter le taux de génération des requêtes NFS émises par les clients. Le mieux
est de réduire le nombre de biod sur les clients, en tenant compte de l’importance
relative de la charge et du temps de réponse de chaque client.
Optimisation du nombre de nfsd et de biod
Après avoir déterminé ou modifié le nombre initial de biod et de nfsd :
• Contrôlez à nouveau les systèmes concernés, via vmstat et iostat, à la recherche de
saturation au niveau des E/S ou de la CPU. Si le serveur est saturé, vous devez diminuer
sa charge ou augmenter sa puissance, ou les deux.
• Lancez netstat –s pour déterminer si un système n’est pas confronté à un dépassement
de tampon de socket UDP. Dans l’affirmative, lancez no –a pour vérifier que les conseils
indiqués à ”Optimisation des autres couches pour améliorer les performances NFS”,
page 9-39 ont bien été suivis. Si oui, et que le système n’est pas saturé, augmentez le
nombre de biod ou de nfsd.
La commande chnfs permet de modifier le nombre de nfsd et de biod. Ainsi, pour définir à
10 le nombre de nfsd sur un serveur, immédiatement et à chaque réamorçage, entrez :
# chnfs –n 10
Pour définir temporairement à 8 le nombre de biod sur un client, sans pérenniser le
changement (perdu à l’amorçage suivant), entrez :
# chnfs –N –b 8
Pour définir à 9 le nombre de biod et de nfsd, le changement ne prenant effet qu’à
l’amorçage (IPL) suivant du système, entrez :
# chnfs –I –b 9 –n 9
Dans le cas, extrême, d’un client provoquant une surcharge du serveur, vous devrez
peut-être ramener le client à un seul biod. Pour ce faire, lancez la commande :
# stopsrc –s biod
Le client ne dispose plus que du biod kproc.
Performances et montages logiciels et matériels de NFS
Un des choix que vous serez amenés à faire lorsque vous configurez des répertoires
montés via NFS est de décider si le montage est logiciel ou matériel. Si, après un montage
réussi, l’accès à un répertoire monté logiquement génère une erreur (dépassement de
délai, le plus souvent), l’erreur est immmédiatement reportée au programme qui a demandé
le télé-accès. Si une erreur est générée lors de l’accès à un répertoire monté physiquement,
NFS relance l’opération.
Une erreur persistante au niveau de l’accès à un répertoire monté physiquement peut
entraîner une nette dégradation des performances, car le nombre de réessais par défaut
(1 000) et le délai par défaut (0,7 seconde), combinés à un algorithme qui augmente le délai
imparti à chaque nouvelle tentative, conduit NFS à relancer l’opération pratiquement
indéfiniment (tant qu’elle n’aboutit pas).
Il est techniquement possible de réduire le nombre de relances, ou d’augmenter la valeur
du délai, ou les deux, via les options de la commande mount. Malheureusement, modifier
Contrôle et optimisation des E/S de communication
9-37
substantiellement ces valeurs (pour supprimer effectivement le problème de performance)
peut entraîner l’indication inutile d’erreurs matérielles. Mieux vaut monter physiquement les
répertoires avec l’option intr, qui permet à l’utilisateur d’interrompre à partir du clavier un
processus se trouvant dans une boucle de relance.
Bien que le montage logiciel des répertoires permette une détection plus rapide des erreurs,
le risque est grand que des données soient endommagées. Pour les répertoires de
lecture/écriture, optez de préférence pour un montage physique.
Optimisation des retransmissions
Parallèlement au choix du type de montage (physique ou logique), se pose la question du
délai imparti dans une configuration donnée. Si le serveur est très chargé, qu’il est séparé
du client par un ou plusieurs ponts ou passerelles, ou qu’il est connecté au client via un
WAN, le délai imparti par défaut peut se révéler peu réaliste. Dans ce cas, serveur et client
se retrouveront surchargés par des retransmissions inutiles. Si, par exemple :
$ nfsstat –cr
génère un nombre significatif (> 5 % du total) de timeout s et de badxid s, il convient
d’augmenter la valeur du paramètre timeo via :
# smit chnfsmnt
Identifiez le répertoire à modifier, et entrez une nouvelle valeur sur la ligne ”NFS TIMEOUT.
In tenths of a second”. Pour un trafic LAN-LAN via un pont, essayez 50 (dixièmes de
seconde). Pour une connexion WAN (longue distance), essayez 200. Après au moins une
journée, vérifiez les statitisques NFS. Si elles indiquent toujours un nombre excessif de
retransmissions, augmentez encore timeo de 50 % et réessayez. Vérifiez également la
charge du serveur et des ponts et passerelles concernés, pour déterminer si un élément est
saturé par un trafic autre.
Optimisation du cache d’attribut de fichier NFS
NFS tient à jour, sur chaque système client, un cache des attributs des répertoires et des
fichiers auxquels un accès a récemment été effectué. Cinq paramètres, définissables dans
le fichier /etc/filesystems, contrôlent la durée de maintien d’une entrée dans le cache.
Il s’agit de :
actimeo
Durée absolue pendant laquelle les entrées fichier et répertoire sont
conservées dans le cache des attributs de fichier après une mise à jour.
Si elle est spécifiée, elle prévaut sur les valeurs *min et *max ci-après,
leur donnant effectivement la valeur actimeo.
acregmin
Durée minimale pendant laquelle les entrées fichier sont conservées
après une mise à jour. Valeur par défaut : 3 secondes.
acregmax
Durée maximale pendant laquelle les entrées fichier sont conservées
après une mise à jour. Valeur par défaut : 60 secondes.
acdirmin
Durée minimale pendant laquelle les entrées répertoire sont
conservées après une mise à jour. Valeur par défaut : 30 secondes.
acdirmax
Durée maximale pendant laquelle les entrées répertoire sont
conservées après une mise à jour. Valeur par défaut : 60 secondes.
Chaque fois qu’un fichier ou un répertoire est mis à jour, sa suppression est différée d’au
moins acregmin ou acdirmin secondes. S’il s’agit d’une deuxième ou nième mise à jour,
l’entrée est conservée pendant une durée au moins égale à l’intervalle entre les deux
dernières mises à jour, sous réserve qu’elle reste inférieure à acregmax ou acdirmax
secondes.
9-38
AIX 4.3 Guide d’optimisation
Désactivation du support ACL NFS inutilisé
Si votre charge de travail n’exploite pas le support ACL de NFS sur un système de fichiers
monté, vous pouvez réduire la charge du serveur et du client en spécifiant :
options = noacl
dans la strophe /etc/filesystems du client, pour ce système de fichiers.
Optimisation de la mise en cache des données NFS
NFS ne propose pas de fonction de mise en cache de données, mais le gestionnaire de
mémoire virtuel (VMM) d’AIX cache les pages de données NFS exactement comme les
pages de données disque. Si un système est prioritairement un serveur NFS dédié, il peut
être souhaitable d’autoriser le VMM à utiliser autant de mémoire que nécessaire pour
cacher les données. Pour ce faire, donnez la valeur 100 % au paramètre maxperm, qui
contrôle le pourcentage maximal de mémoire occupé par les pages de fichier, via la
commande :
# vmtune –P 100
La même technique peut s’appliquer aux clients NFS, mais n’a de sens que si leur charge
de travail ne requiert que très peu de pages de segments de travail.
Optimisation des autres couches pour améliorer les performances NFS
NFS passe par UDP pour effectuer ses E/S réseau. Assurez-vous que les techniques
d’optimisation décrites à ”Optimisation de TCP et UDP”, page 9-12 et ”Optimisation du pool
mbuf”, page 9-26 ont été appliquées. Vous devez, notamment :
• Vérifiez que les files de transmission et de réception de la carte LAN sont définies à leur
maximum (150).
• Passez la taille maximale du tampon du socket (sb_max) à au moins 131 072. Si la taille
du MTU est inférieure à 4 096 octets, donnez à sb_max une valeur supérieure ou égale
à 262 144. Donnez également à la taille des tampons de socket UDP (udp_sendspace
et udp_recvspace) la valeur 131 072.
• Si possible, augmentez la taille du MTU sur le réseau local. Sur un anneau à jeton
16 Mo, par exemple, passer de la taille par défaut (1 492 octets) à 8 500 octets permet
de transmettre sans fragmentation une requête de lecture ou d’écriture complète NFS de
8 ko. Cette opération optimise également l’exploitation de l’espace mbuf, réduisant les
risques de surcharges.
Augmentation de la taille du tampon du socket NFS
Au cours de l’optimisation d’UDP, vous pouvez découvrir que la commande :
$ netstat –s
indique un nombre non négligeable de débordements du tampon du socket UDP. Comme
pour l’optimisation classique d’UDP, vous devez augmenter la valeur de sb_max. Vous
devez également augmenter la valeur de nfs_chars, qui spécifie la taille du tampon, du
socket NFS. La séquence :
#
#
#
#
no –o sb_max=131072
nfso –o nfs_chars=130000
stopsrc –s nfsd
startsrc –s nfsd
donne à sb_max une valeur d’au moins 100 octets supérieure à la valeur souhaitée de
nfs_chars, donne à nfs_chars la valeur 130 972, puis arrête et relance les nfsd pour que
les nouvelles valeurs entrent en vigueur. Si vous constatez que cette modification améliore
les performances, insérez les commandes no et nfso dans /etc/rc.nfs, juste avant la
commande startsrc qui lance les nfsd.
Contrôle et optimisation des E/S de communication
9-39
Configuration du disque du serveur NFS
Pour les serveurs NFS qui ont à faire face à un niveau élevé d’activité d’écriture, vous avez
intérêt à configurer le volume logique journal sur un volume physique distinct de celui des
données. Reportez-vous à ”Préinstallation du disque”, page 4-24.
Accélérateurs matériels
Prestoserve
Le but du produit Prestoserve est de réduire le temps de latence des écritures NFS, en
proposant une méthode plus rapide que les E/S disque pour satisfaire l’impératif NFS
d’écritures synchrones. Il fournit de la RAM non volatile (NVRAM) dans laquelle NFS peut
écrire des données. Les données sont alors considérées comme ”en sécurité” et NFS peut
autoriser le client à poursuivre. Les données sont écrites ultérieurement sur un disque, en
fonction de la disponibilité des unités. Enfin, il est impossible de dépasser la largeur de
bande du disque, mais dans la mesure où l’essentiel du trafic NFS est en rafales,
Prestoserve permet d’aplanir la charge de travail sur le disque, avec des gains de
performance parfois considérables.
Interphase Network Coprocessor
Ce produit gère le traitement du protocole NFS sur les réseaux Ethernet, réduisant la
charge de la CPU. Le traitement du protocole NFS est particulièrement onéreux sur les
réseaux Ethernet, car les blocs NFS doivent être fractionnés pour correspondre à la taille de
MTU maximale (1 500 octets) de Ethernet.
Du bon usage de NFS
Le plus souvent, l’exploitation incorrecte de NFS est due au fait que les utilisateurs oublient
que les fichiers auxquels ils accèdent se trouvent à l’autre extrémité d’une voie de
communication coûteuse. Quelques exemples (réels) :
• Une application COBOL sous un système AIX effectuant des mises à jour aléatoires d’un
fichier d’inventaire monté via NFS – prenant en charge une application de registre de
caisse de détail en temps réel.
• Environnement de développement dans lequel un répertoire de code source sur chaque
système a été monté via NFS sur tous les autres systèmes dans l’environnement
– les développeurs se connectant à n’importe quel système pour modifier leurs
programmes et les compiler. Cette structure garantit quasi-inévitablement que le code
source de toutes les compilations est importé depuis des systèmes distants, et
réciproquement pour le résultat des compilations.
• Exécution de la commande ld sur un système pour transformer les fichiers .o d’un
répertoire monté via NFS en fichier a.out dans le même répertoire.
Il peut être argué qu’il s’agit là d’une exploitation légitime de la transparence offerte par
NFS. Sans doute, mais ces pratiques coûtent du temps processeur, consomment de la
largeur de bande et augmentent les temps de réponse. Lorsqu’un système est configuré de
sorte que l’accès à NFS fasse partie des opération standard, les concepteurs de cette
configuration doivent pouvoir défendre leur choix si coûteux par de substantiels avantages
techniques ou commerciaux :
• Disposer de toutes les données ou du code source sur un serveur, et non sur des postes
individuels améliore le contrôle du code source et facilite la centralisation des
sauvegardes.
• Plusieurs systèmes ont accès aux mêmes données, rendant un serveur dédié plus
efficace qu’un ou plusieurs systèmes combinant les rôles de client et de serveur.
9-40
AIX 4.3 Guide d’optimisation
Service des stations de travail sans disque
Potentiellement, les systèmes sans disque offrent une excellente puissance de traitement
couplée à un faible coût, une émission sonore réduite, peu de besoin d’espace et une
gestion centralisée des données. Aussi tentants que semblent ces avantages, les stations
sans disque ne sont pas forcément l’idéal pour tous les bureaux. Cette section a pour but
d’éclairer certains aspects du fonctionnement des stations sans disque AIX : types de
charges présentées aux serveurs et performances de différents types de programmes.
L’essentiel de ce qui traite de NFS ici s’applique également aux stations avec disques.
Cette section traite des points suivants :
• ”Particularités d’un système sans disque”
• ”Remarques sur NFS”
• ”Exécution d’un programme sur une station de travail sans disque”
• ”Pagination”
• ”Ressources requises pour une station de travail sans disque”
• ”Optimisation des performances”
• ”Performances des commandes”
• ”Etude de cas 1 – Environnement de bureau”
• ”Etude de cas 2 – Environnement de développement de logiciels”
Particularités d’un système sans disque
Dans un système équipé de disques locaux (appelé système à disque), le système
d’exploitation et les programmes requis pour la plupart des fonctions de base se trouvent
sur un ou plusieurs disques locaux. Au lancement du système, le système d’exploitation est
chargé à partir du disque local. Lorsque le système est complètement opérationnel, les
fichiers accessibles aux utilisateurs se trouvent également sur disque local. Les disques
locaux sont gérés par le système JFS (système de fichiers journalisé).
Dans un système sans disque, il faut amorcer le système d’exploitation à partir d’un serveur
via un code d’amorçage se trouvant dans la ROM de la machine sans disque.
Le chargement a lieu sur un réseau local : Ethernet ou anneau à jeton. Lorsque le système
est complètement opérationnel, les fichiers accessibles aux utilisateurs se trouvent sur les
disques d’un ou de plusieurs systèmes serveur.
NFS (Network File System) est le principal mécanisme utilisé par les stations de travail sans
disque pour accéder aux fichiers. Avec NFS, les fichiers distants semblent se trouver sur le
système sans disque. NFS n’est pas propre aux systèmes sans disque. Les systèmes à
disque peuvent également monter des systèmes de fichiers distants. Les systèmes sans
disque, ou à disque mais dépendant de serveurs pour les fichiers, sont généralement
appelés des clients.
Normalement, plusieurs clients sans disque sont reliés à chaque serveur, il y a donc
concurrence pour l’accès aux ressources serveur. La différence de performance entre deux
systèmes identiques, l’un doté de disque et l’autre non, dépend des systèmes de fichiers
(NFS ou JFS), de la vitesse du réseau et des ressources du serveur.
Remarques sur NFS
NFS (Network File System) multiplie les accès client aux données télémontées. Il fournit
des primitives pour les fonctions de base (création, lecture, écriture, suppression, etc. des
systèmes de fichiers). NFS assure également des opérations sur les répertoires
(suppression, lecture et définition des attributs, consultation du chemin d’accès, etc.).
Le protocole utilisé par NFS est ”sans état” : aucune requête au serveur ne dépend d’une
requête antérieure. Ce qui ajoute à la solidité du protocole. Mais qui introduit également des
Contrôle et optimisation des E/S de communication
9-41
problèmes de performances. Considérons le cas de l’écriture d’un fichier. Pendant cette
écriture, les données modifiées se trouvent soit dans la mémoire client, soit sur le serveur.
Le protocole NFS requiert que les données écrites du client vers le serveur soient
consignées dans un espace de stockage non volatil (le disque généralement) avant que
l’écriture ne soit considérée terminée. Ainsi, en cas de défaillance du serveur, les données
écrites par le client peuvent être recouvrées après réinitialisation du système. Les données
en cours d’écriture, non consignées sur le disque sont réécrites par le client sur le serveur
jusqu’à ce que l’opération aboutisse. NFS n’autorisant pas la mise en tampon des écritures
dans le serveur, chaque écriture NFS requiert une ou plusieurs écritures disque
synchrones. Par exemple, si un nouveau fichier de 1 octet est écrit par le client, l’exécution
de cette écriture entraîne trois E/S disque sur le serveur : la première sont les données
elles-même. La seconde est l’enregistrement du journal, une fonction JFS destinée à
maintenir d’intégrité du système de fichiers. La troisième est un cliché des données
d’allocation de fichier. Les écritures sur disque étant limitées à 50 à 100 par seconde, le
total des sorties d’écriture est limité par le nombre et le type de disque du serveur.
Les requêtes de lecture/écriture émises par les clients AIX sont de 4 096 ou 8 192 octets.
Elles requièrent généralement plus de ressources serveur que les autres types de requêtes.
Les fichiers distants et leur attributs pouvant se trouver dans la mémoire cache du client, le
protocole NFS fournit un outil permettant de vérifier que la version client des informations
sur le système de fichiers est à jour. Par exemple, si un fichier de 1 octet est en cours de
lecture, le fichier de données sera en mémoire cache tant que l’espace qu’il occupe sur le
client n’est pas réquisitionné par une autre activité. Si un programme du client relit le fichier
plus tard, le client assure que les données de la copie locale du fichier sont actuelles. Cette
opération est effectuée par le biais d’un appel Get Attribute au serveur pour déterminer si le
fichier a été modifié depuis sa dernière lecture.
La résolution des noms de chemin est le processus de parcours de l’arborescence des
répertoires jusqu’au fichier. Par exemple, ouvrir le fichier /u/x/y/z requiert normalement
d’examiner /u, x, y et z, dans cet ordre. Si un des éléments du chemin n’existe pas, le
fichier ne peut exister sous son nom. Un des caches NFS est dédié aux noms fréquemment
utilisés, réduisant d’autant le nombre de requêtes acheminées vers le serveur.
Le serveur reçoit évidemment un panachage de requêtes de lecture, d’écriture et autres, au
cours d’un intevalle de temps quelconque. Ce panachage est quasi-impossible à prévoir.
Les travaux qui impliquent de fréquents déplacements de fichiers volumineux entraînent
une prédominance des requêtes de lecture/écriture. La prise en charge de plusieurs
stations sans disque tend à générer une proportion plus importante de petites requêtes NFS
– mais tout dépend beaucoup de la charge de travail.
Exécution d’un programme sur une station de travail sans disque
Pour mieux appréhender le flux des requêtes NFS sur un client sans disque, étudions
l’exécution du shell Korn du programme trivial C :
#include <stdio.h>
main()
{
printf(”Ceci est un programme test\n”);
}
Le programme est compilé, générant l’exécutable a.out. Si la variable d’environnement
PATH est /usr/bin:/usr/bin/X11:(le point représentant le répertoire de travail courant
se trouve à la fin du chemin) et que la commande a.out est entrée sur la ligne de
commande, voici la séquence exécutée :
9-42
type de requête
composant
octets envoyés et reçus
1
NFS_LOOKUP
usr (appelé par statx)
(send 178, rcv 70)
2
NFS_LOOKUP
bin
AIX 4.3 Guide d’optimisation
3
NFS_LOOKUP
a.out
(non trouvé)
4
NFS_LOOKUP
usr (appelé par statx)
5
NFS_LOOKUP
bin
6
NFS_LOOKUP
X11
(send 174, rcv 156)
7
NFS_LOOKUP
a.out (non trouvé)
(send 174, rcv 70)
8
NFS_LOOKUP
. (appelé par statx)
(send 174, rcv 156)
9
NFS_LOOKUP
.
10
NFS_LOOKUP
a.out
11
NFS_LOOKUP
. (appelé par accessx)
12
NFS_LOOKUP
a.out
13
NFS_GETATTR
a.out
14
NFS_LOOKUP
.
15
NFS_LOOKUP
a.out
16
fork
17
exec
18
NFS_LOOKUP
usr
19
NFS_LOOKUP
bin
20
NFS_LOOKUP
a.out (non trouvé)
21
NFS_LOOKUP
usr
22
NFS_LOOKUP
bin
23
NFS_LOOKUP
X11
24
NFS_LOOKUP
a.out (non trouvé)
25
NFS_LOOKUP
.
26
NFS_LOOKUP
a.out
27
NFS_OPEN
28
NFS_GETATTR
29
NFS_ACCESS
30
NFS_GETATTR
a.out
31
FS_GETATTR
a.out
32
NFS_READ
a.out (exécutable Read)
33
NFS_GETATTR
a.out
34
NFS_LOOKUP
usr (Access library)
35
NFS_LOOKUP
lib
36
NFS_LOOKUP
libc.a
37
NFS_READLINK
libc.a
38
NFS_LOOKUP
usr
39
NFS_LOOKUP
ccs
40
NFS_LOOKUP
lib
(send 178, rcv 156)
(send 170, rcv 104, send 190,
rcv 168)
(send 178, rcv 70)
(send 178, rcv 70)
(send 166, rcv 138)
a.out
(send 170, rcv 104, send 190,
rcv 182)
(send 178, rcv 1514, rcv 1514,
rcv 84)
(send 166, rcv 80)
Contrôle et optimisation des E/S de communication
9-43
41
NFS_LOOKUP
libc.a
42
NFS_OPEN
libc.a
43
NFS_GETATTR
libc.a
44
NFS_ACCESS
libc.a
45
NFS_GETATTR
libc.a
46
NFS_GETATTR
libc.a
47
NFS_CLOSE
libc.a
48
_exit
(send 166, rcv 124)
(send 170, rcv 104, send 190,
rcv 178)
Avec une autre variable PATH, la série d’opérations NFS serait différente. Par exemple,
avec la variable PATH .:/usr/bin:/usr/bin/X11: , le programme a.out aurait été
trouvée plus rapidement. A l’inverse, avec ce PATH, la plupart des commandes auraient été
exécutées plus lentement, car elles résident presque toutes dans /usr/bin. Un autre
moyen rapide d’exécuter le programme est d’entrer ./a.out, dans la mesure où il est
inutile de parcourir l’exécutable (la résolution de bibliothèque est néanmoins toujours
requise). Ajouter un nombre important de répertoires peu utilisés au chemin (PATH) ralentit
l’exécution des commandes. Ceci s’applique à tous les environnements, mais est
particulièrement significatif dans les environnements sans disque.
Un autre facteur à prendre en compte lors du développement de programmes est la
minimisation du nombre de bibliothèques référencées. Il est évident que plus il y a de
bibliothèques à charger, moins l’exécution du programme est rapide. La variable
d’environnement LIBPATH peut également affecter la vitesse de chargement du
programme. Soyez donc prudent lorsque vous l’utilisez.
Le support NLS (National Language Support) peut aussi avoir une incidence sur l’exécution
des programmes. Dans l’exemple précédent, l’exécution avait lieu dans l’environnement
local ”C”, le plus efficace. L’exécution dans d’autres environnements peut induire une
charge supplémentaire lors de l’accès aux catalogues de messages.
A première vue, l’activité NFS pour un petit programme semble disproportionnée. En fait,
les performances de l’exemple restent dans des normes acceptables. N’oubliez pas que la
résolution de chemin pour l’accès aux fichiers est également effectuée pour les systèmes
de fichiers JFS : le nombre total d’opérations est donc similaire. Le cache NFS assure que
les opérations NFS ne généreront pas toutes de trafic réseau. Au total, les délais de latence
des opérations réseau restent généralement courts, et le cumul des délais pour les
commandes peu élevé – sauf si le serveur est lui-même surchargé.
Pagination
Les systèmes sans disque AIX effectuent la pagination via le protocole NFS. La pagination
est le processus par lequel l’espace de travail (variables du programme, par exemple) peut
être écrit et lu sur disque. Cette opération a lieu lorsque la somme des besoins en mémoire
des processus exécutés sur un système est supérieure à la mémoire système.
(Reportez-vous à ”Performances du gestionnaire de la mémoire virtuelle (VMM)”, page 2-5.)
Les avantages de la pagination sont mitigés. Elle permet certes d’éviter de surcharger la
mémoire, mais généralement aux dépens des performances. En fait, seule une faible dose
de pagination maintient des temps de réponse acceptables dans un environnement de
stations de travail.
Dans l’environnement sans disqsue, la pagination est particulièrement lente. Ceci est dû au
protocole NFS qui force les écritures sur disque. En pratique, on peut considérer qu’au
mieux, l’écriture d’une page prendra deux à trois fois plus de temps que sur un système à
disque. Compte tenu de ce fait, il est important que les systèmes sans disque disposent de
suffisamment de mémoire pour que les applications exécutées n’aient pas besoin de
recourir à la pagination. (Voir ”Programmes à CPU limitée”.)
9-44
AIX 4.3 Guide d’optimisation
Les produits bureautiques AIXwindows favorisent les attitudes conduisant à des périodes de
pagination intense sur des systèmes dépourvus de mémoire suffisante. Par exemple, un
utilisateur peut lancer simultanément deux programmes : un tableur conséquent dans une
fenêtre et une base de données dans une autre. Supposons qu’il mette à jour une feuille de
calcul, attende le résultat puis passe à la fenêtre base de données pour interroger la base.
Bien que le tableur soit inactif, il occupe un espace non négligeable. Interroger une base de
données requiert également beaucoup d’espace. Sauf si la mémoire réelle est suffisante
pour contenir ces deux programmes, les pages de mémoire virtuelle du tableur sont
paginées vers l’extérieur et la base de données chargée. A l’interaction suivante de
l’utilisateur avec le tableur, la mémoire occupée par la base de données doit être paginée,
et le tableur rechargé. En clair, les limites de cette situation sont déterminées par la
fréquence de passage d’une fenêtre à l’autre et par la charge qui incombe alors au serveur.
Ressources requises pour les stations de travail sans disque
Plusieurs services AIX permettent de mesurer la charge client-serveur. Le nombre de
requêtes NFS traitées par un système est accessible via nfsstat. Cette commande
décompte en détail les requêtes NFS par catégorie. La commande netstat analyse le
décompte de paquets et d’octets transférés à une unité du réseau. La commande iostat
détaille l’utilisation du processeur et du disque – paramètres utiles pour les mesures sur les
systèmes serveur. Enfin, l’utilitaire de suivi AIX permet de rassembler des données précises
sur les performances.
Planifier la capacité de réseaux sans disque est une tâche souvent compliquée par
l’intermittence des requêtes d’E/S des clients – courtes périodes enregistrant des pointes de
requêtes entrecoupées de longues périodes où le taux de requête est très bas.
Ce phénomène est courant sur les systèmes où les applications sont principalement
pilotées par les utilisateurs.
La capacité, c’est-à-dire le nombre de clients pris en charge par un serveur et un réseau
pour une charge de travail donnée, est déterminée par les statistiques des requêtes et les
besoins des utilisateurs finals. Quelques questions doivent être posées.
• Quelle est la fréquence réelle d’exécution de ce travail ? Normalement, un utilisateur
passe l’essentiel de son temps à des tâches autres que la compiltaion et l’édition de liens
de programmes. Supposer que tous les autres utilisateurs passent tout leur temps en
interaction avec leur station de travail à une vitesse maximale conduit à une
surestimation du nombre d’utilisateurs susceptibles d’être pris en charge.
• Quelle est l’utilisation moyenne acceptable du réseau ? Pour les réseaux Ethernet, le
pourcentage est de 30 à 60 %, selon le site.
• Quelle est la probabilité qu’un nombre important de clients se trouvent simultanément
dans une période d’utilisation de pointe du réseau ? Dans une telle période, les temps de
réponse augmentent. Quelle est la fréquence de ces pointes simultanées ? Quelle est
leur durée ?
Il est parfois intéressant de télé-exécuter les applications volumineuses. Exécuter
l’application sur un serveur, via une fenêtre distante, donne au client l’avantage de
bénéficier de la mémoire du serveur et permet à plusieurs instances de l’application
appelées par différents clients de partager des pages de code et des fichiers document.
Si l’application est exécutée sur le client, les passages d’une fenêtre à l’autre, tels que
décrits précédemment, ont une incidence catastrophique sur les temps de réponse.
D’autres tâches, impliquant par exemple de vastes et intenses opérations make ou cp,
peuvent également bénéficier du déplacement de l’application à proximité des disque fixes.
Lors de la configuration des réseaux et des serveurs pour des clients sans disque, il
convient d’effectuer dès que possible les mesures relatives aux applications. N’oubliez pas
de mesurer l’utilisation du processeur du serveur ainsi que celle du disque. Ces réseaux
sont plus susceptibles de présenter des goulots d’étranglement que les réseaux Ethernet ou
en anneau à jeton 16 Mo.
Contrôle et optimisation des E/S de communication
9-45
Optimisation des performances
La capacité d’une configuration client/serveur doit être pensée en termes de fourniture et de
demande. La fourniture des ressources dépend du type du réseau et de la configuration du
serveur. La demande est la somme de tous les besoins client vis-à-vis du serveur. Si une
configuration génère des performances inacceptables, modifier la demande client ou
augmenter la fourniture des ressources serveur ne peut qu’améliorer la situation.
Le taux d’utilisation correspond au pourcentage de temps pendant lequel une unité est
mobilisée. Les unités dont le taux d’utilisation est supérieur à 70 % constateront rapidement
un allongement des temps de réponse, les requêtes entrantes devant attendre la fin du
traitement de la requête précédente. Les taux d’utilisation acceptables maximum sont un
compromis entre temps de réponse et débit. Sur un système interactif, le taux d’utilisation
des unités ne doit pas excéder 70 à 80 % pour des temps de réponse acceptables. Les
systèmes en différé, où le débit des flux de travaux multiples est important, peuvent
”tourner” à quasi 100 %. Dans des systèmes mixtes (interactifs et différés), il convient bien
entendu de ne pas trop gréver les temps de réponse.
Optimisation du client
Plusieurs opérations peuvent concourir à l’optimisation d’un client :
• Ajout de mémoire client
• Augmentation du nombre des démons biod du client NFS
• Modification de la configuration réseau du client
• Ajout d’un disque à la configuration client
Si la mémoire d’un client est insuffisante, l’espace de travail est paginé. Ce qui peut être
détecté via la commande vmstat –s. Si l’espace de travail d’un client est en permanence
paginé, ajouter de la mémoire ne peut qu’améliorer ses performances.
Le nombre de démons d’E/S par bloc (biod) configurés sur un client limite le nombre de
requêtes de lecture et d’écriture NFS en suspens. Sur un système sans disque sur lequel
NFS n’a pas été explicitement activé, seuls quelques biod sont disponibles. Si NFS est
activé, ce nombre augmente. Normalement, le nombre de biod disponibles par défaut avec
NFS activé est suffisant pour une station sans disque.
Les pilotes d’unité Ethernet et en anneau à jeton sont assortis de paramètres qui définissent
la taille des files de transmission et de réception pour l’unité. Ces paramètres peuvent avoir
une incidence sur les performances client. Voir ”Optimisation des autres couches pour
améliorer les performances NFS”, page 9-39.
Ajouter un disque à une station sans disque n’est pas une hérésie : en fait, des études
marketing ont montré que les systèmes sans disque sont généralement équipés d’un
disque dans l’année qui suit leur achat. Ajouter un disque ne met pas en cause le principal
avantage des systèmes sans disque – la maintenance centralisée des fichiers. Le disque
peut être réservé à la pagination. On parle alors d’un système sans données. D’autres
combinaisons sont possibles. Un disque peut par exemple contenir de l’espace de
pagination et de l’espace pour les fichiers temporaires.
Optimisation du réseau
La largeur de bande d’un réseau est, nominalement, de 10 megabits/seconde. Dans la
pratique, la concurrence entre utilisateurs Ethernet rend impossible l’exploitation de
l’intégralité de la largeur de bande. Sachant qu’un disque SCSI Bull peut fournir jusqu’à
32 megabits/seconde, il est inquiétant de voir de nombreux clients partager le même quart
de largeur de bande d’un disque. Cette comparaison ne vaut, toutefois, que pour les
applications qui effectuent des E/S disque séquentielles – ce qui n’est pas le plus courant,
les E/S aléatoires (limitées en temps de recherche et délai de rotation) étant nettement plus
fréquentes. La plupart des disques SCSI ayant un débit soutenu de 50 à 85 opérations
d’E/S aléatoires par seconde, le taux effectif d’E/S aléatoires d’un disque est de
2 - 3 mégabits/seconde. Ainsi, une largeur de bande Ethernet est sensiblement équivalente
9-46
AIX 4.3 Guide d’optimisation
à deux disques effectuant des E/S aléatoires. Il convient d’en tirer une leçon : les
applications effectuant des E/S séquentielles sur des fichiers volumineux doivent être
exécutées sur le système auquel est rattaché le disque, et non sur une station sans disque.
Bien que le MTU (Maximum Transfer Unit) d’un réseau local (LAN) puisse être modifé via
SMIT, les stations sans disque sont limitées à leur valeur par défaut.
Optimisation du serveur
La configuration du serveur fait intervenir :
• CPU du serveur
• Configuration du disque du serveur
• Configuration du NFS du serveur
• Configuration de la mémoire du serveur
• Configuration du réseau du serveur
La puissance de traitement de la CPU du serveur est significative car toutes les requêtes
serveur font appel au service CPU. Généralement, le traitement CPU requis par les
requêtes de lecture/écriture est sensiblement supérieur à celui requis par les autres
requêtes.
La configuration du disque du serveur est généralement le premier goulot d’étranglement
rencontré. Une technique d’optimisation évidente consiste à équilibrer les E/S disque de
sorte qu’aucune utilisation disque ne soit largement supérieure à une autre. Une autre
technique est de maximiser le nombre de disques. Par exemple, deux disques de 400 Mo
offrent près de deux fois plus de possibilités d’E/S aléatoires par seconde qu’un seul disque
de 857 Mo. En outre, avec AIX, il est possible de placer un historique du journal sur une
autre unité. Cettet opération améliore la séquence d’écritures NFS multiple comme suit :
• Ecriture des données sur un disque fichier
• Ecriture de l’historique du journal sur le disque journal (pas de recherche de disque)
• Ecriture des données d’affectation de fichier sur disque fichier (recherche de disque peu
importante)
De par l’absence du journal sur le disque fichier, une ou deux recherches potentiellement
longues sur le disque sont évitées. (Si le fichier et l’historique du journal se trouvaient sur un
même disque peu chargé, l’accesseur passeraient continuellement de la zone de fichier à la
zone de l’historique de journal, et vice-versa.)
Le nombre d’instances du démon NFS (nfsd) exécutées sur le serveur limite le nombre de
requêtes NFS exécutables concuremment par le serveur. Le nombre de nfsd par défaut
n’est que de 8, ce qui n’est généralement suffisant que pour les serveurs d’entrée de
gamme. Le nombre de nfsd lancés à chaque amorçage peut être modifié via smit nfs
(Network File System (NFS) –> Configuration NFS sur ce système).
La taille de la mémoire du serveur n’est significative que pour les opérations de lecture
NFS. Dans la mesure où les écritures ne peuvent être placées en mémoire cache, la taille
de la mémoire est sans incidence sur les performances relatives à l’écriture. D’autre part,
en supposant que certains fichiers sont utilisés à répétition, plus la mémoire du serveur est
élevée, plus grande est la probabilité qu’une lecture puisse être satisfaite par la mémoire,
en évitant une E/S disque. Gagner une E/S disque réduit le taux d’utilisation du disque,
améliore les temps de réponse pour les lectures et diminue le taux d’utilisation de la CPU
du serveur. Vous disposez de la commande iostat pour étudier l’activité du disque.
Les indices suivants révélent qu’un supplément de mémoire peut améliorer les
performances du serveur :
• Un ou plusieurs pilotes de disque opèrent presque à la limite de leurs capacités
(40 à 85 E/S aléatoires par seconde). Voir ”Préinstallation du disque”, page 4-24.
Contrôle et optimisation des E/S de communication
9-47
• Sur une période de quelques minutes ou plus, le nombre d’octets lus est sensiblement
supérieur au nombre d’octets écrits.
Comme le client, les pilotes d’unité Ethernet et en anneau à jeton sont limités quant au
nombre de tampons disponibles pour l’envoi des données. Voir ”Optimisation des autres
couches pour améliorer les performances NFS”, page 9-39.
Performance des commandes
Les commandes AIX subissent le même type d’actions que celles constatées lors de
l’exécution d’un programme trivial (voir ”Exécution d’un programme sur une station de
travail sans disque”, page 9-42). Le comportement des commandes peut être déduit du type
et du nombre d’opérations sur les sytèmes de fichiers qu’elles requièrent. Les commandes
impliquant de nombreuses consultations de fichiers, telles que find, ou de
lectures/écritures, telles que cp, sont exécutées beaucoup plus lentement sur un système
sans disque. La figure ”Résultats des tests” donne une idée des performances sur un
système sans disque de quelques commandes usuelles.
mkdir
rmdir
bc
dc
vi
pack
more
cat
cmp
grep
sort
join
wc
cut
diff3
cc
cp
find
ld
make
tar
ar
modéré
élevé
awk
diff
minimal
ls
echo
pwd
rm
ps
court
durée normale
relative sur
système à
disque
long
durée augmentée lorsque
exécuté sur un système sans disque
Résultats des tests
La pénalité subie par une commande sur un client sans disque est exprimée comme le
rapport entre le temps requis sur système à disque et le temps requis sur un système sans
disque. Ce taux est intéressant, mais pas toujours important. Par exemple, si une
commande demande 0,05 seconde sur un système à disque et 0,2 seconde sur un système
sans, la pénalité est de quatre. Mais est-ce vraiment important pour l’utilisateur final ?
Un temps de réponse de 0,2 seconde est tout à fait suffisant pour un individu normal...
Mais si la commande se trouve dans un script shell et est exécutée 100 fois, le temps de
réponse du script passe de 5 à 20 secondes, ce qui est déjà plus gênant. C’est pourquoi il
convient d’éviter d’attribuer des stations sans disque à des utilisateurs qui lancent souvent
des scripts shell complexes.
9-48
AIX 4.3 Guide d’optimisation
Etude de cas 1 – Environnement de bureau
Pour étudier les caractéristiques des E/S client, nous avons mesuré la charge représentant
un environnement de bureau avec un seul utilisateur par client, sur un ESCALA modèle 220
sans disque 16 Mo. La charge étudiée consiste à créer un fichier, à l’aide de l’éditeur vi,
avec une vitesse de frappe de 6 caractères/seconde, à exécuter les utilitaires nroff, spell et
cat sur le document. Le document est transféré via tftp sur le serveur. D’autres commandes
sont également lancées : cal, calendar, rm et mail, ainsi qu’un petit programme qui
consulte les numéros de téléphone. Des ”temps de réflexion” simulés sont intercalés entre
les commandes.
Les figures ”Utilisation du CPU serveur dans un environnement bureautique” et ”Utilisation
du disque serveur dans un environnement bureautique” illustrent l’utilisation des ressources
du disque et du CPU du serveur pour la charge étudiée. Le serveur est un modèle 530H
avec un disque dur de 857 Mo. Le client exécutant le travail est un seul modèle 220. La
charge est intermittente (”en rafales”) – les pics d’utilisation étant disproportionnés par
rapport au taux moyen.
La figure ”Paquets/seconde dans un environnement bureautique Ethernet” illustre les
variations du taux de requêtes d’E/S pendant la durée d’exécution du travail. Le taux NFS
moyen est de 9.5 requêtes/seconde, avec une pointe à 249 requêtes/seconde. La figure
”Octets/seconde dans un environnement bureautique Ethernet” indique le nombre d’octets
transférés par seconde (activité du protocole comprise). Le taux de transfert moyen est de
4 000 octets/seconde, avec une pointe à 114 341 octets/seconde. Ce travail consomme en
moyenne 1/300ème de la largeur de bande nominale d’un réseau Ethernet, avec une pointe
à 1/11ème d’utilisation.
La moyenne d’utilisation de CPU serveur par client étant de 2% %, la moyenne d’utilisation
de disque serveur par client de 2.8% % et la moyenne d’utilisation du réseau Ethernet de
0.3% %, le disque sera probablement la ressource critique si plusieurs occurrences de ce
travail font appel à un seul serveur.
30
25
20
%
utilisation
CPU
15
10
5
0
durée
Utilisation de la CPU serveur dans un environnement bureautique
Contrôle et optimisation des E/S de communication
9-49
22
20
18
16
14
%
utilisation 12
disque
10
8
6
4
2
0
durée
Utilisation du disque serveur dans un environnement bureautique
270
240
210
180
Ethernet :
paquets/seconde 150
envoyés et
120
reçus
90
60
30
0
durée
Paquets/seconde dans un environnement bureautique Ethernet
140000
120000
100000
octets/seconde
transférés et
reçus
80000
60000
40000
20000
0
durée
Octets/seconde dans un environnement bureautique Ethernet
9-50
AIX 4.3 Guide d’optimisation
Etude de cas 2 – Environnement de développement de logiciels
Autre exemple de caractéristiques d’E/S client, nous avons mesuré une charge de
compilation/établissement de liens/exécution sur un ESCALA modèle 220 16 Mo sans
disque. Il s’agit d’une charge autrement importante que celle de l’exemple précédent.
Ce travail combine plusieurs services AIX couramment utilisés dans le cadre du
développement de logiciels, dans un environnement utilisateur unique par client. Des
”temps de réflexion” simulés sont intercalés pour tenir compte du délai de frappe.
Les figures ”Développement de logiciels : utilisation de la CPU serveur” et ”Développement
de logiciels : utilisation du disque serveur” illustrent l’utilisation des ressources du serveur
pour cet environnement de travail (avec la même configuration que dans l’exemple
précédent).
25
20
%
utilisation
CPU
15
10
5
0
durée
Développement de logiciels : utilisation de la CPU serveur
%
utilisation
disque
90
80
70
60
50
40
30
20
10
0
durée
Développement de logiciels : utilisation du disque serveur
Contrôle et optimisation des E/S de communication
9-51
400
360
320
280
240
200
160
120
80
40
0
paquets
transférés
et reçus
durée
Développement de logiciel : paquets/seconde (Ethernet)
octets
transférés
et reçus
360000
320000
280000
240000
200000
160000
120000
80000
40000
0
durée
Développement de logiciel : octets/seconde (Ethernet)
La figure ”Paquets/seconde dans un environnement de développement de logiciel Ethernet”
illustre les variations du taux de requêtes d’E/S pendant la durée d’exécution du travail.
Le taux NFS moyen est de 82 requêtes/seconde, avec une pointe à 364 requêtes/seconde.
La figure ”Développement de logiciels : octets/seconde (Ethernet)” illustre le nombre
d’octets transférés par seconde (activité du protocole comprise). Le taux de transfert moyen
est de 67 540 octets/seconde, avec une pointe à 314 750 octets/seconde. Ce travail
consomme en moyenne 1/18ème de la largeur de bande nominale d’un réseau Ethernet,
avec une pointe à 1/4ème d’utilisation.
La moyenne d’utilisation de CPU serveur par client étant de 4.2 %, la moyenne d’utilisation
de disque serveur par client de 8.9 % et la moyenne d’utilisation du réseau Ethernet de
5.3 %, le disque sera probablement la ressource critique si plusieurs occurrences de ce
travail font appel à un seul serveur. Si un second disque a été ajouté à la configuration du
serveur, c’est le réseau Ethernet qui saturera sans doute. Il y a toujours un ”goulot
d’étranglement suivant”.
9-52
AIX 4.3 Guide d’optimisation
100
90
80
%
70
d’utilisation 60
moyenne
50
du serveur 40
30
20
10
0
disq
ue
1
2
3
4
CPU
5
6
7
5
6
7
nombre de clients
Utilisation moyenne du serveur
55
requête NFS
temps de
réponse en
millisecondes
45
35
25
15
1
2
3
4
nombre de clients
Temps de réponse aux requêtes NFS
En supposant que le goulot d’étranglement disque s’est produit avec un nombre réduit de
clients pour cette charge de travail, il est facilement mesurable. La figure ”Utilisation
moyenne du serveur” illustre l’utilisation moyenne de CPU et du disque en fonction du
nombre de clients (serveur d’un disque). La figure ”Temps de réponse aux requêtes NFS”
illustre l’évolution du temps de réponse en fonction du nombre de clients.
Voir aussi
”Optimisation de NFS”
Commandes iostat, nfsstat, rm et smit.
Démons biod and nfsd.
Contrôle et optimisation des E/S de communication
9-53
Optimisation des connexions asynchrones pour transferts
haut débit
Les ports asynchrones permettent de raccorder à un ordinateur des périphériques en
option, tels que terminaux, imprimantes, télécopieurs et modems. Ces ports se trouvent sur
des unités telles que les cartes BULL 8, 16 ou 64 ports, ou la carte Digiboard 128 ports, qui
résident sur le Micro Channel et fournissent de nombreuses connexions asynchrones,
généralement RS-232 ou RS-422. Nombre de cartes, comme les cartes asynchrones BULL
précitées, furent conçues à l’origine pour servir terminaux et imprimantes, et sont donc
optimisées pour les sorties (envois). Le traitement des entrées (réception) est moins
optimisé, peut-être parce qu’il a été décrété qu’un utilisateur ne pourrait jamais taper à une
vitesse telle qu’il faille se préoccuper de l’optimisation des entrées clavier. Le problème ne
se pose pas non plus lorsque la transmission des données est lente et irrégulière, comme
les entrées au clavier. Mais il se pose avec les applications en mode brut, où des blocs
importants d’entrée sont transmis par d’autres ordinateurs ou des machines telles que les
photocopieurs.
Cette section traite des performances respectives des différentes cartes lors des transferts
(envoi et réception) de fichiers en mode brut. Nous indiquerons les techniques et les
méthodes permettant d’obtenir les meilleures performances lors de ces transferts, en dépit
des limitations inhérentes à certaines cartes.
Configurations et objectifs des mesures
Nos mesures ont un double objectif : évaluer le débit en sortie, le débit effectif en bauds et
le taux d’utilisation de CPU à différents débits pour les cartes, et déterminer le nombre
maximal de ports susceptibles d’être pris en charge par chaque unité en fonction des
différents débits.
Remarque : Les mesures de débit sortant, effectuées sur des travaux dont les transferts
de fichiers sont exécutés en mode brut, sont particulièrement utiles pour estimer les
performances d’unités fonctionnant en mode brut, tels les télécopieurs et les modems.
Ces mesures ne s’appliquent pas aux configurations multi-utilisateurs commerciales,
dont la CPU peut être fortement sollicitée par les accès aux bases de données ou la
gestion de l’écran, et qui sont généralement limitées au niveau des E/S disque.
En mode brut, les données sont traitées comme un flux continu : les octets en entrées ne
sont pas regroupés en lignes et les fonctions ”supprimer” et ”tuer” sont désactivées. Une
taille minimale de bloc de données et une horloge de lecture permettent de déterminer le
traitement appliqué aux octets par le système, avant transmission à l’application.
Les mesures ont été effectuées sur les cartes natives 8, 16 et 64 ports, aux vitesses de
2 400, 9 600, 19 200 et 38 400 bauds. (Les ports asynchrones natifs et les cartes 8 et
16 ports du ESCALA étant tous servis par le même pilote et leurs performances étant
similaires, ils sont référencés sous le même terme, la carte 8/16 ports.) La carte 128 ports
n’a été testée qu’à 19 200 et 38 400 bauds.
La commande AIX de contrôle des performances, iostat (ou sar, pour la carte 128 ports), a
été exécutée en arrière-plan à une fréquence prédéfinie, pour tester les performances du
système. Des mesures ont été effectuées dès qu’un état restait stable pendant un intervalle
de temps fixe, dans la portion rectiligne de la courbe de sortie. Pour chaque test, la charge
système a été progressivement accrue par l’ajout de ports actifs – jusqu’au maximum admis
ou l’utilisation de la CPU à 100 %).
Trois mesures significatives au niveau des performances de pointe – sortie moyenne
cumulée de caractères par seconde (car/sec) sur l’intervalle considéré, débit effectif par
ligne et utilisation de la CPU – ont été effectuées pour la réception et l’envoi semi-duplex.
La régulation XON/XOFF (établissement de connexion asynchrone, sans relation avec la
régulation d’E/S disque AIX), la régulation RTS/CTS et l’absence de régulation ont été
testées. Régulation et établissement de connexion font référence à des mécanismes
9-54
AIX 4.3 Guide d’optimisation
logiciels ou matériels, exploités en communication, pour interrompre les transmissions
lorsque l’unité réceptrice ne peut plus stocker les données qu’elle reçoit. Nous avons
constaté l’adéquation de la régulation XON/XOFF avec les cartes 8/16 ports pour la
réception, et avec la carte 128 ports pour l’envoi et la réception. RTS/CTS est plus adapté à
la carte 64 ports en réception. Pour l’envoi, l’absence de régulation s’est imposée pour les
cartes 8/16 et 64 ports.
La sortie de caractères est la somme cumulée des caractères transmis par seconde sur
toutes les lignes. Les vitesses des lignes (débit en bauds) de 2 400, 9 600, 19 200 et
38 400, définies par le logiciel, sont optimales pour le transfert des données via des lignes
TTY. Alors que le débit correspond à la vitesse de pointe de la ligne, exprimée en
bits/seconde, le débit effectif, toujours moindre, est calculé comme étant égal à 10 fois le
débit de caractère divisé par le nombre de lignes. (Le produit par 10 est justifié par le fait
que le tranfert d’un caractère de 8 bits utilise 10 bits.)
Résultats
Le tableau suivant récapitule les résultats obtenus. ”Max ports:” est le nombre maximal de
ports pris en charge par la carte, lorsque le débit effectif est proche de la vitesse de la ligne.
Vitesse ligne 8/16 ports :
64 ports :
128 ports :
–––––––––––
––––––––––––––– ––––––––––––––– ––––––––––––––––
Send
Receive Send
Receive Send
Receive
2400 baud
Max ports:
32
16
64
64
N/A
N/A
Char/sec
7700
3800
15200
14720
Eff. Kb/sec: 2.4
2.4
2.3
2.3
CPU util. %: 5
32
9
76
9600 baud
Max ports:
32
12
56
20
128
128
Char/sec
30700
11500
53200
19200
122200
122700
Eff. Kb/sec: 9.6
9.6
9.5
9.6
9,6
9.6
CPU util. %: 17
96
25
99
21
27
19,200 baud
Max ports:
32
6
32
10
128
128
Char/sec
48900
11090
51200
18000
245400
245900
Eff. Kb/sec: 15.3
18.5
16
18
19.2
19.2
CPU util. %: 35
93
23
92
39
39
38400 baud
Max ports:
32
4
24
7
75
75
Char/sec
78400
10550
50400
15750
255200
255600
Eff. Kb/sec: 24.5
26.4
21
22.5
34
34
CPU util. %: 68
98
23
81
40
37
Carte asynchrone 8/16 ports
Envoi semi-duplex 8/16 ports
Les mesures relatives aux envois semi-duplex 8/16 ont été effectuées sans régulation,
permettant la libre transmission des données. Pour la carte 8/16 ports, le ESCALA traite
environ 1 400 car/sec pour 1 % d’utilisation CPU. La pointe de sortie d’une seule carte
16 ports est de 48 000 car/sec.
Réception semi-duplex 8/16 ports
Dans cette configuration, avec régulation XON/XOFF, le ESCALA traite environ 120 car/sec
pour 1 % d’utilisation CPU. La pointe de largeur de bande est de 11 000 car/sec à 100 %
d’utilisation CPU pour la carte asynchrone 16 ports.
Carte asynchrone 64 ports
Dans les systèmes à carte asynchrone 64 ports, les limites proviennent le plus souvent du
boîtier concentrateur 16 ports (il peut y en avoir quatre). La saturation du concentrateur est
un problème car, lorsqu’elle approche, aucun transit n’est plus accepté. Le débit effectif est
Contrôle et optimisation des E/S de communication
9-55
réduit, et on constate une importante baisse d’activité. Pour les mesures qui suivent, quatre
concentrateurs 16 ports ont été connectés aux 64 ports RS-232.
Réception semi-duplex 64 ports
Les mesures relatives à la réception semi-duplex 64 ports ont été effectuées avec
régulation matérielle RTS/CTS. Dans cette configuration, le ESCALA traite environ
195 car/sec pour 1 % d’utilisation CPU. La pointe de largeur de bande est de
19 500 car/sec à 100 % d’utilisation CPU.
En réception semi-duplex, un boîtier concentrateur unique 16 ports sature à 8 450 car/sec
avec 44 % d’utilisation CPU. Une fois le concentrateur saturé, aucun transit n’est possible
– tant qu’un autre concentrateur n’est pas installé. A 38 400 bauds, le point de saturation
d’un concentrateur unique est atteint avec quatre ports actifs et un débit effectif de
22,5 kbauds. A 19 200 bauds, le point de saturation est atteint avec cinq ports actifs et un
débit effectif de 17 kbauds. A 9 600 bauds, le point de saturation est atteint avec neuf ports
actifs et un débit effectif de 9,6 kbauds. A 2 400 bauds, le système accepte les 64 ports
avec un débit effectif de 2,3 kbauds sans point de saturation. La pointe de débit est de
14 800 car/sec.
Envoi semi-duplex 64 ports
Les mesures relatives aux envois semi-duplex 64 ports ont été effectuées sans régulation,
permettant la libre transmission des données, sans restriction au niveau du contrôle de flux.
Pour la carte 64 ports, le ESCALA traite environ 1 400 car/sec pour 1 % d’utilisation CPU.
La pointe de débit de la carte 64 ports avec les quatre concentrateurs est de
54 500 car/sec.
Un boîtier concentrateur unique sature à 13 300 car/sec avec 6 % d’utilisation CPU.
A 38 400 bauds, il accepte six ports avec un débit effectif d’environ 22 kbauds.
A 19 200 bauds, il accepte huit ports avec un débit effectif d’environ 16,3 kbauds.
Carte asynchrone 128 ports
Sept cartes asynchrones Digiboard 128 ports peuvent être connectées à un ESCALA, pour
un total de 896 ports.
Il existe deux liaisons SDLC (synchronous-data-link-control) par carte, avec une capacité
cumulée de 2,4 Mbauds. (La carte 64 ports est dotée d’un SDLC quatre canaux pour une
capacité cumulée de 768 kbauds.)
D’autres caractéristiques de la carte 128 ports améliorent la vitesse de transmission des
données et réduisent le taux d’utilisation CPU :
• L’algorithme d’interrogation prend en charge l’interruption d’horloge, évitant toute
interruption hôte supplémentaire. Les taux d’interrogation peuvent être modifiés par
l’application – port par port.
• Le pilote de l’unité détecte les E/S en mode brut et déplace les données de la mémoire
de la carte vers l’espace utilisateur, passant outre la procédure de transmission hôte.
• Le concentrateur traite la plupart des options de discipline de ligne. Le code ”préparé” est
une exception : tous les traitements sont effectués par l’hôte.
• Le microcode de la carte réaffecte les tampons mémoire en fonction du nombre de
concentrateurs et de la mémoire disponible.
Le concentrateur ne sature pas avec les cartes asynchrones 128 ports, donnant à cette
carte un avantage certain sur les cartes asynchrones 64 ports.
Pour les mesures, huit boîtiers concentrateurs 16 ports ont été connectés aux 128 ports
RS-232.
Réception semi-duplex 128 ports
Avec la régulation logicielle XON/XOFF, cette configuration traite environ 6 908 car/sec pour
1% d’utilisation CPU. La pointe de débit est de 255 600 car/sec à 37 % d’utilisation CPU.
9-56
AIX 4.3 Guide d’optimisation
Envoi semi-duplex 128 ports
Sans régulation, le taux maximal auquel cette configuration peut envoyer des données à
une unité TTY est d’environ 5 800 car/sec pour 1 % d’utilisation CPU. La pointe de sortie de
la carte 128 ports est 255 200 car/sec.
Techniques d’optimisation du port asynchrone
Les configurations test de cette étude font appel à nombre de mécanismes logiques et
physiques de contrôle de flux, ainsi qu’à des techniques logicielles pour optimiser les taux
de transmission de caractères. Vous trouverez ci-dessous quelques précisions sur ces
techniques. (Un script shell contenant les commandes stty permettant d’implanter
l’essentiel de ces techniques est fourni en fin de section.)
• Augmentez la valeur (4, par défaut) de la variable vmin pour chaque TTY. vmin est le
nombre minimal d’octets à recevoir lorsque la lecture aboutit. La valeur de vmin doit être
la plus petite de la taille de bloc des données ou 255 (maximum autorisé). Si la taille de
bloc de l’application est variable ou inconnue, définissez vmin à 255 : le nombre de
lectures sera réduit de même que le taux d’utilisation de CPU (de 15 à 20 % pour les
programmes de transfert de fichiers).
• Sauf sur la carte 128 ports, définissez vtime > 0 pour prévenir une lecture de bloc
indéfinie. Si vtime est défini à zéro sur la carte 128 ports, le traitement de la procédure de
transmission POSIX sera déchargé sur le matériel de la carte, réduisant sensiblement le
traitement CPU.
• Pour les envois en mode brut où aucune translation en sortie n’est nécessaire,
désactivez l’option opost sur ligne de procédure POSIX. Les performances CPU seront
améliorées par la réduction de la longueur du chemin de sortie. Pour les applications de
transfert de fichiers, qui déplacent d’importantes quantités de données sur les lignes TTY,
le taux d’utilisation de CPU peut être divisé par 3. Exemple :
# stty –opost < /dev/ttyn
• La carte 64 ports étant sujet à des surcharges de données imprévisibles lorsque le débit
est élevé et que la régulation est effectuée via XON/XOFF, optez pour la régulation
matérielle RTS/CTS. Vous évitez ainsi les risques de perte de données.
• Dans la mesure où les boîtiers concentrateurs de la carte 64 ports ont une largeur de
bande limitée et saturent lorsque les débits sont élevés, ajouter des ports à un
concentrateur saturé ne fera que dégrader les performances de tous les ports connectés.
Ajoutez plutôt un autre concentrateur et poursuivez jusqu’à ce que lui aussi sature ou
que la CPU soit surchargée.
• Pour le traitement des entrées, l’option echo est coûteuse, dans la mesure où elle accroît
la durée de traitement par caractère. L’écho de caractère est utile pour les entrées
utilisateur canoniques, mais le plus souvent inutile pour la plupart des applications en
mode brut. Exemple :
# stty –echo < /dev/ttyn
Contrôle et optimisation des E/S de communication
9-57
Transfert rapide de fichiers avec fastport
Le script fastport.s a pour objet de configurer un port TTY pour le transfert rapide des
fichiers en mode brut (lorsqu’un télécopieur doit être raccordé, par exemple). Utiliser ce
script peut multiplier par 3 les performances CPU (à un débit de 38 400 bauds).
fastport.s n’est pas destiné au traitement canonique utilisé lors de l’interaction avec un
utilisateur sur terminal asynchrone, car un traitement canonique ne peut pas être aisément
placé en mémoire tampon. La largeur de bande d’une lecture canonique est trop faible pour
les paramètres du port rapide pour qu’une différence soit perceptible.
N’importe quel port TTY peut être configuré comme port rapide. L’amélioration des
performances qui en résulte est due à la diminution du nombre d’interruptions vers la CPU
au cours du cycle de lecture sur une ligne TTY donnée.
1. Créez un TTY pour le port via SMIT (Unités –> TTY –> Ajout d’un TTY), avec
Activation de la connexion=disable et Vitesse de transmission=38 400.
2. Créez le script shell Korn fastport.s, comme suit :
#****************************************************************
#
#
Configures a fastport for ”raw” async I/O.
#
#****************************************************************
set –x
sync;sync
i=$1
if [ $i –le 100 ]
then
# for the native async ports and the 8–, 16–, and 64–port adapters
# set vmin=255 and vtime=0.5 secs with the following stty
stty –g </dev/tty$i |awk ’ BEGIN { FS=”:”;OFS=”:” }
{ $5=”ff”;$6=5;print $0 } ’ >foo
# for a 128–port adapter, remove the preceding stty, then
# uncomment and use the
# following stty instead to
# set vmin=255 and vtime=0 to offload line discipline processing
# stty –g </dev/tty$i |awk ’ BEGIN { FS=”:”;OFS=”:” }
# { $5=”ff”;$6=0;print $0 } ’ >foo
stty ‘cat foo ‘ </dev/tty$i
sleep 2
# set raw mode with minimal input and output processing
stty –opost –icanon –isig –icrnl –echo –onlcr</dev/tty$i
rm foo
sync;sync
else
echo ”Usage is fastport.s < TTY number >”
fi
3. Appelez le script pour le numéro TTY avec la commande :
fastport.s number
9-58
AIX 4.3 Guide d’optimisation
Evaluation des performances réseau avec netpmon
La commande netpmon fait appel à la fonction de suivi pour obtenir une image détaillée de
l’activité du réseau pendant un intervalle de temps déterminé. Dans la mesure où la
commande filemon invoque cet utilitaire, seul l’utilisateur root ou un membre du groupe
system est habilité à la lancer. La commande netpmon n’est pas prévue pour fonctionner
avec NFS3(ONC+).
Sous AIX version 4.1, la commande netpmon est intégrée à la boîte à outils PTX
(Performance Toolbox for AIX). Pour déterminer si netpmon est disponible, entrez :
lslpp –lI perfagent.tools
Si ce module est installé, netpmon est disponible.
Le suivi, lancé par la commande netpmon, peut être suspendu par trcoff, relancé par
trcon et arrêté par trcstop. Dès que le suivi est terminé, netpmon en envoie le compte
rendu à stdout. Voici un exemple d’utilisation de netpmon :
# netpmon –o nm.test.out ; ping xactive 256 5 ; trcstop
Le compte rendu généré (quelque peu résumé) par cette séquence, dans un système au
repos, est le suivant :
Wed Jan 12 14:33:25 1994
System: AIX alborz Node: 3 Machine: 000249573100
4.155 secs in measured interval
========================================================================
Process CPU Usage Statistics:
–––––––––––––––––––––––––––––
Network
Process (top 20)
PID CPU Time
CPU %
CPU %
––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
ping
12699
0.0573
1.380
0.033
trcstop
12700
0.0150
0.360
0.000
ksh
13457
0.0150
0.360
0.000
rlogind
6321
0.0127
0.306
0.088
netpmon
12690
0.0064
0.153
0.000
netw
771
0.0047
0.113
0.113
netpmon
10650
0.0037
0.090
0.000
trace
10643
0.0023
0.055
0.000
swapper
0
0.0022
0.053
0.000
writesrv
1632
0.0009
0.021
0.000
––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
Total (all processes)
0.1201
2.891
0.234
Idle time
3.8904 93.639
========================================================================
First Level Interrupt Handler CPU Usage Statistics:
–––––––––––––––––––––––––––––––––––––––––––––––––––
Network
FLIH
CPU Time
CPU %
CPU %
––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
external device
0.0573
1.379
0.890
data page fault
0.0368
0.887
0.000
floating point
0.0001
0.003
0.000
––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
Total (all FLIHs)
0.0943
2.269
0.890
========================================================================
Second Level Interrupt Handler CPU Usage Statistics:
––––––––––––––––––––––––––––––––––––––––––––––––––––
Network
SLIH
CPU Time
CPU %
CPU %
––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
clock
0.0415
0.998
0.000
tokdd
0.0064
0.154
0.154
<addr=0x00022140>
0.0008
0.019
0.000
––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
Total (all SLIHs)
0.0486
1.171
0.154
Contrôle et optimisation des E/S de communication
9-59
========================================================================
Network Device–Driver Statistics (by Device):
–––––––––––––––––––––––––––––––––––––––––––––
––––––––––– Xmit ––––––––––
––––– Recv ––––
Device
Pkts/s Bytes/s Util QLen
Pkts/s Bytes/s
––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
/dev/tok0
3.37
629 0.005 0.005
16.85
1900
========================================================================
Network Device–Driver Transmit Statistics (by Destination Host):
––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
Host
Pkts/s Bytes/s
––––––––––––––––––––––––––––––––––––––––
xactive.austin.ibm.com
1.44
390
========================================================================
Detailed Second Level Interrupt Handler CPU Usage Statistics:
–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
SLIH: tokdd
count:
84
cpu time (msec):
avg 0.076
min 0.058
max 0.097
sdev 0.009
========================================================================
Detailed Network Device–Driver Statistics:
––––––––––––––––––––––––––––––––––––––––––
DEVICE: /dev/tok0
recv packets:
70
recv sizes (bytes):
avg
112,8 min
68 max
324 sdev
75,2
recv times (msec):
avg
0,226 min
0,158 max
0,449 sdev
0,056
xmit packets:
14
xmit sizes (bytes):
avg
186,6 min
52 max
314 sdev
100,0
xmit times (msec):
avg
1,552 min
1,127 max
2,532 sdev
0,380
========================================================================
Detailed Network Device–Driver Transmit Statistics (by Host):
–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
HOST: xactive.austin.ibm.com
xmit packets:
6
xmit sizes (bytes):
avg
270,3 min
52 max
314 sdev
97,6
xmit times (msec):
avg
1,772 min
1,516 max
2,532 sdev
0,346
9-60
AIX 4.3 Guide d’optimisation
Analyse des problèmes de performance avec iptrace
Il existe de nombreux outils de suivi de l’activité, normale ou anormale, sur le réseau.
Certains sont opérationnels sous AIX, d’autres requièrent un matériel spécifique. Un des
outils permettant d’obtenir une description précise, paquet par paquet, de l’activité du LAN
générée par une charge de travail, est la combinaison du démon iptrace et de la
commande ipreport. Seul l’utilisateur root est habilité à lancer le démon iptrace.
Par défaut, iptrace assure le suivi de tous les paquets. Une option (–a) permet d’exclure les
paquets du protocole ARP (Address Resolution Protocol). D’autres options permettent de
resteindre l’objet du suivi à un hôte source (–s), un hôte destinataire (–d) ou un protocole
(–p) donné. Reportez-vous au manuel AIX Commands Reference. La consommation
iptrace de temps processeur étant non négligeable, ciblez bien les paquets dont vous
souhaitez le suivi.
iptrace étant un démon, mieux vaut le lancer via une commande startsrc et non à partir de
la ligne de commande : il sera plus facile de le contrôler et de l’arrêter ”proprement”.
Voici un exemple d’appel classique :
# startsrc –s iptrace –a ”–i tr0 /home/user/iptrace/log1”
Cette commande lance le démon iptrace avec mission d’assurer le suivi de toutes les
activités sur l’interface en anneau à jeton, tr0, et de placer les données de suivi dans
/home/user/iptrace/log1. Pour arrêter le démon, entrez :
# stopsrc –s iptrace
Si vous ne l’aviez pas lancé avec startsrc, vous auriez dû rechercher son ID processus via
ps et le tuer (kill).
La commande ipreport est une commande de formatage pour le fichier journal. Sa sortie
est écrite sur stdout. Des options permettent de reconnaître et de formater les paquets
RPC (–r), d’identifier chaque paquet par un numéro (–n) et de préfixer chaque ligne par une
chaîne de 3 caractères identifiant le protocole (–s). Voici une commande ipreport formatant
le fichier log1 juste créé (appartenant à l’utilisateur root) :
# ipreport –ns log1 >log1-formaté
Il en résulte une séquence de comptes rendus de paquet semblable aux exemples ci-après.
Le premier paquet est la première moitié d’un ping. Les champs les plus intéressants sont :
les adresses des hôtes source (SRC) et destination (DST) (en décimal avec point
séparateur et en ASCII), la longueur du paquet IP (ip_len), et l’indication du protocole de
plus haut niveau en cours (ip_p).
Packet Number 131
TOK: =====( packet transmitted on interface tr0 )=====Fri Dec 10 08:42:07 1993
TOK : 802.5 packet
TOK: 802.5 MAC header:
TOK: access control field = 0, frame control field = 40
TOK: [ src = 90:00:5a:a8:88:81, dst = 10:00:5a:4f:35:82]
TOK: routing control field = 0830, 3 routing segments
TOK: routing segments [ ef31 ce61 ba30 ]
TOK: 802.2 LLC header:
TOK: dsap aa, ssap aa, ctrl 3, proto 0:0:0, type 800 (IP)
IP:
< SRC = 129.35.145.140 > (alborz.austin.ibm.com)
IP:
< DST = 129.35.145.135 > (xactive.austin.ibm.com)
IP:
ip_v=4, ip_hl=20, ip_tos=0, ip_len=84, ip_id=38892, ip_off=0
IP:
ip_ttl=255, ip_sum=fe61, ip_p = 1 (ICMP)
ICMP:
icmp_type=8 (ECHO_REQUEST) icmp_id=5923 icmp_seq=0
ICMP: 00000000
2d088abf 00054599 08090a0b 0c0d0e0f
|–.....E.........|
ICMP: 00000010
10111213 14151617 18191a1b 1c1d1e1f
|................|
ICMP: 00000020
20212223 24252627 28292a2b 2c2d2e2f
| !”#$%&’()*+,–./|
ICMP: 00000030
30313233 34353637
|01234567
|
Contrôle et optimisation des E/S de communication
9-61
L’exemple suivant est une trame résultant d’une opération ftp. Notez que le paquet IP est la
taille du MTU pour ce réseau (1 492 octets).
Packet Number 501
TOK: =====( packet received on interface tr0 )=====Fri Dec 10 08:42:51 1993
TOK: 802.5 packet
TOK: 802.5 MAC header:
TOK: access control field = 18, frame control field = 40
TOK: [ src = 90:00:5a:4f:35:82, dst = 10:00:5a:a8:88:81]
TOK: routing control field = 08b0, 3 routing segments
TOK: routing segments [ ef31 ce61 ba30 ]
TOK: 802.2 LLC header:
TOK: dsap aa, ssap aa, ctrl 3, proto 0:0:0, type 800 (IP)
IP:
< SRC = 129.35.145.135 > (xactive.austin.ibm.com)
IP:
< DST = 129.35.145.140 > (alborz.austin.ibm.com)
IP:
ip_v=4, ip_hl=20, ip_tos=0, ip_len=1492, ip_id=34233, ip_off=0
IP:
ip_ttl=60, ip_sum=5ac, ip_p = 6 (TCP)
TCP:
<source port=20(ftp–data), destination port=1032 >
TCP:
th_seq=445e4e02, th_ack=ed8aae02
TCP:
th_off=5, flags<ACK |>
TCP:
th_win=15972, th_sum=0, th_urp=0
TCP: 00000000
01df0007 2cd6c07c 00004635 000002c2
|....,..|..F5....|
TCP: 00000010
00481002 010b0001 000021b4 00000d60
|.H........!....‘|
––––––––– Lots of uninteresting data omitted –––––––––––
TCP: 00000590
63e40000 3860000f 4800177d 80410014
|c...8‘..H..}.A..|
TCP: 000005a0
82220008 30610038 30910020
|.”..0a.80..
|
9-62
AIX 4.3 Guide d’optimisation
Chapitre 10. Optimisation des performances DFS
Remarque : Les recommandations qui suivent s’appuient sur des essais effectués sous
AIX version 4.1. Au moment où nous écrivons, nous ne savons pas dans quelle mesure
elles s’appliquent également à AIX version 4.1.
Du point de vue des performances, la différence essentielle entre DCE DFS et NFS est la
capacité du client de mise en cache de DFS. Il n’est donc pas étonnant que les principales
techniques d’optimisation de DFS concernent les attributs du cache client. Les paramètres
client et serveur décrits dans ce chapitre concernent :
• ”Cache DFS sur disque ou en mémoire”
• ”Taille du cache DFS”
• ”Taille de la tranche de cache DFS”
• ”Nombre de tranches de cache DFS”
• ”Emplacement du cache disque DFS”
• ”Taille du tampon d’état du cache DFS”
• ”Taille des articles et lectures/écritures”
• ”Paramètres de communication DFS”
• ”Optimisation du serveur de fichiers DFS”
• ”Optimisation LFS DCE pour les performances DFS.”
Cache DFS sur disque ou en mémoire
Pour déterminer si, dans votre environnement, mieux vaut accéder au disque ou à la
mémoire, considérez ce qui suit :
• Si le système en cours d’optimisation, ou un autre système présentant une charge de
travail similaire, exploite déjà DFS avec un cache disque, vous pouvez estimer la taille de
cache mémoire requise, en lançant, à l’issue d’une période de pointe, la commande :
cm getcachesize
Divisez le nombre de blocs de 1 ko utilisés par 0,9 pour déterminer la taille de cache
mémoire requise pour la même quantité de données. (Environ 10 % des blocs du cache
servent à conserver les articles DFS.)
• Si l’accès à ces données est fréquent, optez pour un potentiel supérieur de cache disque.
• Si la quantité de données gérées est telle que le cache disque le plus grand risque d’être
submergé, ou que les données sont fréquemment modifiées par un autre client, optez de
préférence pour un cache mémoire, plus efficace au niveau des performances RFC.
• La taille d’un cache mémoire ne doit pas excéder 10 % de la taille de la mémoire réelle
de la machine. La taille recommandée est d’environ 5 % de la mémoire réelle. DFS
exploitant la capacité de mise en cache mémoire du VMM AIX, l’essentiel du cache
mémoire DFS est occupé par les informations sur les répertoires et les points de
montage.
• Si vous constatez un signe de limitation en mémoire du système (valeur non nulle à la
colonne pi ou po d’un relevé vmstat), n’utilisez pas de cache mémoire pour DFS.
Optimisation des performances DFS
10-1
• A titre de test de faisabilité, vous pouvez réduire temporairement, via rmss, la taille
effective de la mémoire en déduisant la quantité de mémoire que vous affecterez au
cache. Si vous constatez une activité de pagination ou une baisse de performances, ou
les deux, abandonnez l’idée de créer un cache mémoire. Reportez-vous à ”Estimation de
la mémoire requise via rmss”, page 7-6.
Taille du cache DFS
La détermination de la taille adéquate du cache DFS pour un système donné se fait un peu
par tâtonnement. Vous pouvez commencer par estimer la somme :
• des tailles de l’ensemble des fichiers de données DFS résidants lus au moins une fois
par jour,
• des quantités de données DFS résidantes générées quotidiennement par les utilisateurs,
• des tailles des programmes DFS résidants exécutés plus d’une fois par jour.
Si les répertoires personnels des utilisateurs se trouvent dans DFS, vous pouvez définir des
autorisations concernant la fréquence d’accès à ces répertoires, et étudier la réaction du
système.
La taille du cache client, spécifiée dans le fichier CacheInfo, peut être remplacée via
l’option dfsd –blocks n, n étant le nombre de ko du cache. Ce paramètre s’applique aux
caches mémoire comme aux caches disque.
Taille de la tranche de mémoire cache DFS
La taille de tranche du cache DFS varie entre 8 et 256 ko. Pour les fichiers volumineux
(plusieurs Mo), les performances des lectures/écritures séquentielles augmentent avec
cette taille (jusqu’à environ 64 ko). Pour les fichiers encore plus importants (plus de
100 Mo), une tranche de 256 ko entraîne la meilleure performance en lecture.
La taille de tranche est spécifiée via l’option dfsd –chunksize n, n étant un entier compris
entre 13 et 18 (inclus). La taille du cache est de 2**n octets, et est dons comprise entre
8 (2**13) et 256 ko (2**18). Ce paramètre s’applique aux caches mémoire comme aux
caches disque. Taille par défaut : ko (caches mémoire) et 64 ko (caches disque).
Nombre de tranches de cache DFS
Ce paramètre ne s’applique qu’aux caches disque. Pour les caches mémoire, le nombre de
tranches est déjà spécifié par la combinaison de la taille de cache et de la taille de tranche.
Pour les caches disque, le nombre de tranches par défaut est défini comme étant le nombre
de blocs cache divisé par 8. Si un du du répertoire cache indique que l’espace n’est rempli
qu’à moins de 90 %, augmentez le nombre de tranches de cache via l’option dfsd –files n,
n étant le nombre de tranches à adapter. Ce qui permet une meilleure utilisation de l’espace
cache disponible pour les applications qui font appel à de nombreux petits fichiers.
Plusieurs fichiers ne pouvant partager une tranche, le nombre de tranches détermine le
nombre de fichiers susceptibles d’être pris en charge par le cache.
Emplacement du cache disque DFS
Le cache disque doit se trouver dans un volume logique qui :
• se trouve dans la zone outer_edge, s’il se trouve sur une unité de disque de 200 Mo,
540 Mo ou 1 Go,
• se trouve dans la zone center, sur une unité de disque autre que celles précitées,
• se trouve ailleurs que dans le groupe de volume rootvg,
10-2
AIX 4.3 Guide d’optimisation
• se trouve sur un autre volume physique que l’espace de pagination,
• soit principalement ou exclusivement occupé par le cache disque,
• soit suffisamment vaste pour contenir le cache disque spécifié sans empiéter sur le reste.
Taille du tampon d’état du cache DFS
La taille du tampon d’état limite le nombre maximal de fichiers susceptibles de se trouver
simultanément dans le cache. Une entrée est requise pour chaque fichier. Si le tampon
d’état est saturé, les nouveaux fichiers déplaceront les anciens dans le cache, même si
l’espace disque est suffisant. Si votre charge de travail concerne essentiellement des
fichiers dont la taille est inférieure ou égale à celle de la tranche, le tampon d’état doit avoir
autant d’entrées qu’il y a de tranches dans le cache.
La taille du tampon d’état est spécifiée via l’option dfsd –stat n, n étant le nombre d’entrées
du tampon d’état. Valeur par défaut de n :
Taille des articles et lectures/écritures
Les performances relatives aux lectures/écritures séquentielles sont affectées par la taille
des articles lus ou écrits par l’application. En général, le débit des lectures croît avec des
articles dont la taille augmente jusqu’à 4 ko, puis décroît au-delà. Le débit des écritures
croît avec des articles dont la taille augmente jusqu’à 2 ko, puis se stabilise ou décroît
légèrement au-delà.
Paramètres de communication DFS
DFS se sert du protocole de communication UDP. Les recommandations pour optimiser les
communication DFS pour les systèmes client multiutilisateur et les serveurs sont celles
indiquées pour l’optimisation des communications en général (voir ”Récapitulatif des
paramètres d’optimisation UDP, TCP/IP et mbuf”, page 9-31) :
• Donnez à la taille des files d’attente de réception et d’envoi de la carte réseau la
valeur 150 (le maximum). Pour ce faire, faites appel à smit commodev –> (type carte)
–> Adapter –> Change / Show Characteristics of a (type carte) Adapter. Ces paramètres
ne peuvent être modifiés en cours d’utilisation de la carte. SMIT permet de préciser que
la modification ne doit prendre effet qu’à l’amorçage suivant du système.
Vous pouvez également définir ces paramètres via chdev, si vous commencez par
désactiver la carte. Par exemple, pour une carte en anneau à jeton, la séquence de
commande est :
# ifconfig tr0 detach
# chdev –l tok0 –a xmt_que_size=150 –a rec_que_size=150
# ifconfig tr0 hostname up
Vous pouvez observer l’effet de la modification via :
$ lsattr –E –l tok0
• Si la commande netstat –s génère un nombre non nul dans udp : n socket buffer
overflows, augmenter la valeur des paramètres sb_max et udp_recvspace via la
commande no ne résoud le problème que si une application autre que DFS subit un
dépassement. DFS définit ses propres valeurs (176 ko) pour sb_max et
udp_recvspace. Ces valeurs ne sont ni affichées ni modifiées par la commande no.
Optimisation des performances DFS
10-3
Optimisation du serveur de fichiers DFS
Sur les serveurs haute vitesse, il peut être souhaitable d’augmenter le nombre de
–mainprocs et de –tokenprocs (dans la commande fxd), pour garantir l’exploitation de
toute la capacité CPU disponible.
• Commencez par spécifier –mainprocs 10 –tokenprocs 4.
• Exécutez vmstat en période de pointe. Si vous constatez un niveau très élevé d’E/S
CPU en attente, tentez d’augmenter encore les valeurs de –mainprocs et de
–tokenprocs.
Optimisation LFS DCE pour les performances DFS
Lorsque vous configurez un agrégat LFS DCE (via la commande newaggr) sur un serveur
DFS, tenez compte de ce qui suit :
• Si la plupart des fichiers sont volumineux, donnez au paramètre –blocksize la valeur
maximale autorisée qui soit inférieure à la taille standard de fichier. La valeur de
–blocksize peut être une puissance de 2 quelconque comprise entre 4 et 64 ko.
• Si la plupart des fichiers sont plusieurs fois plus grands que le paramètre –blocksize,
donnez au paramètre –fragsize la même valeur que celle de –blocksize. Vous utiliserez
sans doute plus d’espace disque, mais fluidifierez le traitement.
• Si l’agrégat est inférieur à 100 Mo, utilisez le paramètre –logsize pour vérifier que le
journal est plus grand que la valeur par défaut (1 % de la taille de l’agrégat). En général,
logsize ne doit jamais être inférieur à 1 000 blocs.
10-4
AIX 4.3 Guide d’optimisation
Chapitre 11. Analyse des performances avec l’utilitaire
de suivi
L’utilitaire de suivi AIX est un puissant outil d’observation du système. Il capture un flux
séquentiel d’événements horodatés, fournissant un niveau de détail extrêmement fin sur
l’activité du système. Les événements sont restitués dans l’ordre chronologique et dans leur
contexte. L’utilitaire est ainsi un outil privilégié d’observation du système et de l’exécution
des applications. D’autres outils sont axés sur les statistiques (taux d’utilisation du CPU,
délai d’attente des E/S, etc.), l’utilitaire de suivi est lui plus spécifiquement dédié à l’analyse
du pourquoi et du comment.
Le système d’exploitation est conçu pour offrir une visibilité générale des exécutions sur le
système. Les utilisateurs peuvent étendre la visibilité dans leurs applications en insérant
des événements complémentaires et en fournissant des règles de formatage.
Lors de la conception et de l’implantation de cet outil, il a été pris grand soin de veiller à
l’efficacité de la collecte des données, de façon à perturber au minimum l’activité système.
De ce fait, l’utilitaire est aussi adapté à l’analyse des performances qu’à l’identification des
incidents.
Plus en savoir plus, reportez-vous aux rubriques :
• ”Présentation de l’utilitaire de suivi”
• ”Exemple d’utilisation de l’utilitaire de suivi”
• ”Lancement et contrôle du suivi depuis la ligne de commande”
• ”Lancement et contrôle du suivi depuis un programme”
• ”Ajout d’événements de suivi”
• ”Syntaxe des strophes du fichier de format du suivi”
Analyse des performances avec l’utilitaire de suivi
11-1
Présentation de l’utilitaire de suivi
L’utilitaire de suivi est plus souple que les services classiques de surveillance du système,
qui présentent les statistiques tenues à jour par le système. Dans ces services en effet, la
réduction des données (conversion d’événements système en statistiques) est largement
associée à l’instrumentation du système. Ainsi, nombre de systèmes tiennent à jour le délai
minimal, maximal et moyen, d’exécution de la tâche A et autorisent l’extraction de cette
information.
L’utilitaire de suivi AIX n’associe pas fermement réduction des données et instrumentation,
mais fournit un flot d’articles événements de suivi (appelés plus simplement événements).
Il est inutile de décider à l’avance des statistiques requises. La réduction des données est
dans une large mesure indépendante de l’instrumentation. L’utilisateur peut décider de
déterminer les délais d’exécution minimal, maximal et moyen de la tâche A à partir du flot
d’événements. Mais il est également possible d’extraire le délai moyen d’exécution de la
tâche A lorsqu’elle est appelée par le processus B ; ou encore le délai d’exécution de la
tâche A lorsque les conditions XYZ sont remplies ; ou de calculer la déviation standard à
l’exécution de la tâche A ; ou même de décider qu’une autre tâche, reconnue par un flot
d’événements, est plus significative. Cette souplesse est sans prix lorsqu’il s’agit de
diagnostiquer des problèmes de performance ou de fonctionnement.
Outre les informations détaillées qu’il fournit sur l’activité du système, l’utilitaire de suivi
permet d’instrumenter les programmes d’application et de collecter leurs événements de
suivi à l’instar des événements du système. Le fichier de suivi contient un enregistrement
complet des activités du système et des applications, horodatées et présentées
chronologiquement.
Limitation de la quantité de données collectées
L’utilitaire de suivi génère d’importantes quantités de données. Il est donc impossible de les
capturer sur de longues périodes, sous peine de submerger l’unité de stockage.
Pour utiliser efficacement l’utilitaire, vous avez le choix :
• L’utilitaire de suivi peut être activé/désactivé de plusieurs façons pour capturer des bribes
de l’activité système. Il est pratique de capturer ainsi des secondes ou des minutes
d’activité en vue d’un post-traitement. Une durée de cet ordre est suffisante pour
caractériser les transactions principales au niveau des applications ou les passages
intéressants d’une longue tâche.
• L’utilitaire de suivi peut être configuré pour acheminer le flot d’événements vers la sortie
standard. Ce qui permet à un processus en temps réel de se connecter au flux
d’événements et d’effectuer la réduction des données au fur et à mesure de la
consignation des événements, créant ainsi une possibilité de surveillance à long terme.
Une extension logique pour l’instrumentation spécialisée est de diriger le flot de données
vers une unité auxiliaire susceptible soit de stocker d’importantes quantités de données,
soit d’assurer la réduction dynamique des données. Cette technique est utilisée par les
outils de performance tprof, netpmon et filemon.
Lancement et contrôle du suivi
Vous pouvez exploiter l’utilitaire de suivi selon trois modes :
• Mode sous-commande. Le suivi est lancé par une commande shell (trace) et prolongé
par un dialogue avec l’utilisateur via des sous-commandes. Le travail objet du suivi doit
être fourni par d’autres processus, car le processus shell d’origine est en cours
d’utilisation.
• Mode commande. Le suivi est lancé par une commande shell (trace –a) qui comporte un
indicateur spécifiant que l’utilitaire doit être exécuté en mode asynchrone. Le processus
shell d’origine est disponible pour exécuter des commandes standard, entrecoupées de
commandes de contrôle de suivi.
11-2
AIX 4.3 Guide d’optimisation
• Mode contrôlé par application. Le suivi est lancé (avec trcstart()) et contrôlé par des
appels de sous-routines (telles que trcon(), trcoff()), à partir d’un programme
d’application.
Formatage des données de suivi
Un utilitaire passe-partout de compte rendu de suivi est fourni par la commande trcrpt.
Cet utilitaire offre peu de réduction de données, mais convertit le flot brut d’événements
binaires en listing ASCII lisible. Les données peuvent être visuellement extraites par un
lecteur, mais vous pouvez également développer des outils pour une meilleure réduction
des données.
L’utilitaire affiche texte et données pour chaque événement en fonction des règles
spécifiées dans le fichier de format du suivi. Le fichier de format du suivi par défaut est
/etc/trcfmt. Ce fichier contient une strophe par ID événement, qui indique à l’utilitaire de
compte rendu les règles de formatage pour cet événement. Cette technique permet aux
utilisateurs d’ajouter leurs propres événements aux programmes et d’insérer les strophes
correspondantes dans le fichier de format – pour préciser le format souhaité pour ces
nouveaux événements.
Consultation des données de suivi
Lors du formatage des données de suivi, toutes les données relatives à un événement sont
généralement placées sur une seule ligne. Des compléments d’information se trouvent
éventuellement sur d’autres lignes. Selon les champs inclus, les lignes formatées peuvent
facilement dépasser 80 caractères : mieux vaut prévoir une unité de sortie 132 colonnes.
Analyse des performances avec l’utilitaire de suivi
11-3
Exemple d’utilisation de l’utilitaire de suivi
Obtention d’un fichier de suivi échantillon
Les données de suivi s’accumulent rapidement. Nous souhaitons restreindre la collecte aux
données qui présentent un réel intérêt. Une technique possible consiste à émettre plusieurs
commandes sur la même ligne de commande. Par exemple :
$ trace –a –k ”20e,20f” –o ./trc_raw ; cp ../bin/track /tmp/junk ; trcstop
capture l’exécution de la commande cp. Nous avons utilisé deux caractéristiques de la
commande de suivi. L’option –k ”20e,20f” élimine la collecte des événements issus des
fonctions lockl et unlockl. Ces appels sont nombreux et augmentent la taille du compte
rendu sans apporter d’informations au niveau qui nous intéresse. L’option –o ./trc_raw
entraîne l’écriture du fichier brut de sortie du suivi dans notre répertoire local.
Remarque : Cet exemple est plus parlant si le fichier d’entrée ne se trouve pas déjà
dans la mémoire cache du système. Choisissez comme fichier source un fichier
d’environ 50 ko qui n’a fait l’objet d’aucun accès récent.
Formatage de l’échantillon de suivi
Pour notre compte rendu, nous avons utilisé la commande trcrpt sous la forme :
$ trcrpt –O ”exec=on,pid=on” trc_raw > cp.rpt
Cette commande génère à la fois le nom complet qualifié du fichier exécuté (via exec) et
l’ID processus qui lui est affecté.
Un coup d’œil sur le compte rendu indique la présence de nombreuses affectations de
pages VMM et de suppressions d’événements dans le suivi, telle la séquence :
1B1 ksh
8525
00.150E ppage=1F7F
0.003109888
0.162816
VMM page delete:
V.S=00
delete_in_progress
process_private working_storage
1B0 ksh
8525
00.2F33 ppage=1F7F
0.003141376
0.031488
VMM page assign:
V.S=00
delete_in_progress
process_private working_storage
L’activité VMM ne nous intéressant pas à ce niveau, nous avons reformaté le suivi via :
$ trcrpt –k ”1b0,1b1” –O ”exec=on,pid=on” trc_raw > cp.rpt2
L’option –k ”1b0,1b1” supprime les événements VMM superflus de la sortie formatée.
Elle évite de relancer le suivi du travail pour éliminer les événements non souhaités. Nous
aurions pu faire appel à la fonction –k de trcrpt au lieu de celle de la commande trace pour
éliminer les événements lockl et unlockl, si nous avions eu besoin de consulter l’activité de
verrouillage à un moment donné. Si notre intérêt ne portait que sur un petit nombre
d’événements, nous aurions spécifié –d ”id-ancre1,id-ancre2” pour générer un compte
rendu ne portant que sur ces événements. L’ID ancre étant la première colonne du compte
rendu, il est très rapide de compiler une liste d’ancres à inclure ou exclure.
Une liste complète des ID d’ancre de suivi se trouve dans /usr/include/sys/trchkid.h.
11-4
AIX 4.3 Guide d’optimisation
Interprétation d’un compte rendu de suivi
L’en-tête du compte rendu de suivi indique la date et le lieu où a été effectué le suivi, ainsi
que la commande utilisée pour le générer :
Fri Nov 19 12:12:49 1993
System: AIX ptool Node: 3
Machine: 000168281000
Internet Address: 00000000 0.0.0.0
trace –ak 20e 20f –o –o ./trc_raw
Le corps du compte rendu, si affiché en caractères suffisamment petits, est semblable à :
ID PROCESS NAME
PID
ELAPSED_SEC
101 ksh
101 ksh
134 cp
8525
7214
7214
0.005833472
0.012820224
0.014451456
DELTA_MSEC
APPL SYSCALL KERNEL INTERRUPT
0.107008
0.031744
0.030464
kfork
execve
execcp../bin/trk/junk
Dans cp.rpt, vous pouvez observer :
• Les activités fork, exec et défaut de page du processus cp.
• L’ouverture du fichier d’entrée pour la lecture et la création du fichier /tmp/junk.
• Les appels système read/write successifs pour effectuer la copie.
• Le blocage du processus cp dans l’attente de la fin des E/S et de la distribution du
processus wait.
• Les translations des requêtes de volume logique en requêtes de volume physique.
• Le mappage des fichiers (et non leur stockage dans les tampons classiques du noyau) et
les accès en lecture provoquant des défauts de page qui doivent être résolus par VMM
(Virtual Memory Manager).
• La détection des accès séquentiels par le gestionnaire de mémoire virtuelle (VMM),
lequel déclenche un accès anticipé aux pages de fichier.
• La taille des données lues par anticipation – qui augmente avec la poursuite de l’accès
séquentiel.
• Lorsque possible, la fusion par le pilote d’unité de disque des requêtes de fichier
multiples en une seule requête d’E/S à destination du pilote.
La sortie du suivi semble au départ quelque peu surchargée. C’est un bon exercice
d’apprentissage : si vous parvenez à discerner les activités décrites, vous êtes sur la bonne
voie, et vous pourrez bientôt suffisamment maîtriser l’utilitaire de suivi et l’exploiter pour
diagnostiquer les problèmes de performance du système.
Filtrage du compte rendu de suivi
L’intégralité des données de suivi n’est pas forcément utile. Vous pouvez décider des
événements qu’il vous semble intéressant de suivre. Il est parfois utile, par exemple, de
déterminer le nombre d’occurrences d’un événement donné. Pour répondre à la question
”Combien de open se sont produits dans l’exemple de copie ?”, recherchez d’abord l’ID
événement de l’appel système open. Procédez comme suit :
$ trcrpt –j | grep –i open
Vous constatez que l’ID 15b correspond à l’événement open. Traitez maintenant les
données de l’exemple :
$ trcrpt –d 15b –O ”exec=on” trc_raw
Le compte rendu est inscrit sur la sortie standard et vous pouvez déterminer le nombre de
sous-routines open exécutées. Si vous souhaitez vous limiter aux sous-routines open
exécutées par le processus cp, relancez la commande comme suit :
$ trcrpt –d 15b –p cp –O ”exec=on” trc_raw
Analyse des performances avec l’utilitaire de suivi
11-5
Lancement et contrôle du suivi depuis la ligne de commande
L’utilitaire de suivi est configuré et la collecte des données est éventuellement lancée par la
commande trace, dont la syntaxe est décrite dans le manuel AIX Commands Reference.
Une fois le suivi configuré par la commande trace, des contrôles permettent d’activer et de
désactiver la collecte des données, et d’arrêter le suivi (l’arrêt déconfigure le suivi et libère
les tampons). Ces contrôles sont appelés par : des sous-commandes, des commandes, des
sous-routines ou des appels ioctl. La sous-routine et les interfaces ioctl sont décrites à
”Lancement et contrôle du suivi depuis un programme”, page 11-7.
Contrôle du suivi en mode sous-commande
Si la routine de suivi est configurée sans option –a, elle est exécutée en mode
sous-commande. Une invite ”>” remplace l’invite habituelle. Dans ce mode, sont reconnues
les sous-commandes :
trcon
Lance ou relance la collecte des données d’événements.
trcoff
Suspend la collecte des données d’événements.
q ou quit
Arrête la collecte des données d’événements et met fin à la routine de
suivi.
!commande
Exécute la commande shell spécifiée.
Contrôle du suivi par commandes
Si la routine de suivi est configurée pour une exécution asynchrone (trace –a), le suivi peut
être contrôlé par les commandes :
11-6
trcon
Lance ou relance la collecte des données d’événements.
trcoff
Suspend la collecte des données d’événements.
trcstop
Arrête la collecte des données d’événements et met fin à la routine de
suivi.
AIX 4.3 Guide d’optimisation
Lancement et contrôle du suivi depuis un programme
L’utilitaire de suivi AIX peut être lancé à partir d’un programme, via un appel de
sous-routine. Cette sous-routine, trcstart, se trouve dans la bibliothèque librts.a.
La syntaxe de la sous-routine trcstart est :
int trcstart(char *args)
args étant la liste des options que vous auriez associées à la commande trace. Par défaut,
le suivi système (canal 0) est lancé. Pour lancer un suivi générique, spécifiez l’option –g
dans la chaîne args. L’exécution terminée, la sous–routinetrcstart renvoie l’ID canal. Pour
les suivis génériques, cet ID canal permet d’enregistrer dans le canal générique privé.
Si vous compilez un programme via cette sous-routine, le lien à la bibliothèque librts.a doit
être explicitement demandé (spécifiez –l rts comme option de compilation).
Contrôle du suivi via les sous-routines de suivi
Le contrôle de la routine de suivi s’effectue via des sous-routines de la bibliothèque librts.a.
Ces sous-routines renvoient zéro lorsque la commande aboutit. Il s’agit des sous-routines :
int trcon()
Lance ou relance la collecte des données de suivi.
int trcoff()
Suspend la collecte des données de suivi.
int trcstop()
Arrête la collecte des données de suivi et met fin à la routine de suivi.
Contrôle du suivi via des appels ioctl
Chacune des sous-routines de contrôle de suivi ci-dessus :
• ouvre (open) l’unité de contrôle de suivi (/dev/systrctl),
• émet l’ioctl approprié,
• ferme (close) l’unité de contrôle,
• revient au programme appelant.
Pour activer/désactiver le suivi de portions individuelles de code, il peut être plus efficace
pour le programme d’émettre directement les contrôles ioctl. Ce qui évite la succession
d’ouvertures et de fermetures de l’unité de contrôle du suivi. Pour utiliser l’interface ioctl
dans un programme, ajoutez <sys/trcctl.h> pour définir les commandes ioctl. La syntaxe
de ioctl est la suivante :
ioctl (fd,CMD,Canal)
où :
fd
est le descripteur de fichier obtenu par l’ ouverture de /dev/systrctl
CMD
est : TRCON, TRCOFF ou TRCSTOP
canal
est le canal de suivi (0 pour le suivi système).
Analyse des performances avec l’utilitaire de suivi
11-7
L’exemple suivant illustre comment lancer le suivi à partir d’un programme, le suivi ne
portant que sur une portion spécifiée du code :
#include <fcntl.h>
#include <sys/trcctl.h>
extern int trcstart(char *arg);
char *ctl_dev =”/dev/systrctl”;
int ctl_fd;
main()
{
printf(”configuring trace collection \n”);
if (trcstart(”–ad”)){
perror(”trcstart”);
exit(1);
}
printf(”opening the trace device \n”);
if((ctl_fd =open (ctl_dev,O_RDWR))<0){
perror(”open ctl_dev”);
exit(1);
}
printf(”turning data collection on \n”);
if(ioctl(ctl_fd,TRCON,0)){
perror(”TRCON”);
exit(1);
}
/* *** code here will be traced *** */
printf(”The code to print this line will be traced.”);
printf(”turning data collection off\n”);
if (ioctl(ctl_fd,TRCOFF,0)){
perror(”TRCOFF”);
exit(1);
}
printf(”stopping the trace daemon \n”);
if (trcstop(0)){
perror(”trcstop”);
exit(1);
}
exit(0);
}
Aucun fichier de sortie n’étant spécifié dans le paramètre pour la sous-routine trcstart(), la
sortie du suivi se trouvera dans /var/adm/ras/trcfile, qui est également le fichier d’entrée
par défaut de la commande trcrpt.
11-8
AIX 4.3 Guide d’optimisation
Ajout d’événements de suivi
Le système d’exploitation est livré avec des événements clés. Il suffit à l’utilisateur d’activer
le suivi pour capturer le flux d’événements système. Les développeurs peuvent
instrumenter leur code application au cours du développement, à des fins d’optimisation.
Ils disposent ainsi d’une vision claire des interactions entre leurs applications et le système.
Pour ajouter un événement de suivi, il vous faut définir les articles de suivi générés par
votre programme, en fonction des conventions de l’interface de suivi. Insérez ensuite des
macros d’ancrage de suivi aux endroits souhaités dans votre programme. Le suivi peut être
lancé par n’importe lequel des moyens d’appel et de contrôle standard (commandes,
sous-commandes ou appels de sous-routines). Pour formater le suivi via le programme
trcrpt, insérez, dans le fichier de format de suivi, des strophes pour décrire chaque nouvel
article de suivi et préciser son formatage.
Formes d’un article événement de suivi
Un événement de suivi peut prendre diverses formes. Un événement est constitué d’un mot
d’ancrage, de mots de données (facultatifs) et d’une horodate (facultatif), comme illustré à
la figure ”Format d’un article de suivi”. Un type 4 bits est défini pour chaque forme que peut
prendre un article. Le champ type est imposé par la routine d’enregistrement pour que
l’utilitaire de compte rendu puisse toujours passer d’un événement à l’autre pendant le
traitement des données, même si les règles de formatage du fichier de format de suivi sont
incorrectes ou absentes pour cet événement.
ID ancre
12 bits
Type
4 bits
mot de données 1
Champ de données
16 bits
mot de données 2
mot de données 3
mot de données 4
mot de données 5
Horodate 32 bits
mot
d’ancrage
(obligatoire)
D1
(en option)
D2
(en option)
D3
(en option)
D4
(en option)
D5
(en option)
T
(en option)
Format d’un article de suivi
Un article de suivi doit être le plus court possible. Nombre d’événements système se
contentent du mot d’ancrage et de l’horodate. Un autre événement cité doit être utilisé avec
parcimonie car moins efficace et plus gênant : il s’agit d’un format long permettant
d’enregistrer des données de longueur variable. Dans cette forme, le champ de données
16 bits du mot d’ancrage est converti en un champ longueur qui décrit la longueur de
l’enregistrement de l’événement.
Canaux de suivi
L’utilitaire de suivi peut prendre en charge simultanément jusqu’à huit canaux d’activité
d’ancrage de suivi, numérotés de 0 à 7. Le canal 0, toujours utilisé pour les événements
système, ne leur est néanmoins pas réservé : des applications peuvent y faire appel. Les
sept autres canaux, appelés canaux génériques, sont destinés au suivi des activités des
applications.
Analyse des performances avec l’utilitaire de suivi
11-9
Au lancement du suivi, le canal 0 est utilisé par défaut. Une commande trace –n (n étant le
numéro de canal) lance le suivi vers un canal générique. L’usage des canaux génériques
souffre quelques restrictions :
• L’interface vers les canaux génériques consomme plus de temps CPU que l’interface
vers le canal 0 : d’une part, il faut distinguer entre les canaux et, d’autre part, les canaux
génériques enregistrent des articles de longueur variable.
• Les événements enregistrés sur le canal 0 et sur les canaux génériques ne peuvent être
corrélés que par le biais de l’horodate, et non séquentiellement : il peut donc y avoir des
cas où il est impossible de déterminer l’antériorité d’un événement.
Macros d’enregistrement des événements de suivi
Il existe une macro pour chaque type possible d’enregistrement d’événement. Les macros
sont définies dans /usr/include/sys/trcmacros.h et les ID événements, dans
/usr/include/sys/trchkid.h. Ces deux fichiers doivent être inclus dans tout programme
enregistrant des événements de suivi.
Les macros enregistrant les événements sur le canal 0 avec horodate sont les suivantes :
TRCHKL0T(hw)
TRCHKL1T(hw,D1)
TRCHKL2T(hw,D1,D2)
TRCHKL3T(hw,D1,D2,D3)
TRCHKL4T(hw,D1,D2,D3,D4)
TRCHKL5T(hw,D1,D2,D3,D4,D5)
Pour enregistrer les événements sur le canal 0 sans horodate, vous disposez de :
TRCHKL0(hw)
TRCHKL1(hw,D1)
TRCHKL2(hw,D1,D2)
TRCHKL3(hw,D1,D2,D3)
TRCHKL4(hw,D1,D2,D3,D4)
TRCHKL5(hw,D1,D2,D3,D4,D5)
Le champ type de l’enregistrement de l’événement de suivi est défini à la valeur
correspondant à la macro utilisée, quelle que soit la valeur de ces 4 bits dans le
paramètre hw.
Il n’existe que deux macros pour enregistrer les événements sur un des canaux génériques
(1 à 7). Il s’agit de :
TRCGEN(ch,hw,D1,len,buf)
TRCGENT(ch,hw,D1,len,buf)
Ces macros enregistrent, dans le flux d’événements spécifié par le paramètre canal (ch), un
mot d’ancrage (hw), un mot de données (D1) et len octets à partir du segment de données
utilisateur commençant à l’emplacement spécifié par buf.
ID d’événements
L’ID événement d’un article de suivi identifie cet article comme appartenant à une classe
définie. L’ID événement est la base sur laquelle le mécanisme de suivi enregistre ou ignore
les ancrages de suivi, et sur laquelle la commande trcrpt inclut ou exclut les articles de
suivi dans le compte rendu formaté.
Les ID événement sont sur 12 bits (trois chiffres hexadécimaux). Il en existe 4096 possibles.
Les ID qui sont maintenus en permanence et livrés avec le code sont affectés de façon
11-10
AIX 4.3 Guide d’optimisation
permanente par BULL, pour éviter toute duplication. Pour permettre aux utilisateurs de
définir des événements dans leurs environnements ou au cours de développements,
l’intervalle d’ID compris entre 010 à 0FF (hexa) leur a été réservé : les utilisateurs en
disposent à leur guise dans leur propre environnement (c’est-à-dire, dans tout ensemble de
systèmes dans lequel ils sont prêts à assurer qu’un même ID événement n’est pas utilisé de
façon ambiguë).
Attention : Il est important que les utilisateurs qui se servent de cet intervalle
d’événements maintiennent le code dans leur environnement. Si vous livrez du code,
instrumenté avec des ID d’ancrage temporaires, dans un environnement dans lequel
vous ne contrôlez pas l’utilisation des ID, vous risquez des collisions avec d’autres
programmes qui utilisent les mêmes ID dans cet environnement.
Les ID événement doivent être conservés car peu nombreux, mais ils peuvent être étendus
par le biais du champ de données 16 bits. Il existe donc 65536 événements distincts
possibles pour chaque ID d’ancrage théorique. La seule raison d’avoir un ID unique est
qu’un ID est le niveau auquel la collecte et le rapport de filtrage sont disponibles dans
l’utilitaire de suivi.
Un événement ajouté par l’utilisateur peut être formaté via la commande trcrpt s’il existe
une strophe pour l’événement dans le fichier de format de suivi spécifié. Ce fichier est un
fichier ASCII modifiable : reportez-vous à ”Syntaxe des strophes du fichier de format de
suivi”, page 11-13.
Exemples de codage et de formatage d’événements
L’exemple suivant illustre l’utilisation d’événements de suivi pour chronométrer la durée
d’exécution d’une boucle :
#include <sys/trcctl.h>
#include <sys/trcmacros.h>
#include <sys/trchkid.h>
char *ctl_file = ”/dev/systrctl”;
int ctlfd;
int i;
main()
{
printf(”configuring trace collection \n”);
if (trcstart(”–ad”)){
perror(”trcstart”);
exit(1);
}
printf(”opening the trace device \n”);
if((ctlfd = open(ctl_file,0))<0){
perror(ctl_file);
exit(1);
}
printf(”turning trace on \n”);
if(ioctl(ctlfd,TRCON,0)){
perror(”TRCON”);
exit(1);
}
Analyse des performances avec l’utilitaire de suivi
11-11
for(i=1;i<11;i++){
TRCHKL1T(HKWD_USER1,i);
/* The code being measured goes here. The interval */
/* between occurrences of HKWD_USER1 in the trace */
/* file is the total time for one iteration.
*/
}
printf(”turning trace off\n”);
if(ioctl(ctlfd,TRCSTOP,0)){
perror(”TRCOFF”);
exit(1);
}
printf(”stopping the trace daemon \n”);
if (trcstop(0)){
perror(”trcstop”);
exit(1);
}
exit(0);
}
Lorsque vous compilez ce programme, vous devez établir un lien à la bibliothèque librts.a
comme suit :
$ xlc –O3 sample.c –o sample –l rts
HKWD_USER1 a pour ID 010 (hexadécimal). Vous pouvez le vérifier en consultant
/usr/include/sys/trchkid.h.). L’utilitaire de compte rendu ignore comment formater
l’événement HKWD_USER1, sauf si des règles sont indiquées dans le fichier de format de
suivi. L’exemple de strophe suivante peut être utilisée :
# User event HKWD_USER1 Formatting Rules Stanza
# An example that will format the event usage of the sample program
010 1.0 L=APPL ”USER EVENT – HKWD_USER1” O2.0
\n \
”The # of loop iterations =” U4
\n \
”The elapsed time of the last loop = ” \
endtimer(0x010,0x010) starttimer(0x010,0x010)
N’insérez pas cette strophe dans le fichier /etc/trcfmt original, mais faites une copie de
celui-ci dans votre répertoire (mytrcfmt, par exemple). Lorsque vous exécutez le
programme exemple, les données d’événement brutes sont capturées dans le fichier journal
par défaut, puisqu’aucun autre fichier n’a été spécifié à la sous-routine trcstart. Vous
souhaitez probablement filtrer la sortie pour ne conserver que vos événements. Pour ce
faire, lancez la commande trcrpt, comme suit :
trcrpt –d 010 –t mytrcfmt –O ”exec=on” > sample.rpt
Vous pouvez parcourir sample.rpt pour voir le résultat.
11-12
AIX 4.3 Guide d’optimisation
Syntaxe des strophes du fichier de format de suivi
L’objet du fichier de format de suivi est de fournir des règles de présentation et d’affichage
des données attendues pour chaque ID d’événement. Ce qui permet de formater les
nouveaux événements sans modifier l’utilitaire de compte rendu. Des règles sont
simplement ajoutées au fichier de format pour ces événements. La syntaxe des règles offre
une grande souplesse de présentation des données.
La figure ”Syntaxe d’une strophe d’un fichier de format de suivi”, page 11-13, illustre la
syntaxe pour un événement donné. Une strophe de format peut être aussi longue que
nécessaire pour décrire les règles applicables à un événement donné. Si elle se prolonge
sur plusieurs lignes, terminez les lignes intermédiaires par le caractère ”\”. Les champs sont
les suivants :
ID-évén
L=
V.R
APPL
SVC
KERN
INT
label-évén
n
t
starttimer(#,#)
endtimer(#,#)
descrip-données
où descripteur-données a la syntaxe :
Format
label-données
label-corresp
, val-corresp
descripteur-données
descripteur-données
Syntaxe d’une strophe d’un fichier de format de suivi
ID-évén
Chaque strophe commence par l’ID (3 chiffres hexadécimaux) de
l’événement qu’elle décrit, suivi d’un espace.
V.R
Décrit la version (V) et la release (R) dans lesquels l’événement a été
affecté en premier. Vous pouvez indiquer n’importe quels entiers pour V
et R (un utilisateur peut vouloir conserver son propre mécanisme de
suivi).
L=
Spécifie le niveau d’indentation du texte. La description textuelle d’un
événement peut commencer à divers niveaux d’indentation. Ceci pour
améliorer la lisibilité du compte rendu. Ces niveaux correspondent au
niveau d’exécution du système. Les niveaux reconnus sont : niveau
application (APPL), appel système de transition (SVC), niveau noyau
(KERN) et interruption (INT).
label-évén
Chaîne de texte ASCII décrivant l’utilisation globale de l’ID événement
– utilisée par l’option –j de la commande trcrpt pour fournir une liste
d’événements avec leur premier niveau de description. Le label-évén
apparaît également dans la sortie formatée de l’événement, sauf si le
label-évén commence par le caractère @.
Analyse des performances avec l’utilitaire de suivi
11-13
\n
La strophe événement décrit comment analyser, libeller et présenter les
données d’un enregistrement d’événement. La fonction \n (nouvelle
ligne) peut être imbriquée dans la strophe événement pour forcer la
présentation des données sur une nouvelle ligne. Les données peuvent
ainsi être présentées sur plusieurs lignes.
\t
Insère une tabulation à l’endroit où il se trouve dans l’analyse de la
description. Cette fonction est semblable à la fonction \n. Des espaces
peuvent également être insérés via les champslabel_données ou
label_corresp.
starttimer(timerID), endtimer(timerID)
timerID est un identificateur unique qui associe un starttimer particulier
avec un endtimer ultérieur ayant le même identificateur. Par convention
(non obligatoire), timerID est de la forme :
ID de l’événement de départ, ID de l’événement final
Lorsque l’utilitaire de compte rendu rencontre une directive starttimer
au cours de l’analyse d’un événement, il associe l’heure de l’événement
de départ au timerID spécifié. Lorsqu’il rencontre un endtimer avec le
même timerID, il affiche l’écart de temps (entre parenthèses) entre les
deux événements. Les événements début et fin d’appel système font
appel à cette fonction : au retour d’un événement appel système, la
durée de cet appel est indiquée.
11-14
AIX 4.3 Guide d’optimisation
descripdonnées
Décrit comment l’utilitaire de compte rendu doit consommer, libeller et
présenter les données. La syntaxe du champ descripteur-données est
développée dans la seconde partie de la figure ”Syntaxe d’une strophe
d’un fichier de format de suivi”. Les différents champs du descripteurdonnées sont décrits ci-après :
format
L’utilisateur peut se représenter l’utilitaire de compte
rendu comme doté d’un pointeur sur la partie données
d’un événement. Ce pointeur est initialisé pour pointer
sur le début des données d’événement (le champ de
données 16 bits dans le mot d’ancrage). Le champ
format décrit la quantité de données consommées par
l’utilitaire à partir de ce point et comment considérer
ces données. Par exemple, un champ format de Bm.n
indique à l’utilitaire de consommer m octets et n bits de
données et de les considérer comme binaires. (Les
champs de format possibles sont décrits plus avant.)
Si le champ de format n’est pas suivi d’une virgule,
l’utilitaire génère les données consommées dans le
format spécifié. S’il l’est, cela signifie que les données
ne doivent pas être affichées, mais comparées aux
valeurs-corresp qui suivent. Le descripteur de données
associé avec la valeur-corresp correspondante étant
ensuite appliqué au reste des données.
label-données Le label-données est une chaîne ASCII précédant
éventuellement la sortie des données consommées par
le champ de format.
valeur-corresp La valeur-corresp correspond à des données dont le
format est identique à celui décrit par les champs de
format précédents. Généralement, plusieurs
valeurs-corresp suivent un champ de format en cours
de recherche de correspondance. Les champs
successifs de correspondance sont séparés par des
virgules. La dernière valeur n’est pas suivie d’une
virgule. Un \* remplace n’importe quelle chaîne de
caractères. Un caractère générique est souvent utilisé
comme dernier champ valeur-corresp pour spécifier les
règles par défaut, si aucune correspondance n’a été
trouvée avec les champs valeur-corresp précédents.
label-corresp
Le label-corresp est une chaîne ASCII, générée pour la
correspondance concernée.
Analyse des performances avec l’utilitaire de suivi
11-15
Tous les champs de format possibles sont décrits dans les commentaires du fichier
/etc/trcfmt. En voici une brève présentation.
Descriptions de champs de format
Am.n
Spécifie que m octets de données doivent être consommées comme
texte ASCII et que le texte doit être affiché dans un champ de sortie de
n caractères. Le pointeur de données est déplacé de m octets.
S1, S2, S4
Spécifie une chaîne alignée à gauche. La longueur du champ est
définie comme égale à 1 octet (S1), 2 octets (S2) ou 4 octets (S4). Le
pointeur de données est déplacé en conséquence.
Bm.n
Spécifie des données binaire de m octets et n bits. Le pointeur de
données est déplacé en conséquence.
Xm
Spécifie des données hexadécimales de m octets. Le pointeur de
données est déplacé en conséquence.
D2, D4
Spécifie un format décimal signé. Des données de longueur 2 octets
(D2) ou 4 octets (D4) sont consommées.
U2, U4
Spécifie un format décimal non signé. Des données de longueur 2 ou
4 octets sont consommées.
F4, F8
Virgule flottante de 4 ou 8 octets.
Gm.n
Positionne le pointeur de données m octets et n bits à l’intérieur des
données.
Om.n
Omet, à partir de la position courante du pointeur de données,
les m octets et les n bits suivants.
Rm
Recule le pointeur de données de m octets.
Quelques macros peuvent servir de champs de format, pour un accès rapide aux données.
Par exemple :
$HD, $D1, $D2, $D3, $D4, $D5
Accède au champ de données 16 bits du mot d’ancrage et des mots de
données 1 à 5 de l’enregistrement de l’événement, respectivement.
Le pointeur de données n’est pas déplacé. Les données auxquelles
accède une macro sont hexadécimales par défaut. Une macro peut être
associée à un autre type de données (X, D, U, B) par le biais du
caractère ”%” suivi du nouveau code de format. Par exemple :
$D1%B2.3
Cette macro entraîne l’accès au mot de données 1, mais en le
considérant comme 2 octets et 3 bits de données binaires.
Les commentaires intégrés au fichier /etc/trcfmt décrivent les autres possibilités de macros
et de formats, et expliquent comment créer des macros personnalisées.
11-16
AIX 4.3 Guide d’optimisation
Chapitre 12. Outil de diagnostic PDT
PDT évalue l’état d’un système et surveille les modifications intervenant sur la charge de
travail et les performances. Il tente d’identifier les problèmes à leur naissance, proposant
des solutions avant qu’ils ne deviennent critiques. PDT est disponible à partir d’AIX
version 4.1.
Pour l’essentiel, PDT ne requiert aucune entrée utilisateur. La collecte et le report des
données PDT sont facilement activés et aucune intervention ultérieure de l’administrateur
n’est requise. Les données sont régulièrement collectées et enregistrées en vue d’une
analyse historique, et un rapport est généré et adressé à l’ID utilisateur adm. Normalement,
seuls les problèmes apparents les plus significatifs sont consignés sur le rapport. L’absence
de problème significatif est également signalée, le cas échéant. Vous pouvez personnaliser
PDT pour que les rapports soient acheminés vers un autre utilisateur ou que les problèmes
de gravité moindre soient également consignés.
Cette rubrique traite des points suivants :
• ”Structure de PDT”
• ”Portée de l’analyse PDT”
• ”Exemple de compte rendu PDT”
• ”Installation et activation de PDT”
• ”Personnalisation de PDT”
• ”Réponse aux messages PDT”
Structure de PDT
Comme illustré à la figure ”Structure des composants de PDT”, l’application PDT est
constituée de trois composants :
cron
contrôle
collecte
contrôle
rapport
contrôle
retenue
PDT
historique
collecteurs
fichier,
mail
rapporteur
données
courantes
données
courantes
et
historiques
rapport
périodique
élimination des
données obsolètes
Structure des composants de PDT
Outil de diagnostic PDT
12-1
• L’élément de collecte, composé d’un ensemble de programmes qui collectent et
enregistrent régulièrement les données.
• L’élément de validation qui passe régulièrement en revue les données collectées et
élimine les données obsolètes.
• L’élément de consignation qui produit régulièrement un diagnostic à partir de l’ensemble
courant des données historiques.
PDT prend en compte différents aspects de la configuration d’un système, sa disponibilté et
ses performances, lors de de son estimation. Les zones de déséquilibre potentiel sont
notamment mises en évidence (configuration des E/S, de la pagination, etc.), ainsi que
d’autres problèmes de configuration (disques non affectés à des groupes de volume, par
exemple). Il est procédé à une large évaluation, portant aussi bien sur la taille des fichiers et
systèmes de fichiers, que sur l’utilisation de la zone de pagination, les délais imposés par le
réseau ou ceux relatifs à la charge de travail, etc.
Portée de l’analyse PDT
PDT collecte quotidiennement les données relatives à la configuration, la disponibilité, la
charge de travail et les performances. Ces données sont maintenues dans un
enregistrement historique. Environ un mois de données sont ainsi conservées. PDT génère
également quotidiennement un rapport de diagnostic. Le rapport est envoyé à l’utilisateur
adm.
Une copie de ce rapport est en outre stockée dans /var/perf/tmp/PDT_REPORT. Au
préalable, l’ancien rapport est renommé /var/perf/tmp/PDT_REPORT.last.
Bien que nombre de problèmes de performances soient de nature spécifique (mémoire
insuffisante sur un système, par exemple), PDT tente d’appliquer quelques principes
généraux dans sa recherche. En voici quelques-uns.
Exploitation équilibrée des ressources
D’une facon générale, s’il existe plusieurs ressources de même type, équilibrer leur
exploitation génère une amélioration des performances.
• Nombre comparable de volumes physiques (disques) sur chaque carte de disque
• Espace de pagination réparti sur plusieurs volumes physiques
• Charge grosso modo équivalente sur les différents volumes physiques.
Circonscription des opérations
L’exploitation des ressources a ses limites. Toute tendance à les outrepasser doit être
détectée et signalée.
• Une unité de disque ne peut être utilisée plus de 100 % du temps.
• Fichiers et systèmes de fichiers ne peuvent excéder l’espace qui leur est affecté.
Identification de la tendance de la charge de travail
Les tendances peuvent indiquer un changement de la nature de la charge de travail ou une
augmentation de ressources utilisées :
• Nombre d’utilisateurs connectés.
• Nombre total de processus.
• Pourcentage de CPU disponible.
Opérations sans erreur
Les erreurs (matérielles et logicielles) ont souvent une incidence sur les performances :
• Consultez les journaux d’erreurs matérielles et logicielles.
• Signalez les pages VMM incorrectes.
12-2
AIX 4.3 Guide d’optimisation
Examen des modifications
De nouvelles charges de travail ou de nouveaux processus commençant à consommer des
ressources sont parfois des signes avant-coureurs de problèmes.
• Apparence des processus consommant d’importantes ressources CPU ou mémoire.
Adéquation des paramètres système
Les paramètres système sont nombreux. Sont-ils tous définis de façon appropriée ?
• maxuproc a-t-il une valeur suffisante ?
• Qu’en est-il des paramètres de contrôle de la charge mémoire ?
Le rapport PDT est constitué de plusieurs sections (voir ci-après). Après l’en-tête, la section
Alerts indique les violations identifiées des principes notés ci-dessus. En l’absence
d’alertes, cette section ne figure pas dans le rapport. Les deux sections suivantes
concernent les tendances en amont et en aval : elles sont axées sur l’anticipation des
problèmes et non sur l’identification de problèmes existants. Les mêmes principes sont
généralement appliqués – mais dans l’optique de prévoir les violations futures. Si aucune
tendance de ce type (en amont ou en aval) n’est détectée, ces sections ne figurent pas
dans le rapport.
Outil de diagnostic PDT
12-3
Exemple de compte rendu PDT
___________________________________________________________________
Performance Diagnostic Facility 1.0
Report printed: Tue Aug 3 10:00:01 1993
Host name: test.austin.ibm.com
Range of analysis is from: Hour 16 on Monday, July 5th, 1993
to: Hour 9 on Tuesday, August 3rd, 1993.
[To disable/modify/enable collection or reporting, execute the
pdt_config script]
––––––––––––––––––––– Alerts –––––––––––––––––––––
I/O BALANCE
– Phys. vol. hdisk0 is significantly busier than others
volume cd0, mean util. = 0.00
volume hdisk0, mean util. = 11.75
volume hdisk1, mean util. = 0.00
PAGE SPACE AND MEMORY
– Mean page space used = 46.85 MB
System has 32MB memory; may be inadequate.
Consider further investigations to determine if memory is a
bottleneck
––––––––––––––––––– Upward Trends ––––––––––––––––
FILE SYSTEMS
– File system hd2 (/usr) PERCENTAGE FULL
now, 45.00 % full, and growing an avg. of 2.0 %/day
At this rate, hd2 will be full in about 15 days
PAGE SPACE
– Page space hd6 USE
now, 44.80 MB and growing an avg. of 1.81 MB/day
At this rate, hd6 will be full in about 30 days
WORKLOAD TRACKING
– Workload nusers indicator is increasing;
now 23, and growing an avg. of 1.2 per day
––––––––––––––––––––––– System Health –––––––––––––––
SYSTEM HEALTH
– Current process state breakdown:
2.00 [ 3.0 %] : waiting for the cpu
64.00 [ 97.0 %] : sleeping
66.00 = TOTAL
[based on 1 measurement consisting of 10 2–second samples]
–––––––––––––––––– Summary ––––––––––––––––––––––––
This is a severity level 2 report
Further details are available at severity levels > 2
___________________________________________________________________
Dans cet exemple, la section d’en-tête indique le numéro de version de PDT, la date du
rapport, l’hôte à partir duquel ont été collectées les données et les dates de début et de fin
des données analysées.
La section suivante, Alerts, indique les conditions de configuration et de charge suspectes.
Dans l’exemple, il apparaît qu’un des trois disques système récupère l’essentiel des
activités d’E/S. Il est clair que la charge des E/S n’est pas répartie de façon à tirer le
meilleur parti des ressources disponibles. Le message suivant,
PAGE SPACE AND MEMORY, suggère que le système est peut-être sous-configuré
au niveau mémoire.
12-4
AIX 4.3 Guide d’optimisation
La section Upward Trends identifie deux tendances possibles. La première est que le
système de fichiers sur le volume logique hd2 (système de fichiers /usr) croît au rythme
moyen de 2 % par jour. La date de saturation probable est indiquée, calculée sur la base
d’une croissance linéaire continue.
La seconde tendance est l’apparente croissance systématique du niveau d’utilisation de
l’une des zones de pagination. Des informations sur son taux de croissance et sur la date
présumée de saturation sont données. Savoir quels sont les systèmes de fichiers et les
espaces de pagination qui frôlent la saturation est de la plus haute importance (surtout si le
taux de croissance est élevé ou que la date de saturation prévue est imminente), car leur
saturation peut provoquer un blocage du système ou de l’application.
La troisième tendance est une modification d’un des indicateurs de charge de travail. Les
indicateurs surveillés par PDT sont les suivants :
Mot-clé
Indicateur
nusers
Nombre total d’utilisateurs connectés.
loadavg
Moyenne de charge sur 15 minutes.
nprocesses
Nombre total de processus.
STAT_A
Nombre de processus actifs.
STAT_W
Nombre de processus permutés.
STAT_Z
Nombre de processus zombis.
STAT_I
Nombre de processus libres.
STAT_T
Nombre de processus arrêtés après réception d’un signal.
STAT_x
Nombre de processus signalés à l’état x par la commande ps, x étant
un état non répertorié ci-dessus.
cp
Durée requise pour copier un fichier de 40 ko.
idle_pct_cpu0
Pourcentage de CPU disponible.
idle_pct_avg
Pourcentage de CPU disponible.
La section suivante, System Health, se sert d’un certain nombre d’indicateurs de charge
pour déterminer l’usage que font les processus de leur temps.
La dernière section du compte rendu (Summary) indique le niveau de gravité sélectionné, et
si changer de niveau donne accès à des informations supplémentaires. (Le niveau de
gravité le plus élevé est 1, niveau par défaut du compte rendu. Le niveau le plus bas est 3.)
Tout message (à l’exclusion des informations de l’en-tête et du récapitulatif) apparaissant
dans le compte rendu PDT doit être examiné. Vous devez remédier au problème signalé ou
du moins trouver une explication à l’erreur. Les réponses possibles aux messages
spécifiques sont indiquées à ”Réponse aux messages PDT”, page 12-10.
Installation et activation de PDT
PDT est installé via installp comme option bos.perf.diag_tool du BOS sous licence d’AIX
version 4.1.
Pour démarrer la collecte et la consignation des données, PDT doit être activé : exécutez à
cet effet le script /usr/sbin/perf/diag_tool/pdt_config. Seul l’utilisateur root est habilité à
exécuter ce script. L’exécution terminée, le message suivant s’affiche :
Outil de diagnostic PDT
12-5
# /usr/sbin/perf/diag_tool/pdt_config
________________PDT customization menu__________________
1) show current PDT report recipient and severity level
2) modify/enable PDT reporting
3) disable
PDT reporting
4) modify/enable PDT collection
5) disable
PDT collection
6) de–install
PDT
7) exit pdt_config
Please enter a number:
Si vous répondez 4, la collecte et la consignation par défaut sont activées. L’entrée crontab
de l’utilisateur adm est mise à jour pour intégrer les entrées PDT. La collecte est effective
lorsque les travaux cron sont exécutés par cron. Sélectionnez 7 pour mettre fin au
programme pdt_config.
Pour désactiver la collecte, sélectionnez l’option 5.
Personnalisation de PDT
Certains aspects de PDT peuvent être personnalisés. N’importe quel utilisateur peut, par
exemple, être désigné comme destinataire régulier des rapports PDT, et la durée de
conservation des données dans l’enregistrement historique PDT peut être modifiée.
Toute personnalisation suppose de modifier un des fichiers PDT dans
/var/perf/cfg/diag_tool/ ou d’exécuter le script /usr/sbin/perf/diag_tool/pdt_config.
Nous vous conseillons de ne rien modifier avant d’avoir obtenu et étudié quelques rapports
PDT et d’avoir acquis une certaine aisance dans la manipulation de cet outil.
Désignation d’un autre destinataire du rapport et modification du niveau de gravité
Par défaut, les rapports sont générés avec un niveau de gravité de 1, ce qui signifie que
seuls les problèmes les plus sérieux sont identifiés. Il existe deux autres niveaux (2, 3)
offrant généralement plus de détails. Par ailleurs, tout rapport PDT est expédié vers l’ID
utilisateur adm ; peut-être souhaitez-vous l’adresser à un autre utilisateur ou ne pas
l’envoyer du tout.
Ces deux paramètres sont contrôlés par le script pdt_config. Le dialogue suivant désigne
un nouvel utilisateur destinataire et modifie le niveau de gravité :
# /usr/sbin/perf/diag_tool/pdt_config
________________PDT customization menu__________________
1) show current PDT report recipient and severity level
2) modify/enable PDT reporting
3) disable
PDT reporting
4) modify/enable PDT collection
5) disable
PDT collection
6) de–install
PDT
7) exit pdt_config
Please enter a number: 1
current PDT report recipient and severity level
adm 1
________________PDT customization menu__________________
1) show current PDT report recipient and severity level
2) modify/enable PDT reporting
3) disable
PDT reporting
4) modify/enable PDT collection
5) disable
PDT collection
6) de–install
PDT
7) exit pdt_config
Please enter a number: 2
12-6
AIX 4.3 Guide d’optimisation
enter id@host for recipient of report : rsmith
enter severity level for report (1–3): 2
report recipient and severity level
rsmith 2
________________PDT customization menu__________________
1) show current PDT report recipient and severity level
2) modify/enable PDT reporting
3) disable
PDT reporting
4) modify/enable PDT collection
5) disable
PDT collection
6) de–install
PDT
7) exit pdt_config
Please enter a number: 1
current PDT report recipient and severity level
rsmith 2
________________PDT customization menu__________________
1) show current PDT report recipient and severity level
2) modify/enable PDT reporting
3) disable
PDT reporting
4) modify/enable PDT collection
5) disable
PDT collection
6) de–install
PDT
7) exit pdt_config
Please enter a number: 7
#
Dans cet exemple, l’utilisateur rsmith devient le destinataire et le niveau de gravité passe
à 2. Ce qui signifie que l’utilisateur rsmith recevra le rapport PDT et que les messages de
gravité 1 et 2 y seront inclus. Notez l’utilisation de l’option 1 pour déterminer le destinataire
actuel du rapport PDT ainsi que le niveau de gravité consigné.
Pour mettre fin à la consignation (sans interrompre la collecte), l’option 3 est sélectionnée,
par exemple :
#/usr/sbin/perf/diag_tool
________________PDT customization menu__________________
1) show current PDT report recipient and severity level
2) modify/enable PDT reporting
3) disable
PDT reporting
4) modify/enable PDT collection
5) disable
PDT collection
6) de–install
PDT
7) exit pdt_config
Please enter a number: 3
disable PDT reporting done
________________PDT customization menu__________________
1) show current PDT report recipient and severity level
2) modify/enable PDT reporting
3) disable
PDT reporting
4) modify/enable PDT collection
5) disable
PDT collection
6) de–install
PDT
7) exit pdt_config
Please enter a number: 1
reporting has been disabled (file .reporting.list not found).
Outil de diagnostic PDT
12-7
________________PDT customization menu__________________
1) show current PDT report recipient and severity level
2) modify/enable PDT reporting
3) disable
PDT reporting
4) modify/enable PDT collection
5) disable
PDT collection
6) de–install
PDT
7) exit pdt_config
Please enter a number: 7
#
Niveaux de gravité PDT
Les listes suivantes indiquent les problèmes susceptibles de se poser à chaque niveau de
gravité. N’oubliez pas que sélectionner une gravité n entraîne la consignation de tous les
problèmes de gravité inférieure ou égale à n.
Problèmes de gravité 1
• Système de fichiers JFS indisponible
• Système de fichiers JFS quasi-saturé
• Volume physique non affecté à un groupe de volumes
• Espaces de pagination tous définis sur un seul volume physique
• Mémoire système apparemment insuffisante pour la charge de travail actuelle
• Espace de pagination quasi-saturé
• Problème possible au niveau des paramètres de contrôle de charge
• Trames de mémoire défectueuses détectées par VMM
• Hôte de .nodes inaccessible
Problèmes de gravité 2
• Déséquilibre dans la configuration des E/S (disques par carte, par exemple)
• Déséquilibre dans l’affectation de l’espace de pagination sur les volumes physiques
concernés
• Fragmentation d’un espace de pagination dans un groupe de volumes
• Déséquilibre significatif de la charge des E/S sur les volumes physiques
• Nouveau processus identifié comme gros consommateur de mémoire ou de CPU
• Fichiers de .files présentant une croissance (ou un déclin) de taille systématique
• Système de fichiers ou espace de pagination présentant une croissance (ou un déclin)
systématique au niveau de l’utilisation de l’espace
• Dégradation du temps de réponse ping ou du pourcentage de paquets perdus sur un
hôte de .nodes
• Processus getty consommant trop de temps CPU
• Processus gros consommateur de CPU ou de mémoire présentant une croissance
(ou un déclin) systématique au niveau de l’utilisation des ressources
Messages de gravité 3
• Les messages de gravité 3 fournissent des compléments aux messages de gravité 1
et 2, sur les problèmes identifiés aux niveaux 1 et 2 – caractéristiques de la collecte des
données, tel le nombre d’échantillons, par exemple.
12-8
AIX 4.3 Guide d’optimisation
Obtention d’un rapport PDT à la demande
Outre le rapport périodique, un utilisateur quelconque peut demander un rapport à partir des
données existantes via la commande /usr/sbin/perf/diag_tool/pdt_report [niveau-gravité].
Le rapport est produit avec le niveau de gravité spécifié (1 par défaut) et écrit dans stdout.
Générer un rapport de cette manière n’a aucune incidence sur les fichiers
/var/perf/tmp/PDT_REPORT ou /var/perf/tmp/PDT_REPORT.last.
Consignation d’erreurs PDT
Des erreurs peuvent advenir dans n’importe lequel des composants PDT. En général, une
erreur ne met pas fin à PDT. Mais un message est envoyé vers le fichier d’erreur standard
de PDT : /var/perf/tmp/.stderr, et cette phase de traitement se termine.
Les utilisateurs devant faire face à des situations inattendues, telle que l’absence de
rapport, trouveront de précieuses indications dans le fichier /var/perf/tmp/.stderr.
Désinstallation de PDT
Il est impossible de désinstaller PDT directement via pdt_config, mais si l’option 6 est
requise, un message explicite les étapes nécessaires au retrait de PDT du système :
# /usr/sbin/perf/diag_tool/pdt_config
________________PDT customization menu__________________
1) show current PDT report recipient and severity level
2) modify/enable PDT reporting
3) disable
PDT reporting
4) modify/enable PDT collection
5) disable
PDT collection
6) de–install
PDT
7) exit pdt_config
Please enter a number: 6
PDT is installed as package bos.perf.diag_tool in the bos lpp.
Use the installp facility to remove the package
________________PDT customization menu__________________
1) show current PDT report recipient and severity level
2) modify/enable PDT reporting
3) disable
PDT reporting
4) modify/enable PDT collection
5) disable
PDT collection
6) de–install
PDT
7) exit pdt_config
Please enter a number: 7
#
Modification de la liste des fichiers contrôlés par PDT
PDT analyse fichiers et répertoires à la recherche d’accroissement systématique de taille. Il
n’examine que les fichiers et répertoires figurant dans le fichier
/var/perf/cfg/diag_tool/.files. Le fichier .files comporte un nom de fichier/répertoire par
ligne. Son contenu par défaut est :
/usr/adm/wtmp
/var/spool/qdaemon/
/var/adm/ras/
/tmp/
Vous pouvez modifier ce fichier via un éditeur pour surveiller des fichiers et répertoires
importants pour votre système.
Modification de la liste des hôtes contrôlés par PDT
PDT surveille le délai ping moyen des hôtes listés dans /var/perf/cfg/diag_tool/.nodes.
Ce fichier n’est pas livré avec PDT (ce qui signifie qu’aucune analyse d’hôte n’est effectuée
Outil de diagnostic PDT
12-9
par défaut), mais peut être créé par l’administrateur. Le fichier .nodes comporte un nom
d’hôte par ligne.
Modification de la durée de conservation de l’enregistrement historique
Régulièrement, un script shell de validation est exécuté, qui élimine de l’enregistrement
historique PDT les données périmées. Toutes les données sont soumises à la même
politique de conservation. Cette politique est décrite dans le fichier
/var/perf/cfg/diag_tool/.retention.list. Le contenu par défaut de .retention.list est :
* * * 35
qui fixe à 35 jours le délai de conservation de toutes les données. Vous pouvez remplacer
35 par n’importe quel entier non signé.
PDT se sert de l’enregistrement historique pour évaluer les tendances et identifier les
modifications du système. Augmenter le délai de conservation étend la portée de l’analyse,
mais en augmente le coût en termes d’espace disque et de temps de traitement PDT.
L’enregistrement historique PDT est conservé dans /var/perf/tmp/.SM. Le script de
validation crée une copie de ce fichier dans /var/perf/tmp/.SM.last avant d’effectuer
l’opération de validation. Les données historiques éliminées sont par ailleurs ajoutées à
/var/perf/tmp/.SM.discards.
L’existence de /var/perf/tmp/.SM.last fournit une sauvegarde limitée, mais l’administrateur
doit vérifier que le fichier /var/perf/tmp/.SM est régulièrement sauvegardé. Si le fichier est
perdu, PDT continue à fonctionner, mais sans informations d’historique. Au fil du temps,
l’historique se reconstruit avec les nouvelles données collectées.
Modification de l’heure des collectes, des validations et de la génération des
comptes rendus
La collecte, la consignation et la validation sont pilotées par trois entrées de la table cron
de l’utilisateur adm. La collecte a lieu à 9 h tous les jours ouvrés, la consignation à 10 h ces
mêmes jours, tandis que la validation est effectuée une fois par semaine, le samedi à 21 h.
Les entrées cron (créées par exécution du script /usr/sbin/perf/diag_tool/pdt_config et
sélection de l’option 2) sont indiquées ci-après :
0 9 * * 1–5
0 10 * * 1–5
0 21 * * 6
/usr/sbin/perf/diag_tool/Driver_ daily
/usr/sbin/perf/diag_tool/Driver_ daily2
/usr/sbin/perf/diag_tool/Driver_ offweekly
Il est possible de modifier ces heures en éditant la table cron de l’utilisateur adm, mais nous
vous le déconseilllons fortement.
Réponse aux messages PDT
PDT identifie plusieurs types de problèmes. Les réponses à y apporter dépendent des
ressources disponibles et des priorités de chaque structure. En voici quelques exemples.
12-10
Problème :
Système de fichiers JFS indisponible
Réponse :
Recherchez la cause de cette indisponibilité.
Comm. utiles :
lsfs (pour déterminer l’état du système de fichiers).
Problème :
Système de fichiers JFS quasi-saturé
Réponse :
Recherchez des fichiers volumineux dans le système de fichiers,
générés peut-être par l’emballement d’un processus. Ce système de
fichiers a-t-il présenté une tendance à croître sur une longue durée
(vérifiez ce point dans le reste du rapport PDT – ou dans les anciens
rapports) ?
Comm. utiles :
du, ls
AIX 4.3 Guide d’optimisation
Problème :
Volume physique non affecté à un groupe de volumes
Réponse :
Un volume doit être défini dans un groupe de volumes, faute de quoi, il
est inaccessible à AIX et, de ce fait, perdu.
Comm. utiles :
lspv (pour confirmer que le volume n’est pas affecté).
smit (pour manipuler les groupes de volume).
Problème :
Espaces de pagination tous définis sur un seul volume physique
Réponse :
Le système dispose de plusieurs volumes physiques, mais tous les
espaces de pagination sont définis sur un seul volume. Si le système
doit faire appel à la pagination, cette configuration entraîne une
diminution des performances.
Comm. utiles :
smit (pour modifier les espaces de pagination).
Problème :
Mémoire apparemment insuffisante pour la charge de travail
actuelle
Réponse :
Si le système fait souvent appel à la pagination, il convient sans doute
d’augmenter la mémoire pour améliorer les performances.
Comm. utiles :
lsps –a, vmstat
Problème :
Espace de pagination quasi-saturé
Réponse :
L’espace de pagination du système doit sans doute être agrandi, à
moins que le problème ne soit dû à un processus à perte de mémoire
– auquel cas ce processus doit être identifié et l’application corrigée.
Comm. utiles :
ps aucg (pour examiner l’activité des processus).
smit (pour modifier les caractéristiques de l’espace de pagination).
Problème :
Problème possible au niveau des paramètres de contrôle de
charge
Réponse :
Les paramètres de contrôle de charge sont évalués en fonction de
l’activité de pagination courante. Par exemple, si un emballement se
produit et que le contrôle de charge est désactivé, il convient sans
doute de l’activer.
Comm. utiles :
schedtune
Problème :
Trames de mémoire défectueuses détectées par VMM
Réponse :
Il est peut-être nécessaire d’analyser la mémoire. Comparez la quantité
de mémoire installée avec celle effectivement accessible ; si cette
dernière est moindre, de la mémoire défectueuse a été identifiée.
Vous pouvez utiliser /usr/sbin/perf/diag_tool/getvmparms et
consulter la valeur de numframes pour déterminer le nombre réel de
trames mémoire de 4 ko.
Comm. utiles :
lscfg | grep mem (pour connaître la taille (Mo) de la mémoire
installée).
Problème :
Hôte de .nodes inaccessible
Réponse :
Déterminez si le problème provient de l’hôte courant (le fichier
/etc/hosts a-t-il été modifié ?), de l’hôte distant (est-il en panne ?) ou
du réseau (le serveur de noms est-il en panne ?).
Comm. utiles :
ping
Outil de diagnostic PDT
12-11
Problème :
Déséquilibre dans la configuration E/S (nombre de disques par
carte)
Réponse :
Envisagez de déplacer les disques de façon à ne pas surcharger une
seule carte SCSI.
Comm. utiles :
lscfg (pour étudier la configuration actuelle).
iostat (pour déterminer si la charge actuelle des cartes est
déséquilibrée).
12-12
Problème :
Déséquilibre dans l’affectation de l’espace de pagination sur les
volumes physiques concernés
Réponse :
Envisagez d’unifier la taille des espaces de pagination, sauf pour
quelques méga-octets (disons 4) sur l’espace principal (hd6).
Un déséquilibre important entre les tailles de ces espaces peut
diminuer les performances.
Comm. utiles :
smit
Problème :
Fragmentation d’un espace de pagination dans un groupe de
volumes
Réponse :
Les performances au niveau de la pagination sont meilleures si les
zones de pagination sont contiguës sur un volume physique.
Si toutefois les zones sont agrandies, il est possible de créer des
fragments éclatés sur tout le disque.
Comm. utiles :
lspv –p hdiskn pour chaque volume physique du groupe de volumes.
Recherchez plusieurs PP Range dotés du même LVNAME et du même
TYPE de ”pagination”.
Problème :
Déséquilibre significatif de la charge des E/S sur les volumes
physiques
Réponse :
Si un volume physique semble peu actif au niveau des E/S, envisagez
de déplacer les données des volumes les plus occupés vers les
volumes les moins occupés. D’une façon générale, plus les E/S sont
uniformément réparties, meilleures sont les performances.
Comm. utiles :
iostat –d 2 20 (pour étudier la répartition actuelle des E/S sur les
volumes physiques).
Problème :
Nouveau processus identifié comme gros consommateur de
mémoire ou de CPU
Réponse :
Les plus gros consommateurs de CPU et de mémoire sont
régulièrement identifiés par PDT. Si un de ces processus n’a pas été
détecté auparavant, il est signalé dans un rapport d’incident. Il convient
d’examiner ces processus pour déceler d’éventuels
dysfonctionnements. PDT ne prend en compte que l’ID de processus.
Si un utilisateur gros consommateur connu s’arrête, puis est relancé
(avec un id processus différent), il sera identifié comme NOUVEL
utilisateur gourmand.
Comm. utiles :
ps aucg (pour examiner tous les processus et leur activité).
AIX 4.3 Guide d’optimisation
Problème :
Fichier de .files présentant une croissance (ou un déclin) de taille
systématique
Réponse :
Examinez la taille actuelle. Considérez le taux de croissance prévisible.
Quel utilisateur (ou application) génère les données ? Par exemple, le
fichier /var/adm/wtmp est susceptible de grandir inconsidérément.
S’il devient trop grand, les délais de connexion peuvent s’allonger.
Parfois, la solution est de supprimer le fichier. Mais l’essentiel dans tous
les cas est d’identifier l’utilisateur à l’origine de cette croissance et
d’étudier avec lui le moyen de résoudre le problème.
Comm. utiles :
ls –al (pour examiner la taille des fichiers/répertoires).
Problème :
Système de fichiers ou espace de pagination présentant une
croissance (ou un déclin) systématique au niveau de l’utilisation
de l’espace
Réponse :
Evaluez le taux de croissance et le délai de saturation prévus. Il peut
être nécessaire d’agrandir le système de fichiers (ou l’espace de
pagination). Mais cette opération peut induire des effets pervers
(processus à perte de mémoire, par exemple).
Comm. utiles :
smit (pour manipuler systèmes de fichiers/espaces de pagination)
ps aucg, svmon (pour étudier l’activité des processus en mémoire
virtuelle).
filemon (pour étudier l’activité du système de fichiers).
Problème :
Dégradation du temps de réponse ping ou du pourcentage de
paquets perdus sur un hôte de .nodes
Réponse :
L’hôte en question est-il confronté à des problèmes de performances ?
Le réseau est-il confronté à ce type de problème ?
Comm. utiles :
ping, rlogin, rsh (pour chronométrer les charges de travail connues sur
l’hôte distant)
Problème :
Un processus getty consomme trop de temps CPU
Réponse :
Les processus getty utilisant plus qu’un faible pourcentage de CPU
peuvent être en erreur. Dans certaines situations, ces processus
peuvent consommer du CPU système alors qu’aucun utilisateur n’est
effectivement connecté. La solution est en général de mettre fin au
processus.
Comm. utiles :
ps aucg (pour déterminer le pourcentage de CPU utilisé).
Problème :
Processus gros consommateur de CPU ou de mémoire présentant
une croissance (ou un déclin) systématique au niveau de
l’utilisation des ressources
Réponse :
Les gros consommateurs connus de CPU et de mémoire sont
constamment surveillés pour déceler si leur demande augmente. En
tant que gros consommateurs, une croissance linéaire de leur demande
doit retenir l’attention à plusieurs niveaux. Si cette croissance est
normale, elle figure parmi les éléments essentiels de planification de la
capacité. Si elle est excessive, il convient d’envisager de modifier la
charge (ou de résoudre un problème chronique, telle une insuffisance
de mémoire).
Comm. utiles :
ps aucg
Outil de diagnostic PDT
12-13
Problème :
maxuproc signalé probablement insuffisant pour un userid donné
Réponse :
Il est problable que cet utilisateur approche du seuil de maxuproc.
maxuproc est un paramètre système qui limite le nombre de processus
que les utilisateurs non racine sont autorisés à maintenir actifs
simultanément. Si la limite est trop basse, le travail de l’utilisateur peut
être différé ou arrêté. Mais un utilisateur peut également, par accident,
créer plus de processus que nécessaire. Un supplément d’investigation
s’impose dans les deux cas : l’utilisateur doit être consulté pour
déterminer précisément ce qui se passe.
Comm. utiles :
lsattr –E –l sys0 | grep maxuproc
Pour déterminer la valeur actuelle de maxuproc (bien qu’elle soit
également indiquée directement dans le message PDT).
chdev –l sys0 –a maxuproc=100
Pour passer à 100 la valeur de maxuproc (par exemple). Vous devez
être utilisateur racine.
Problème :
Un indicateur WORKLOAD TRACKING indique une tendance
ascendante
Réponse :
La réponse dépend de l’indicateur concerné :
loadavg – charge moyenne sur 15 minutes
Le niveau de conflits sur le système est en hausse. Examinez le reste
du rapport PDT à la recherche d’indicateurs de goulots d’étranglement
système (par exemple, une utilisation conséquente d’espace de
pagination peut révéler une insuffisance de mémoire, un déséquilibre
des E/S un incident au niveau du sous-système d’E/S, etc.).
nusers – nombre total d’utilisateurs connectés
Les utilisateurs sont en nombre croissant sur le système. Cette
information est capitale pour planifier la capacité. Cette croissance
est-elle prévue ? Peut-elle être expliquée ?
12-14
AIX 4.3 Guide d’optimisation
nprocesses – nombre total de processus
Les processus sur le système sont en nombre croissant. Les
utilisateurs butent-ils sur le seuil maxuproc ? Peut-être y a-t-il des
applications qui s’emballent, générant trop de processus en parallèle.
STAT_A – nombre de processus actifs
Une évolution indique que le délai d’attente de CPU par les processus
est de plus en plus long.
STAT_W – nombre de processus permutés
Une évolution indique que les conflits de processus pour l’accès à la
mémoire sont excessifs.
STAT_Z – nombre de processus zombis
L’existence des zombis doit être éphémère. Si leur nombre augmente
sur un système, vous devez étudier le problème.
STAT_I – nombre de processus libres
Cette indication n’est pas forcément signe de problème.
STAT_T – nombre de processus arrêtés après réception d’un signal
Une évolution peut indiquer une erreur de programmation.
STAT_x – (x étant un caractère valide quelconque de la sortie de la
commande ps, indiquant un état de processus non répertorié
ci-dessus)
L’interprétation d’une évolution dépend ici de la signification de x.
cp – délai requis pour la copie d’un fichier de 40 ko
Un accroissement de ce délai indique à l’évidence une dégradation du
sous-système d’E/S.
idle_pct_cpu0 – pourcentage libre pour le processeur 0
Un accroissement peut indiquer une recrudescence des conflits au
niveau des ressources autres que CPU (pagination ou E/S, par
exemple). Cette tendance mérite attention car elle indique que les
ressources CPU ne sont pas correctement exploitées.
idle_pct_avg – pourcentage libre moyen pour tous les processeurs
Un accroissement peut indiquer une recrudescence des conflits au
niveau des ressources autres que CPU (pagination ou E/S, par
exemple). Cette tendance mérite attention car elle indique que les
ressources CPU ne sont pas correctement exploitées.
Outil de diagnostic PDT
12-15
Boîte à outils PTX
La boîte à outils PTX (Performance Toolbox for AIX) est un logiciel sous licence qui permet
d’afficher graphiquement diverses mesures de performances. L’affichage graphique facilite
grandement la lecture des performances par rapport aux listings de chiffres proposés par
les programmes ASCII équivalents. PTX permet également de combiner les informations
issues de différentes commandes de contrôle de performances AIX.
PTX est décrit en détail dans Performance Toolbox 1.2 and 2.1 for AIX: User’s Guide.
12-16
AIX 4.3 Guide d’optimisation
Diagnostics en fonction d’un symptôme particulier
Face à une anomalie de performance, l’analyste pourra déterminer plus aisément les
causes du problème s’il en connaît la nature.
Cette section traite des points suivants :
• ”Ralentissement d’un programme particulier”
• ”Ralentissement général à un moment donné”
• ”Ralentissement général et imprévisible”
• ”Ralentissement des programmes d’un utilisateur particulier”
• ”Ralentissement simultané de certains systèmes du réseau local”
En cas de ralentissement général intermittent sur une unité ou un service en particulier,
reportez-vous, selon le cas, à :
• ”Contrôle et optimisation des E/S disque”
• ”Contrôle et optimisation de la mémoire”
• ”Contrôle et optimisation de la CPU”
• ”Contrôle et optimisation des E/S de communications.”
Ralentissement d’un programme particulier
Ce cas, apparemment banal, doit cependant être clairement analysé :
• Le programme a-t-il toujours fonctionné lentement ?
S’il s’agit d’un ralentissement récent, vous devez déterminez quel changement peut en
être à l’origine.
• Le code source a-t-il été modifié ou une nouvelle version installée ?
Dans l’affirmative, contactez le programmeur ou le fournisseur.
• L’environnement a-t-il été modifié ?
Si un fichier utilisé par le programme (y compris son propre exécutable) a été déplacé, il
se peut que le programme subisse les retards liés au réseau local ou que des fichiers
sollicitent simultanément un mécanisme d’accès sur un seul disque et non sur plusieurs
comme auparavant.
Si l’administrateur système a modifié les paramètres d’optimisation du système, le
programme peut subir des contraintes qu’il n’avait pas auparavant. Par exemple, si le
mode de calcul des priorités a été modifié via la commande schedtune –r, les
programmes auparavant rapides en arrière-plan peuvent être ralentis et ceux en
avant-plan accélérés.
• Le programme est-il écrit en awk, csh ou dans un autre langage interprétatif ?
Les langages interprétatifs, utiles pour écrire rapidement un programme, ne sont pas
optimisés par un compilateur. Par ailleurs, avec un langage de type awk, quelques
caractères suffisent parfois pour demander l’exécution d’opérations extrêmement
lourdes en E/S ou en calcul. Il est souvent utile de vérifier ces programmes pas à pas ou
de les faire réviser de façon informelle pour mettre en évidence le nombre d’itérations
qu’implique chaque opération.
• Le programme est-il toujours aussi lent ?
Une partie de la mémoire est utilisée par le système de fichiers d’AIX pour conserver des
pages de fichiers en vue d’un usage ultérieur. Si un programme limité en disque est
exécuté deux fois de suite de façon très rapprochée, il doit normalement être plus rapide
la seconde fois que la première. Un phénomène similaire peut être observé avec des
Outil de diagnostic PDT
12-17
programme exploitant NFS et DFS. Il en est de même avec de gros programmes, tels
que des compilateurs. Même si l’algorithme du programme n’est pas limité en disque, la
durée de chargement d’un exécutable volumineux sera plus élevée à la première
exécution qu’aux suivantes.
• Si le programme a toujours été très lent ou qu’aucune modification d’environnement ne
peut justifier son ralentissement, il faut étudier les ressources dont il dépend.
Reportez-vous à ”Identification des ressources limitatives”, page 12-23 pour connaître
les techniques de localisation des goulots d’étranglement.
Ralentissement général à un moment donné
Le ralentissement aux heures de pointe est un phénomène bien connu dû à l’arrivée
massive et habituelle des utilisateurs d’une entreprise sur un système. Mais il ne s’agit pas
toujours simplement d’un problème de concentration de la charge de travail. Parfois, ce
phénomène peut trahir un déséquilibre qui ne se manifeste pour l’instant que lors des
charges lourdes. D’autres sources de ralentissement périodique doivent également être
envisagées.
• Si vous exécutez iostat et netstat sur une période couvrant la durée du ralentissement
(ou que vous avez précédemment extrait des données du dispositif de contrôle),
avez-vous constaté une utilisation plus intensive de certains disques ? Le pourcentage
de CPU libre est-il régulièrement proche de zéro ? Le nombre de paquets envoyés ou
reçus est-il anormalement élevé ?
Si un déséquilibre apparaît au niveau des disques, reportez-vous à ”Contrôle et
optimisation des E/S disque”, page 8-1.
Si la CPU est saturée, lancez ps pour identifier les programmes exécutés durant cette
période. Le script présenté à ”Commandes de contrôle iostat, netstat et vmstat” vous
aidera à trouver les sources qui monopolisent la CPU.
Si le ralentissement semble aberrant (paralysie aux heures de repas, par exemple),
assurez-vous qu’il ne s’agit pas d’un programme ”pathologique” (tel Graphic Xlock ou un
jeu informatique). Certaines versions de Xlock font un usage ”boulimique” de temps CPU
pour afficher des graphiques sur un écran vide. Il se peut également qu’un utilisateur
profite de ce moment opportun pour lancer un programme très gourmand en CPU.
• A moins que votre fichier /var/adm/cron/cron.allow ne soit vide, il n’est pas inutile de
vérifier si le répertoire /var/adm/cron/crontab contient des opérations très lourdes.
Par exemple, il se peut que des utilisateurs aient demandé la sauvegarde de tous les
fichiers de leur répertoire personnel, toutes les heures, dans un répertoire monté
sur NFS.
S’il s’avère que le problème provient d’un conflit entre les activités d’avant-plan et des
programmes longs, très consommateurs en CPU, exécutés (ou appelés à l’être) en
arrière-plan, lancez schedtune –r –d pour donner priorité aux activités d’avant-plan.
Reportez-vous à ”Optimisation du calcul de la priorité des processus avec schedtune”,
page 6-23.
Ralentissement général et imprévisible
L’outil le mieux adapté à ce problème est un détecteur de surcharge, tel le programme filtd
de xmperf (composant de PTX). Ce programme peut être configuré pour exécuter les
scripts shell ou recueillir des informations lorsque certaines conditions sont réunies. Vous
pouvez créer votre propre outil selon le même modèle à l’aide de scripts shell contenant les
commandes vmstat, netstat et ps.
Si l’incident ne se produit que sur un seul système d’un environnement distribué, il s’agit
sans doute d’un programme ”pathologique” ou de deux qui interagissent de façon aléatoire.
12-18
AIX 4.3 Guide d’optimisation
Ralentissement des programmes d’un utilisateur particulier
Parfois, un système semble avoir décidé de ”harceler” un utilisateur particulier.
• Dans ce cas, vous devez tenter de quantifier le problème : demandez à l’utilisateur
quelles sont les commandes qu’il a l’habitude d’utiliser et exécutez-les en association
avec la commande time, comme suit :
$ time cp .profile testjunk
real
0m0.08s
user
0m0.00s
sys
0m0.01s
Puis exécutez-les sous un ID utilisateur valide. Le temps réel indiqué sur la ligne real
est-il différent ?
• D’une exécution à l’autre, un programme consomme normalement à peu près le même
temps CPU (user+sys), mais il se peut parfois que le temps réel (real) utilisé soit
différent du fait des opérations E/S, plus nombreuses ou plus lentes. Les fichiers de
l’utilisateur sont-il implantés sur un répertoire monté sur NFS ? Ou sur un disque
intensément utilisé pour d’autres raisons ?
• Vérifiez le fichier .profile de l’utilisateur : les spécifications $PATH sont peut-être
étranges. Par exemple, si vous recherchez sans succès une paire de répertoires montés
sur NFS avant d’explorer /usr/bin, tout sera plus long.
Ralentissement simultané de certains systèmes du réseau local
Passer de systèmes autonomes à des systèmes distribués se fait rarement sans difficultés :
le peu de temps imparti à reconfigurer les systèmes et la méconnaissance du coût de
certaines fonctions en sont souvent la cause. Par ailleurs, en plus de l’optimisation de la
configuration LAN des MTU et mbuf (voir le chapitre Contrôle et optimisation des E/S de
communications), vous devez rechercher les pathologies propres au réseau local et les
lourdeurs résultant de la combinaison de mesures individuelles, justifiées en elles-mêmes.
• Certains défauts de logiciels ou de micrologiciels peuvent saturer sporadiquement le
réseau local de paquets de diffusion ou autres.
Lorsque le réseau est inondé de paquets de diffusion, même les systèmes qui le
sollicitent peu peuvent être ralentis par les interruptions incessantes et le temps CPU
consommé par la réception et le traitement des paquets. Les dispositifs d’analyse des
réseaux locaux sont plus à même de détecter et localiser ces défaillances que les outils
de performances AIX (PTX).
• Deux réseaux locaux sont-ils connectés via un système AIX ?
L’utilisation d’un système AIX comme routeur monopolise beaucoup de temps CPU pour
le traitement et la copie des paquets. Des interférences avec d’autres travaux en cours
sur le système AIX peuvent se produire. La connexion à des réseaux locaux via des
ponts et des routeurs matériels dédiés est généralement plus rentable et durable.
• Tous les montages NFS sont-ils justifiés ?
A un certain stade de développement des configurations distribuées, les montages NFS
sont utilisés pour donner aux utilisateurs des nouveaux systèmes accès à leur répertoire
personnel sur le système d’origine. Cette opération simplifie la transition initiale mais
impose un coût de communication de données continue. Il arrive que des utilisateurs
d’un système A utilisent essentiellement les données d’un système B et vice versa.
L’accès à des fichiers via NFS représente un coût considérable en terme de trafic LAN,
temps CPU serveur et client et temps de réponse pour l’utilisateur final. En principe, il
faut autant que possible que les utilisateurs et les données résident sur le même
système. Seule exception à cette règle, les cas où un impératif justifie le coût et le temps
supplémentaire pour des données distantes : par exemple, la nécessité de centraliser
Outil de diagnostic PDT
12-19
les données pour assurer un contrôle et une sauvegarde fiable ou encore de s’assurer
que tous les utilisateurs travaillent sur la dernière version d’un programme.
Si ces impératifs exigent un taux important d’échanges client/serveur NFS, il est
préférable de dédier un système au rôle de serveur plutôt que de travailler avec
plusieurs systèmes mi-serveurs, mi-clients.
• Les programmes ont-ils été correctement portés pour utiliser les appels de procédure à
distance RPC (et cela se justifiait-il) ?
Le plus simple pour porter un programme sur un environnement distribué est de
remplacer les appels de programmes par des RPC sur une base 1:1. Mais il faut savoir
que l’écart de performances entre des appels de programme locaux et des appels RPC
est encore plus élevé que l’écart entre les E/S disque locales et les E/S NFS. Dès lors
que les RPC se révèlent indispensables, il est préférable de les traiter par lots chaque
fois que possible.
Ralentissement général intermittent sur une unité ou un service
Assurez-vous que vous avez suivi les recommandations de configuration du guide relatif au
sous-système en cause et/ou au chapitre ”Contrôle et optimisation” concerné dans le
présent manuel.
12-20
AIX 4.3 Guide d’optimisation
Diagnostics à l’aide de PerfPMR
La fonction du module PerfPMR est de compléter les comptes rendus d’anomalies de
performances sous AIX, jusqu’à ce qu’ils contiennent suffisamment de données pour que
BULL puisse établir un diagnostic. De ce fait, les scripts shell de PermPMR peuvent être
utiles à d’autres analystes. PerfPMR est un module en option du BOS (Base Operating
System) d’AIX version 4.1. Il se trouve dans /usr/sbin/perf/pmr. Reportez-vous à
”Installation de PerfPMR d’AIX version 4.1”. Une version de PerfPMR pour AIX version 3.2.5
est également disponible (reportez-vous à ”Obtention et installation de PerfPMR (AIX
version 3.2.5)”).
perfpmr est le script de plus haut niveau du module, mais les données qu’il collecte (telles
que des informations de configuration) sont généralement déjà connues de l’analyste local.
Le script de plus bas niveau, monitor, se charge de recueillir un ensemble d’informations
coordonnées pendant un intervalle donné (en secondes) et de résumer ces données.
La syntaxe de monitor est :
monitor secondes [–n] [–p]
Le paramètre secondes doit être supérieur ou égal à 60. Si secondes est inférieur ou égal à
600, le compte rendu périodique est généré toutes les 10 secondes ; sinon, l’intervalle est
de 60 secondes. L’indicateur –n élimine la collecte des données netstat et nfsstat.
L’indicateur –p élimine la collecte des données du profil du processus (voir ci-dessous).
Il est déconseillé d’exécuter le script monitor en même temps qu’une opération qui sollicite
l’utilitaire de suivi du système.
Chaque requête monitor crée :
• Un fichier monitor.int contenant le résultat :
– des commandes ps –elk et ps gv exécutées au début et à la fin de la période de
contrôle (sorties combinées),
– d’une commande sar –A avec l’intervalle approprié,
– d’une commande iostat avec l’intervalle approprié. Le rapport initial, cumulé, est omis.
– d’une commande vmstat avec l’intervalle approprié. Le rapport initial, cumulé, est
omis.
• Un fichier monitor.sum contenant :
– pour les processus actifs en début et fin du contrôle, les écarts entre les valeurs
initiales et finales des statistiques d’utilisation des ressources,
– les lignes ”Average” issues de la sortie de la commande sar –A,
– la moyenne des statistiques de l’intervalle iostat,
– la moyenne des statistiques de l’intervalle vmstat,
– l’écart entre les statistiques avant/après générées par la commande vmstat –s.
• Si l’option –n n’est pas spécifiée, un fichier netstat.int contenant :
– la sortie en début de contrôle des commandes :
netstat –v
netstat –m
netstat –rs
netstat –s
– la sortie d’une commande netstat avec l’intervalle approprié,
– la sortie en fin de contrôle des commandes :
Outil de diagnostic PDT
12-21
netstat –v
netstat –m
netstat –rs
netstat –s
• Si l’option –n n’est pas spécifiée, un fichier nfsstat.int contenant :
– la sortie en début et fin de contrôle d’une commande nfsstat –csnr.
• Si l’option –p n’est pas spécifiée, deux fichiers, Pprof.stt et Pprof.flow. Pprof.stt,
contiennent les heures de début et de fin de l’exécution. Pprof.flow contient les données
du profil du processus. Les colonnes du fichier Pprof.flow sont :
a. Nom du processus
b. ID processus
c. Heure de la première occurrence du processus dans l’intervalle de mesure
d. Heure de la dernière occurrence du processus
e. Temps d’exécution total du processus
f. Indicateurs Begin/End (la somme des deux est donnée plus loin). Indique l’état du
processus en début et fin d’exécution :
Begin:
execed:
forked:
Alive at Start:
End:
Alive at end:
execed away:
Exited:
0
1
2
0
4
8
g. ID processus parent
Contrôle avant modification
Une des fonctions les plus utiles de PerfPMR est de créer une ligne de base de la
configuration et des performances avant toute modification logicielle ou matérielle
significative. Comme vous le faites pour les fichiers critiques, vous devez sauvegarder les
configurations et leurs performances : si vous constatez une dégradation des performances,
vous disposez alors de toutes les données utiles pour analyser précisément la situation
avant et après modification.
Pour obtenir les données les plus complètes possibles, exécutez :
$ perfpmr 3600
au cours de l’heure la plus chargée de la journée. Les fichiers résultants de cette mesure se
trouvent dans le répertoire /var/perf/tmp. (Si vous exploitez un système antérieur à la
version 4, les fichiers résultants se trouvent dans le répertoire de travail courant.) Veillez à
placer ces fichiers dans un endroit sûr avant toute modification.
12-22
AIX 4.3 Guide d’optimisation
Identification des ressources limitatives
Cette section traite des points suivants :
• ”Aperçu des performances du système”
• ”Détermination du facteur limitatif sur un programme”
• ”Disque ou mémoire”
Aperçu des performances du système
Le meilleur outil pour avoir une vue d’ensemble de l’utilisation des ressources dans un
environnement multi-utilisateur est sans doute la commande vmstat. La commande vmstat
rend compte de l’activité de la CPU et des E/S disque, ainsi que les données d’utilisation de
la mémoire. La commande
$ vmstat 5
commande à vmstat d’écrire une ligne de rapport sur l’activité du système toutes les
5 secondes. Aucun compte n’ayant été spécifié à la suite de cet intervalle, la génération des
rapports se poursuit jusqu’à annulation de la commande.
Le relevé vmstat ci-dessous concerne un système exécutant AIXwindows et plusieurs
applications associées (certains intervalles de faible activité ont été supprimés) :
procs
–––––
r b
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 1
0 1
0 0
memory
page
faults
––––––––––– –––––––––––––––––––––––– ––––––––––––
avm
fre re pi po fr
sr cy in
sy cs
8793
81
0
0
0
1
7
0 125
42 30
8793
80
0
0
0
0
0
0 155 113 79
8793
57
0
3
0
0
0
0 178
28 69
9192
66
0
0 16 81 167
0 151
32 34
9193
65
0
0
0
0
0
0 117
29 26
9193
65
0
0
0
0
0
0 120
30 31
9693
69
0
0 53 100 216
0 168
27 57
9693
69
0
0
0
0
0
0 134
96 60
10193
57
0
0
0
0
0
0 124
29 32
11194
64
0
0 38 201 1080
0 168
29 57
11194
63
0
0
0
0
0
0 141 111 65
5480
755
3
1
0
0
0
0 154 107 71
5467 5747
0
3
0
0
0
0 167
39 68
4797 5821
0 21
0
0
0
0 191 192 125
3778 6119
0 24
0
0
0
0 188 170 98
3751 6139
0
0
0
0
0
0 145
24 54
cpu
–––––––––––
us sy id wa
1 2 95 2
14 8 78 0
1 12 81 6
1 6 77 16
1 3 96 0
1 3 95 0
1 4 63 33
12 4 84 0
1 3 94 2
2 8 62 29
12 7 81 0
13 8 78 2
1 16 79 5
20 5 42 33
5 8 41 46
1 10 89 0
Les colonnes pertinentes pour l’évaluation initiale sont les colonnes pi et po dans page et
les quatre colonnes de la rubrique cpu.
• Les entrées pi et po correspondent respectivement aux chargements et aux
déchargements de page dans l’espace de pagination. Si une E/S dans l’espace de
pagination se produit, la charge de travail approche (voire dépasse) les limites de
mémoire du système.
• Si la somme des taux d’utilisation de CPU us et sy (utilisateur et système) excède 80 %
dans un intervalle donné de 5 secondes, la charge de travail s’approche des limites CPU
du système pendant cet intervalle.
• Un pourcentage d’attente des E/S (wa) non nul (colonnes pi et po à zéro) signifie qu’un
certain temps d’attente est marqué sur les E/S de fichiers non coordonnées et qu’une
partie de la charge de travail est limitée en E/S.
S’approcher des limites signifie qu’une partie de la charge subit un ralentissement du fait
d’une ressource critique. L’allongement des temps de réponse n’est peut-être pas
subjectivement significatif, mais tout supplément de charge à ce niveau entraînera une
détérioration rapide des performances.
Outil de diagnostic PDT
12-23
Si vmstat signale un temps d’attente des E/S important, exécutez iostat pour disposer
d’informations plus détaillées. La commande
$ iostat 5 3
commande à iostat d’établir toutes les 5 secondes un bref relevé des E/S et de l’activité de
la CPU. Le chiffre 3 final indique de générer trois relevés.
Le relevé iostat ci-dessous concerne un système doté de la même charge de travail que
dans l’exemple précédent (vmstat), mais à un autre moment. Le premier relevé fournit le
cumul d’activité depuis le dernier amorçage, et les suivants, l’activité au cours de l’intervalle
de 5 secondes qui précède :
tty:
tin
0.0
Disks:
hdisk0
hdisk1
hdisk2
cd0
tty:
% tm_act
0.0
0.0
0.4
0.0
tin
0.0
Disks:
hdisk0
hdisk1
hdisk2
cd0
tty:
tout
4.3
tout
30.3
% tm_act
0.2
0.0
0.0
0.0
tin
0.0
Disks:
hdisk0
hdisk1
hdisk2
cd0
cpu:
% user
0.2
Kbps
0.2
0.0
1.5
0.0
cpu:
Kbps
0.8
0.0
0.0
0.0
tout
8.4
cpu:
% tm_act
0.0
0.0
98.4
0.0
Kbps
0.0
0.0
575.6
0.0
% sys
% idle
% iowait
0.6
98.8
0.4
tps
0.0
0.0
0.3
0.0
% user
8.8
tps
0.2
0.0
0.0
0.0
% user
0.2
tps
0.0
0.0
61.9
0.0
msps
% sys
7.2
msps
% sys
5.8
msps
Kb_read
7993
2179
67548
0
% idle
83.9
Kb_read
4
0
0
0
Kb_wrtn
4408
1692
59151
0
%iowait
0.2
Kb_wrtn
0
0
0
0
% idle
% iowait
0.0
93.8
Kb_read
0
0
396
0
Kb_wrtn
0
0
2488
0
Le premier relevé révèle un déséquilibre au niveau des E/S : la plupart (86,9 % de kilooctets
en lecture contre 90,7 % en écriture) concernent le disque hdisk2 qui contient le système
d’exploitation et l’espace de pagination. L’utilisation cumulée de la CPU depuis le dernier
amorçage n’est généralement significative que sur un système exploité 24 h sur 24.
La second relevé indique un faible volume de lecture sur le disque hdisk0, qui contient un
système de fichiers distinct, réservé à l’utilisateur principal du système. L’activité CPU
provient de deux programmes d’application et de la commande iostat elle-même. La sortie
de iostat, bien que non volumineuse, est réacheminée vers un fichier, le système n’étant
pas suffisamment limité en mémoire pour forcer une sortie pendant cet intervalle.
Dans le troisième relevé, des conditions proches de l’emballement ont été créées, par
l’exécution d’un programme qui affecte et remplit un volume important de mémoire
(ici, environ 26 Mo). hdisk2 est actif 98,4 % du temps, ce qui entraîne une attente E/S de
93,8 %. Le fait qu’un seul programme monopolise plus des trois-quarts de la mémoire
système (32 Mo) et provoque l’emballement du système met en évidence les limites du
contrôle de charge mémoire VMM, page 2-10. Même dans le cas d’une charge plus
homogène, la capacité mémoire requise pour chaque élément doit être bien analysée.
Si vmstat indique qu’une quantité importante de temps CPU est disponible alors que le
système donne des signes de ralentissement, il se peut que vous soyez confronté à des
retards causés par des conflits de verrouillage dans le noyau. Sous AIX version 4.1, ce
phénomène peut être étudié à l’aide de la commande lockstat si Performance Toolbox est
installé sur votre système.
12-24
AIX 4.3 Guide d’optimisation
Détermination du facteur limitatif sur un programme
Si vous êtes l’unique utilisateur d’un système, vous pouvez, via la commande time,
déterminer si un programme est ou non dépendant des E/S et de l’utilisation de la CPU :
$ time cp foo.in foo.out
real
user
sys
0m0.13s
0m0.01s
0m0.02s
Remarque : Les exemples de commande time proposés dans ce manuel utilisent la
version intégrée au shell Korn. La commande time officielle (/usr/bin/time) génère,
entre autres inconvénients, un relevé moins détaillé.
Dans cet exemple, le fait que le temps réellement écoulé pour l’exécution de cp
(0,13 seconde) soit bien supérieur à la somme (0,03 seconde) des temps d’utilisation CPU
utilisateur et système, indique que le programme est limité en E/S. Ceci se produit
principalement parce que foo.in n’a pas fait l’objet d’une lecture récente. La même
commande, exécutée sur le même fichier quelques secondes plus tard, indique :
real
user
sys
0m0.06s
0m0.01s
0m0.03s
La plupart (voire la totalité) des pages de foo.in sont encore en mémoire car aucun
processus n’est intervenu pour les réclamer et, par ailleurs, la taille du fichier est minime,
comparée à la capacité RAM du système. Un petit fichier foo.out serait également placé
en mémoire et un programme qui l’utiliserait en entrée serait peu dépendant du disque.
Pour déterminer la dépendance d’un programme vis-à-vis du disque, vérifiez l’état de
données en entrée : si le programme doit normalement être exécuté sur un fichier qui n’a
pas été récemment utilisé, assurez-vous que le fichier test ne se trouve pas en mémoire.
S’il s’agit, à l’inverse, d’un programme normalement exécuté dans une séquence standard,
et qu’il prend en entrée la sortie du programme précédent, il vous faut préparer la mémoire
pour garantir l’exactitude de la mesure. Par exemple :
$ cp foo.in /dev/null
prépare la mémoire en lui intégrant les pages de foo.in.
La situation est plus complexe si la taille du fichier est grande par rapport à la capacité
RAM. Si la sortie d’un programme est reprise en entrée par le suivant et que la totalité du
fichier ne loge pas dans la RAM, le second programme terminera la lecture des pages en
début de fichier, déplaçant les pages à la fin. Ces conditions, très difficiles à reproduire
artificiellement, équivalent grosso modo à une situation dans laquelle aucune mise en
cache n’a lieu sur le disque.
Le cas particulier d’un fichier de taille supérieure à celle de la RAM est traité dans la section
suivante.
Disque ou mémoire ?
De même qu’une part importante de la mémoire réelle est réservée à la mise en tampon
des fichiers, l’espace de pagination du système est utilisé comme mémoire temporaire pour
les données actives d’un programme qui ont été expulsées de la RAM. Supposons qu’un
programme lise peu ou pas de données et présente néanmoins des symptômes de
dépendance vis–à–vis des E/S. Pire, le ratio de temps réel par rapport au temps utilisateur
+ système ne s’améliore pas au cours des exécutions successives. On peut en conclure
que ce programme est probablement limité en mémoire et que ses E/S sont destinées à
l’espace de pagination (d’où elles proviennent probablement). Pour le vérifier, vous pouvez
utiliser le script shell vmstatit ci-dessous. Le script shell vmstatit résume le
volumineux compte rendu généré par vmstat –s, qui indique les décomptes cumulés de
certaines activités système depuis son lancement :
Outil de diagnostic PDT
12-25
vmstat –s >temp.file
# cumulative counts before the command
time $1
# command under test
vmstat –s >>temp.file # cumulative counts after execution
grep ”pagi.*ins” temp.file >>results
# extract only the data
grep ”pagi.*outs” temp.file >>results # of interest
Si le script shell est exécuté comme suit :
$ vmstatit ”cp file1 file2”
2>results
le résultat donné dans results est :
real
user
sys
0m0.03s
0m0.01s
0m0.02s
2323 paging
2323 paging
4850 paging
4850 paging
space
space
space
space
page
page
page
page
ins
ins
outs
outs
Le fait que les données statistiques de pagination avant/après soient identiques nous
conforte dans l’idée que la commande cp n’est pas limitée en pagination. Une variante plus
complète du script shell vmstatit peut être utilisée pour refléter la situation réelle :
vmstat –s >temp.file
time $1
vmstat –s >>temp.file
echo ”Ordinary Input:”
grep ”^[ 0–9]*page ins”
echo ”Ordinary Output:”
grep ”^[ 0–9]*page outs”
echo ”True Paging Output:”
grep ”pagi.*outs”
echo ”True Paging Input:”
grep ”pagi.*ins”
>>results
temp.file >>results
>>results
temp.file >>results
>>results
temp.file >>results
>>results
temp.file >>results
Toutes les E/S ordinaires effectuées sous AIX étant traitées via VMM, la commande
vmstat –s rend compte des E/S ordinaires de programmes en termes de chargement/
déchargement de pages. La version ci-dessus du script shell vmstatit appliquée à la
commande cp sur un gros fichier qui n’a pas été récemment utilisé, génère :
real
0m2.09s
user
0m0.03s
sys
0m0.74s
Ordinary Input:
46416 page ins
47132 page ins
Ordinary Output:
146483 page outs
147012 page outs
True Paging Output:
4854 paging space
4854 paging space
True Paging Input:
2527 paging space
2527 paging space
page outs
page outs
page ins
page ins
La sortie de la commande time confirme l’existence d’une dépendance vis–à–vis des E/S.
L’accroissement des ”page ins” indique les E/S requises pour satisfaire la commande cp.
L’accroissement des ”page outs” indique que le fichier est suffisamment volumineux pour
forcer l’écriture des pages modifiées (pas nécessairement les siennes) à partir de la
mémoire. La constance du nombre cumulé d’E/S dans l’espace de pagination confirme que
les structures de données construites par la commande cp ne sont pas suffisamment
étendues pour surcharger la mémoire de la machine test.
L’ordre des E/S dans cette version du script shell vmstatit a son importance. En général,
les programmes lisent les entrées d’un fichier puis en écrivent la sortie. Mais dans le
12-26
AIX 4.3 Guide d’optimisation
processus de pagination, la page de segment actif qui ne peut être accueillie est d’abord
déchargée (écrite à l’extérieur) : elle n’est chargée (lue) que lorsque le programme tente d’y
accéder. Sur le système test, le déséquilibre entre le nombre de déchargements
(paging space page outs) et le nombre presque deux fois moindre de chargements
(paging space page ins) depuis le dernier amorçage révèle que certains programmes
ont stocké en mémoire des données qui n’ont pas été réutilisées jusqu’à la fin du
programme. ”programmes à CPU limitée”, page 4-20 donne davantage d’informations.
Reportez-vous également à ”Contrôle et optimisation de la mémoire”, page 7-1.
L’exemple ci-dessous illustre l’impact de la limitation de mémoire sur les statistiques : une
commande donnée est exécutée dans un environnement doté de suffisamment de mémoire
(32 Mo), puis la taille du système est réduite via une commande rmss (reportez-vous à
”Estimation de la mémoire requise via rmss”, page 7-6). La séquence de commandes :
$ cc –c ed.c
$ vmstatit ”cc –c ed.c” 2>results
prépare dans un premier temps la mémoire en lui intégrant le fichier source de 7 944 lignes
et l’exécutable du compilateur C puis mesure l’activité E/S de la seconde exécution :
real
0m7.76s
user
0m7.44s
sys
0m0.15s
Ordinary Input:
57192 page ins
57192 page ins
Ordinary Output:
165516 page outs
165553 page outs
True Paging Output:
10846 paging space
10846 paging space
True Paging Input:
6409 paging space
6409 paging space
page outs
page outs
page ins
page ins
Il n’y a visiblement pas de limitation au niveau des E/S. Même pour lire le code source,
aucune E/S n’est requise. Si vous exécutez la commande :
# rmss –c 8
pour ramener à 8 Mo la taille effective de la machine et que vous répétez la même
séquence de commandes, vous obtenez :
real
0m9.87s
user
0m7.70s
sys
0m0.18s
Ordinary Input:
57625 page ins
57809 page ins
Ordinary Output:
165811 page outs
165882 page outs
True Paging Output:
11010 paging space
11061 paging space
True Paging Input:
6623 paging space
6701 paging space
page outs
page outs
page ins
page ins
Cette fois, les symptômes d’E/S limitées apparaissent :
• le temps écoulé est supérieur au temps CPU total,
• le nombre d’E/S ordinaires à la nième exécution est considérable.
Outil de diagnostic PDT
12-27
Ces deux symptômes signalent que le manque de mémoire entrave l’exécution du
compilateur.
Remarque : Cet exemple illustre les effets d’une insuffisance de mémoire. Aucun effort
particulier n’a été fait pour minimiser l’utilisation de la mémoire par les autres processus,
la taille absolue imposée au compilateur pour charger cet environnement n’est donc pas
une mesure pertinente.
Pour ne pas être contraint de travailler sur une machine artificiellement réduite en taille
jusqu’à la prochaine relance, exécutez :
# rmss –r
Cette commande restitue au système d’exploitation la mémoire ”confisquée” par la
commande rmss et redonne ainsi au système sa capacité normale.
12-28
AIX 4.3 Guide d’optimisation
Gestion de la charge de travail
Si vous avez épuisé toutes les possibilités d’optimisation du système et des programmes
sans parvenir à un niveau de performances satisfaisant, il vous reste trois solutions :
• vous contenter de ce niveau de performances,
• mettre à niveau la ressource limitative,
• prendre des mesures de gestion de la charge.
Si vous optez pour la première solution, vous risquez de démotiver vos utilisateurs les
moins stoïques à force de frustration. Si vous optez pour la seconde solution, il y aura
toujours quelqu’un pour vous demander des comptes sur cette dépense supplémentaire.
Et il vous faudra prouver que vous avez épuisé toutes les autres possibilités sur le système
courant. Bref, il ne vous reste plus que la troisième solution : la gestion de la charge.
Gérer la charge de travail signifie simplement en analyser les éléments pour évaluer leur
degré d’urgence. Tous les travaux n’ont en effet pas la même priorité : ce rapport est utile
qu’il soit exécuté à 3 heures du matin ou à 16 heures la veille. La différence est qu’à
3 heures du matin, les cycles CPU qu’il utilise seraient sinon inexploités. Pour exécuter un
programme à une heure déterminée ou à intervalles réguliers, vous disposez des
commandes at et crontab.
De même, certains programmes devant être exécutés dans la journée peuvent être assortis
d’une priorité réduite : leur exécution prendra plus de temps, mais la compétition avec les
processus réellement urgents sera moindre.
Une autre méthode, dérivée de la première, consiste à transférer le travail d’une machine à
une autre, pour exécuter, par exemple, une compilation sur la machine où réside le code
source. Cet équilibrage de la charge exige davantage de planification et de contrôle :
réduire la charge sur le réseau et augmenter la charge CPU sur un serveur est une
opération qui, mal maîtrisée, peut se solder par une perte nette.
Outil de diagnostic PDT
12-29
12-30
AIX 4.3 Guide d’optimisation
Chapitre 13. Gestion d’un possible défaut de
performance AIX
Si vous pensez avoir détecté un défaut au niveau des performances d’AIX, vous disposez
d’outils et de procédures pour faire part du problème et fournir les données permettant de
l’analyser. Outils et procédures sont conçus pour vous donner une solution aussi précise et
rapide que possible avec un minimum d’effort et de temps de votre part.
Cette rubrique traite des points suivants :
• ”Base de mesure”
• ”Compte rendu du problème”
• ”Obtention et installation de PerfPMR (AIX version 3.2.5)”
• ”Installation de PerfPMR à partir du Web (inclut la version 4)”
• ”Données d’analyse”
Base de mesure
Les problèmes de performance apparaissent souvent immédiatement après une
modification du système, matérielle ou logicielle. A moins qu’une mesure pré-modification
n’ait été effectuée, base possible de comparaison des performances ”avant/après”,
quantifier le problème est impossible. Seule la collecte d’informations exhaustives sur la
configuration et les performances via le module PerfPMR permet une analyse efficace.
Reportez-vous à ”Contrôle avant modification”.
Disposer de l’outil PDT (Performance Diagnostic Tool) installé et opérationnel est également
utile pour étudier l’ensemble des performances du système.
Compte rendu du problème
Vous devez rendre compte des problèmes suspectés au niveau des performances AIX au
service BULL compétent. Pour ce faire, passez par votre canal habituel. Si vous n’êtes pas
familier de ce type d’opération, consultez votre représentant BULL.
Au moment de ce rapport, vous devez fournir les informations suivantes :
• Une description du problème qui permette d’explorer la base d’incidents pour déterminer
si un problème de ce type a déjà été signalé.
• Quel aspect de votre analyse vous a conduit à penser qu’AIX était en cause ?
• Dans quelle configuration matérielle/logicielle avez-vous rencontré ce problème ?
– Le problème est-il limité à un seul système, ou en affecte-t-il plusieurs ?
– Quels sont le modèle, la taille mémoire et le nombre et la taille des disques des
systèmes en cause ?
– Quels types de réseaux locaux et de supports de communications sont connectés
au(x) système(s) ?
– La configuration comporte-t-elle des systèmes non-AIX ? Non-UNIX ?
• Quelles sont les caractéristiques du programme ou du travail rencontrant le problème ?
Gestion d’un possible défaut de performance AIX
13-1
– Une analyse avec time, iostat et vmstat indique-t-elle une limitation de CPU ou
d’E/S ?
– Les travaux sont-ils exécutés sur : station de travail, serveur, multi-utilisateur ou un
panachage de ces types de système ?
• Quels sont les objectifs non atteints ?
– L’objectif principal est-il défini en termes de temps de réponse du terminal ou de la
console, du débit ou des réponses en temps réel ?
– Les objectifs ont-ils été fixés sur la base de mesures effectuées sur un autre système
AIX ? Si oui, quelle en est la configuration ?
Si l’incident est signalé pour la première fois, vous vous verrez attribuer un numéro de
référence PMR (à indiquer lors de tout renseignement complémentaire).
Vous serez probablement invité à fournir des données pour aider BULL à analyser le
problème. Pour les collecter, BULL fournit un module d’outils, appelé PerfPMR.
Sous AIX version 3.2.5, il s’agit d’un outil informel disponible auprès de votre représentant
BULL. Sous AIX version 4.1, PerfPMR est un module installable en option, fourni sur le
support du système d’exploitation de base (BOS) AIX.
Obtention et installation de PerfPMR (AIX version 3.2.5)
Procurez-vous une copie de PerfPMR AIX version 3.2.5 auprès de votre représentant
BULL.
Pour installer PerfPMR :
1. Connectez-vous en tant qu’utilisateur root ou passez par la commande su pour en
obtenir les droits.
2. Créez le répertoire perfpmr et passez-y (cet exemple suppose que le répertoire est créé
sous /tmp).
# cd /tmp
# mkdir perfpmr
# cd perfpmr
3. Copiez le fichier tar compressé à partir de la disquette (cet exemple suppose que l’unité
de disque utilisée est fd0) :
# tar –xvf/dev/fd0 perfpmr.tarbinz
4. Renommez le fichier tar :
# mv perfpmr.tarbinz perfpmr.tarbin.Z
5. Décompressez le fichier tar :
# uncompress perfpmr.tarbin.Z
6. Récupérez les scripts shell du fichier tar :
# tar –xvf perfpmr.tarbin
7. Installez les scripts shell :
# ./Install
13-2
AIX 4.3 Guide d’optimisation
Installation de PerfPMR à partir du Web (inclut la version 4)
Pour obtenir la bonne version de PerfPMR, visitez notre site Web à l’adresse
www.ibm.com. Saisissez perfpmr dans la zone de texte Search et appliquez la recherche
à l’ensemble du site (All of IBM). Le résultat de la recherche apparaît dans une fenêtre
ayant pour titre ”AIX Performance PMR Data Collection Scripts – perfpmr.” Cliquez sur le
bouton de téléchargement pour tranférer les fichiers depuis le site FTP contenant PerfPMR.
Plusieurs versions de PerfPMR sont répertoriées (perf32, perf41, perf42 et perf43 par
exemple).
Chaque dossier contient :
fichier perfxx.tar.Z
Fichier tar compressé contenant PerfPMR
message
Description du contenu
license.agreement
Accord de licence international BULL
readme
Instructions sur l’obtention et l’installation de PerfPMR, la
collecte des données et l’envoi de ces données à BULL
Pour installer PerfPMR à partir du Web :
1. Téléchargez la bonne version de PerfPMR dans le répetoire /tmp
2. Connectez-vous en tant qu’utilisateur root ou utilisez la commande su pour en obtenir
les droits.
3. Créez le répertoire perf41 (par exemple) et passez–y
# mkdir /tmp/perf41
# cd /tmp/perf41
4. Récupérez les scripts shell du fichier tar compressé :
# zcat /tmp/perf41.tar.Z | tar –xvf –
5. Installez les scripts shell :
# sh ./Install
Le processus d’installation place le module PerfPMR dans le répertoire /usr/sbin/perf/pmr.
Le module occupe environ 200 ko d’espace disque.
Données d’analyse
Tous les éléments suivants doivent être intégrés aux informations fournies au service de
maintenance, lors de la première collecte :
• Un moyen de reproduire le problème
– Si possible, joignez un programme ou un script shell illustrant le problème
– A défaut, décrivez précisément les conditions sous lesquelles a eu lieu le problème.
• Les données collectées par les outils PerfPMR
– Sur chaque système concerné
– Au même moment
– Pendant l’occurrence du problème.
Gestion d’un possible défaut de performance AIX
13-3
• L’application mise en cause par le problème
– Si l’application est un produit logiciel (ou en dépend), indiquez-en la version et la
révision exactes, même s’il ne s’agit pas d’un produit BULL.
– Si le code source de l’application a été créé par un utilisateur, indiquez l’ensemble
complet des paramètres du compilateur ayant servi à créer l’exécutable.
Capture des données
Pour capturer et conditionner les données sous une forme exploitable, exécutez les étapes
suivantes sur chacun des systèmes concernés. Si possible, exécutez l’étape 6
simultanément (ou presque) sur tous les systèmes.
1. Connectez-vous en tant qu’utilisateur root ou utilisez la commande su pour en obtenir
les droits.
2. PerfPMR capture davantage d’informations si les outils tprof, filemon et netpmon sont
disponibles. Sous AIX version 4.1, ils sont fournis comme élément de la boîte à outils
Performance Toolbox for AIX. Pour déterminer si ces outils ont été installés, entrez :
$ lslpp –lI perfagent.tools
Si ce module est installé, les outils sont disponibles.
3. Vérifiez que la variable PATH inclut le répertoire contenant les exécutables PerfPMR.
Sous AIX version 4.1, ajoutez /usr/sbin/perf/pmr à PATH. Par exemple :
# echo $PATH
/usr/bin:/etc:/usr/local/bin:/usr/ucb:.:
# PATH=$PATH:/usr/sbin/perf/pmr:
# export PATH
Sous la version 3, ajoutez à PATH le répertoire sous lequel vous avez installé PerfPMR
(à la place de /usr/sbin/perf/pmr) et le répertoire des outils de performance,
/usr/lpp/bosperf.
4. Sous la version 4, la sortie de perfpmr est écrite dans /var/perf/tmp. Sous la version 3,
vous devez :
a. Passer (via cd) à un répertoire adéquat, tel /tmp, dans un système de fichiers
disposant d’au moins 5 Mo d’espace libre.
b. Créer un sous-répertoire pour les données et y passer :
# mkdir perfdata
# cd perfdata
13-4
AIX 4.3 Guide d’optimisation
5. Surveillez l’activité système pendant 1 heure :
# perfpmr 3600
(dans la version 3, perfpmr s’appelle perfpmr.sh.)
6. Fusionnez les fichiers en un seul fichier tar compressé :
# cd ..
# tar –cvf numéro-pmr.tarbin.perfdata
# compress numéro-pmr.tarbin
numéro-pmr étant le numéro affecté au PMR par le service logiciel.
7. Transférez le fichier sur une disquette (ou un autre volume portable) via, par exemple :
# tar –cvf /dev/fd0 numéro-pmr.tarbin.Z
8. Étiquetez le volume portable en indiquant :
– le numéro PMR
– la date de collecte des informations
– la commande et les indicateurs requis pour extraire les données du volume portable,
par exemple :
# tar –xvf /dev/fd0
Envoyez les données au service de maintenance logicielle.
Gestion d’un possible défaut de performance AIX
13-5
13-6
AIX 4.3 Guide d’optimisation
Annexe A. Commandes de contrôle et d’optimisation
des performances AIX
Les outils relatifs aux performances dans l’environnement AIX relèvent de l’une des deux
catégories suivantes : informations sur le cours des événements ou moyens d’action sur
ces événements. Peu participent des deux catégories. Cette annexe récapitule les
commandes relatives aux performances. Nombre d’entre elles sont décrites dans les
chapitres traitant de l’optimisation d’aspects spécifiques du système. Pour la majorité, vous
trouverez le détail de leur fonction et leur syntaxe dans le manuel AIX Commands
Reference. Les commandes schedtune, pdt_config, pdt_report et vmtune sont décrites
plus avant dans cette annexe.
Certaines des commandes relatives aux performances sont fournies comme partie de la
boîte à outils Performance Toolbox for AIX (PTX), et non du système d’exploitation de base
AIX. Ces commandes sont identifiées par (PTX). Pour déterminer si les outils PTX sont
installés, entrez :
$ lslpp –lI perfagent.tools
Si le module est affiché AVAILABLE, les outils PTX sont exploitables.
Les listes suivantes récapitulent les commandes relatives aux performances :
• ”Commandes de compte rendu et d’analyse des performances”
• ”Commandes d’optimisation”, page A-3
Commandes de compte rendu et d’analyse des performances
Ces outils donnent des indications sur les performances d’un ou plusieurs éléments du
système, ou sur un ou plusieurs des paramètres ayant une incidence sur les performances.
Commande
Fonction
bf, bfrpt
Fournit des rapports détaillés sur les trames d’accès mémoire des
applications.
emstat
Rend compte des comptes d’instructions d’émulation.
filemon
Consigne, via l’utilitaire de suivi, l’activité E/S des volumes physiques,
des volumes logiques, des fichiers individuels et du gestionnaire VMM
(Virtual Memory Manager).
fileplace
Affiche l’emplacement physique ou logique des blocs constitutifs d’un
fichier, à l’intérieur du volume physique ou logique dans lequel ils
résident.
gprof
Rend compte du flux de contrôle au travers des sous-routines d’un
programme et du temps CPU consommé par chaque sous-routine.
iostat
Affiche l’utilisation des données par :
• Terminaux
• CPU
• Disques
lockstat
Affiche des informations relatives aux confits de verrouillage du noyau.
Commandes de contrôle et d’optimisation des performances AIX
A-1
lsattr
Affiche les attributs ayant une incidence sur les performances, tels que :
• La taille des caches
• La taille de la mémoire réelle
• Le nombre maximal de pages dans le cache tampon d’E/S bloc
• Le nombre maximal de kilo-octets de mémoire autorisés pour les
mbuf
• Les niveaux haut et bas de la régulation des E/S disque.
lslv
Affiche des informations sur un volume logique.
netpmon
Rend compte de l’activité réseau via l’utilitaire de suivi :
• Consommation CPU
• Débits de données
• Délais de réponse.
netstat
Affiche des informations et des statistiques diverses sur les
communications, telles que :
• L’état actuel du pool mbuf
• Les tables de routage
• Des statistiques cumulées sur l’activité du réseau.
nfso
Affiche (ou modifie) les valeurs des option NFS.
nfsstat
Affiche des statistiques sur l’activité client et serveur NFS (Network File
System) et RPC (Remote Procedure Call).
no
Affiche (ou modifie) les valeurs des options réseau, telles que :
• Tailles par défaut des tampons socket d’envoi et de réception
• Quantité maximale de mémoire utilisée dans le pool mbuf et les
pools de grappe.
pdt_config
Lance, arrête ou modifie les paramètres de PDT (Performance
Diagnostic Tool).
pdt_report
Génère un rapport PDT sur la base des données historiques actuelles.
ps
Affiche des statistiques et des informations d’état sur les processus du
système :
• ID processus
• Activité E/S
• Utilisation de CPU
sar
Affiche des statistiques sur les activités du système d’exploitation :
• Accès aux répertoires
• Appels système de lecture et d’écriture
• Duplications et exécutions
• Pagination.
schedtune
A-2
AIX 4.3 Guide d’optimisation
Affiche (ou modifie) la valeur des paramètres de contrôle de charge de
la mémoire VMM, la durée des tranches horaires CPU et l’intervalle de
réessai d’une opération n’ayant pas abouti suite à une insuffisance
d’espace de pagination.
smit
Affiche (ou modifie) les paramètres de gestion du système.
stem
Prend en charge l’instrumentation des entrées et sorties des
programmes exécutables, sans accès au code source de l’exécutable.
svmon
Indique l’état de la mémoire aux niveaux système, processus et
segment.
syscalls
Enregistre et compte les appels système.
time
Imprime le délai écoulé et le temps CPU utilisé par l’exécution d’une
commande.
tprof
Consigne, via l’utilitaire de suivi, la consommation de CPU par les
services de noyau, les sous-routines de bibliothèque, les modules de
programmes d’application et des lignes isolées de code source du
programme d’application.
trace
Ecrit un fichier qui retrace la séquence exacte des activités du système.
vmstat
Affiche des données VMM :
• Nombre de processus en attente ou susceptibles d’être diffusés
• Taille de la liste de trames de page disponibles
• Activité de défaut de page
• Utilisation de CPU.
vmtune
Affiche (ou modifie) les paramètres de l’algorithme de remplacement de
page VMM (Virtual Memory Manager).
Commandes d’optimisation
Les outils suivants permettent de modifier un ou plusieurs éléments liés aux performances
du système.
Commande
Fonction
fdpr
Optimise des fichiers exécutables pour une charge de travail donnée.
nfso
Affiche (ou modifie) les valeurs des option NFS.
nice
Exécute une commande selon une priorité spécifiée.
no
Affiche (ou modifie) les valeurs des options réseau.
renice
Modifie la priorité des processus en cours.
reorgvg
Réorganise les éléments d’un groupe de volume.
rmss
Réduit temporairement la taille de RAM effective d’un système pour
évaluer les performances probables d’un travail sur une machine plus
petite ou pour vérifier la taille de mémoire requise par un élément d’un
travail.
schedtune
Affiche (ou modifie) la valeur des paramètres de contrôle de charge de
la mémoire VMM, la durée des tranches horaires CPU et l’intervalle de
réessai d’une opération n’ayant pas abouti suite à une insuffisance
d’espace de pagination.
Commandes de contrôle et d’optimisation des performances AIX
A-3
smit
Affiche (ou modifie) les paramètres de gestion du système.
vmtune
Affiche (ou modifie) les paramètres de l’algorithme de remplacement de
page VMM (Virtual Memory Manager).
Voir aussi
”Commandes : généralités” dans AIX 4.3 Guide de l’utilisateur : système d’exploitation et
unités explique comment interpréter les diagrammes de syntaxe.
A-4
AIX 4.3 Guide d’optimisation
Commande emstat
Objet
Rend compte des comptes des instructions émulées.
Syntaxe
emstat [ Interval ] [ Count ]
Description
La commande emstat fournit des statistiques sur le nombre d’instructions que le système
doit émuler. Ce décompte est utilisé pour déterminer si une application doit être recompilée
pour éliminer les instructions qui doivent être émulées sur les processeurs PowerPC 601 ou
PowerPC 604. Une instruction qui doit être émulée requiert davantage de cycles CPU
qu’une instruction qui ne doit pas l’être.
Si une application a été compilée sous AIX version 3, elle peut contenir des instructions non
disponibles sur les processeurs 601 ou 604. Le 601 est dotés de la majorité des instructions
POWER ; il lui en manque environ cinq, rarement exécutées : les problèmes sont donc
exceptionnels. Par contre, il manque environ 35 instructions POWER au processeur 604 :
les chances d’émulation sont plus élevées.
Ce phénomène d’instruction émulée se produit avec des applications qui n’ont été
compilées en mode commun sous AIX version 3 et sont exécutées sur un processeur 601
ou 604 sans recompilation préalable. Si l’application a été compilée sous AIX version 4.1,
l’option de compilation par défaut est ”common”, aussi seules des instructions communes à
tous les processeurs sont intégrés à l’exécutable. Les instructions émulées peuvent
également apparaître sur un processeur 601 ou 604 si une application a été compilée pour
une architecture spécifique, POWER ou POWER2, par exemple.
La solution est de recompiler l’application, sous AIX version 4.1 ou sous AIX version 3.2.5,
en spécifiant l’option qarch=com. Pour effectuer une compilation en mode commun sous
AIX version 3.2.5, il vous faut un APAR qui introduise ce code commun.
Le paramètre Interval spécifie le délai (en secondes) entre chaque compte rendu. Le
premier compte rendu contient des statistiques concernant la durée écoulée depuis le
lancement du système. Les comptes rendus suivants contiennent des statistiques
collectées au cours de l’intervalle écoulé depuis le compte rendu précédent. Si vous ne
spécifiez pas le paramètre Interval, la commande emstat génère un seul rapport, puis
quitte.
Le paramètre Count ne peut être spécifié qu’associé au paramètre Interval. S’il est spécifié,
le paramètre Count détermine le nombre de rapports générés. Si le paramètre Interval est
spécifié sans le paramètre Count, les rapports sont générés en continu. Le paramètre
Count ne peut être affecté de la valeur 0.
Sortie
La première colonne est le nombre total d’instructions émulées depuis le dernier
réamorçage du système. La deuxième colonne est le nombre d’instructions émulées
pendant l’intervalle spécifié.
Commandes de contrôle et d’optimisation des performances AIX
A-5
Commande schedtune
Objet
Définit les paramètres de traitement du programmateur de CPU et du gestionnaire VMM
(Virtual Memory Manager).
Syntaxe
schedtune
–D
–d n
–e n
–f n
–h n
–m n
–p n
–r n
–t n
–w n
schedtune [ –D | { [ –d n ] [ –e n ] [ –f n ] [ –h n ] [ –m n ] [ –p n ] [ –r n ] [ –t n ] [ –w n ] } ]
Description
Paramètres de calcul de priorité
La priorité de la plupart des processus utilisateur varie en fonction du temps CPU
récemment utilisé par le processus. Les calculs de priorité du programmateur de CPU sont
basés sur deux paramètres définis via schedtune : –r et –d. Les valeurs de r et de d sont
exprimées en unités de trente secondes (1/32) ; c’est-à-dire que la formule utilisée par le
programmateur pour calculer la quantité à ajouter à la priorité d’un processus pour pénaliser
un usage récent de CPU est la suivante :
pénalité CPU = (valeur de CPU récemment utilisée par le processus) * (r/32)
et le recalcul une fois par seconde de la valeur de CPU récemment utilisée par chaque
processus est effectué selon la formule :
nouvelle valeur de CPU récemment utilisée = (ancienne valeur) * (d/32)
Par défaut, r et d ont tous deux la valeur 16 – qui assure la comptabilité de la planification
de CPU avec les versions antérieures d’AIX. Avant de tester ces valeurs, consultez la
section ”Optimisation du calcul de la priorité d’un processus via schedtune”, page 6-23.
Paramètres de contrôle de charge mémoire
Le programmateur AIX exécute un contrôle de charge mémoire en suspendant les
processus lorsque la mémoire est ”sur-sollicitée”. Le système n’éjecte pas les processus,
mais vole les pages au fur et à mesure qu’elles sont requises par la mémoire courante.
Normalement, les pages sont volées aux processus suspendus. La mémoire est considérée
sur-sollicitée si :
p*h>s
p étant le nombre de pages écrites dans l’espace de pagination au
cours de la dernière seconde, h un entier défini par l’indicateur –h, et s
le nombre de vols de pages commis pendant la dernière seconde.
A-6
AIX 4.3 Guide d’optimisation
Un processus est suspendu lorsque la mémoire est sur-sollicitée et que :
r*p>f
r étant le nombre de ”repages” accumulées par le processus au cours
de la dernière seconde, p un entier défini par l’indicateur –p, et f le
nombre de défauts de page rencontrés par le processus au cours de la
dernière seconde.
Les processus à priorité fixe de même que les processus noyau ne peuvent être
suspendus.
Le terme ”repages” fait référence au nombre de pages appartenant au processus qui ont
été réclamées et qui, très vite, ont à nouveau été référencées par le processus.
L’utilisateur peut également spécifier un niveau minimal de multiprogrammation via
l’indicateur –m. Ceci garantit l’activité d’un minimum de processus pendant la période de
suspension. Les processus sont dits actifs lorsqu’ils sont exécutables et qu’ils sont en
attente d’une E/S de page. Les processus en attente d’événements et les processus
suspendus ne sont pas considérés actifs, pas plus que le processus d’attente.
Les processus suspendus peuvent être réintégrés lorsque le système est resté en deçà du
seuil de surcharge pendant n secondes, n étant spécifié par l’indicateur –w. Les processus
sont réintégrés au système sur la base de leur priorité, puis de la durée de leur suspension.
Avant de tester ces valeurs, consultez la section ”Optimisation du contrôle de charge de la
mémoire VMM”, page 7-14.
Paramètre d’incrément de tranche horaire
La commande schedtune permet également de modifier la durée (tranche horaire) pendant
laquelle le système d’exploitation autorise l’exécution d’un processus, avant d’appeler le
répartiteur pour choisir un autre processus à exécuter. Par défaut, cette durée est celle
d’une seule impulsion d’horloge (10 millisecondes). Le cas échéant, indiquez le nombre
d’impulsions supplémentaires souhaitées via l’indicateur –t de la commande schedtune.
Sous AIX version 4.1, ce paramètre ne s’applique qu’aux routines assorties de la politique
de planification SCHED_RR. Reportez-vous à ”Planification des routines de portée
concurrentielle globale ou locale”, page 2-2.
Paramètre d’intervalle de réessai fork()
Si un appel de sous-routine fork() échoue suite à un espace de pagination insuffisant pour
créer un nouveau processus, le système relance l’appel au bout d’un certain délai. Ce délai
est défini par l’indicateur schedtune –f.
Restrictions sur schedtune
Seul l’utilisateur root est habilité à exécuter schedtune. Les modifications effectuées par
le biais de la commande schedtune ne restent en vigueur que jusqu’à la réinitialisation
suivante du système. Pour modifier des paramètres de tranche horaire ou VMM de façon
permanente, placez la commande schedtune appropriée dans /etc/inittab.
Attention : Mal utilisée, cette commande peut induire une détérioration des
performances ou une panne du système d’exploitation. Assimilez bien les sections
concernées avant de modifier des paramètres système via schedtune.
Commandes de contrôle et d’optimisation des performances AIX
A-7
Indicateurs
A défaut d’indicateurs, les valeurs courantes sont imprimées.
–D
Restaure les valeurs par défaut (d=16, e=2, f=10, h=6, m=2, p=4,
r=16, t=0, w=1).
–d n
La quantité de CPU récemment utilisée par chaque processus est
multipliée par d/32 une fois par seconde.
–e n
Indique qu’un processus suspendu récemment puis réintégré peut être
à nouveau suspendu s’il a été actif pendant au moins n secondes.
–f n
Nombre d’impulsions d’horloge (de 10 millisecondes) définissant le
délai avant relance d’un appel fork inabouti par insuffisance d’espace
de pagination. Le système effectue jusqu’à cinq tentatives de relance
de fork.
–h n
Spécifie le critère système global de déclenchement et d’arrêt de la
suspension des processus. La valeur zéro désactive effectivement le
contrôle de charge de la mémoire.
–m n
Définit le niveau minimal de multiprogrammation.
–p n
Spécifie le critère par processus de détermination du processus à
suspendre.
–r n
La quantité de CPU récemment utilisée par un processus est multipliée
par r/32 lorsque la priorité du processus est recalculée.
–t n
Accroît la durée d’une tranche horaire – délai maximal au bout duquel
est planifiée l’exécution d’un autre processus. La durée par défaut est
de 10 millisecondes. Le paramètre n est exprimé en unités de
10 millisecondes. Si n = 0, la durée de la tranche horaire est de
10 millisecondes. Si n = 2, elle est de 30 millisecondes. Sous AIX
version 4.1, ce paramètre ne s’applique qu’aux routines assorties de la
politique de planification SCHED_RR.
–w n
Délai (en secondes) à respecter après la fin d’un emballement, avant
réactivation des processus suspendus.
–?
Affiche une brève description de la commande et de ses paramètres.
Voir aussi
La sous-routine fork.
”Gestion de la mémoire réelle”.
”Optimisation du calcul de la priorité des processus avec schedtune”, page 6-23.
”Optimisation du contrôle de charge de la mémoire VMM”, page 7-14.
A-8
AIX 4.3 Guide d’optimisation
Commande vmtune
Objet
Modifie les paramètres d’exploitation du gestionnaire de mémoire virtuel (VMM) et d’autres
composants d’AIX.
Syntaxe
vmtune [ –b numfsbuf ] [ –B numpbuf ] [ –c numclust ] [ –f minfree ] [ –F maxfree ] [ –k
npskill ] [ –l lrubucket ] [ –M maxpin ] [ –N pd_npages ] [ –p minperm ] [ –P maxperm ] [ –r
minpgahead ] [ –R maxpgahead ] [–u lvm_budcnt] [ –w npswarn ] [–W maxrandwrt]
Description
Le gestionnaire de mémoire virtuelle (VMM) tient à jour la liste de trames de page libres de
la mémoire réelle. Ces trames sont disponibles pour les pages de mémoire virtuelle,
requises pour pallier un défaut de page. Lorsque le nombre de pages de la liste des
disponibilités passe en dessous du seuil spécifié par le paramètre minfree, VMM commence
à voler des pages pour les ajouter à la liste des disponibilités. VMM continue à voler des
pages jusqu’à ce la liste des disponibilités ait au moins le nombre de pages spécifié par le
paramètre maxfree.
Si le nombre de pages de fichier (pages permanentes) en mémoire est inférieur au nombre
spécifié par le paramètre minperm, VMM vole des trames aux pages de fichier ou calculées,
quels que soient les taux de pages déjà référencées (”repages”). Si ce nombre est
supérieur à maxperm, VMM ne vole que des pages de fichier. Entre les deux, VMM ne vole
normalement que des trames de pages de fichier, mais si le taux de pages de fichier déjà
référencées est supérieur à celui des pages calculées, les pages calculées sont également
volées.
Si un processus lit un fichier séquentiellement, la valeur de minpgahead détermine le
nombre de pages à lire par anticipation dès détection de la condition. La valeur de
maxpgahead définit le nombre maximal de pages lues par anticipation, quel que soit le
nombre de lectures séquentielles antérieures.
Sous la version 3.2.5, il est impossible de fixer plus de 80 % de la mémoire réelle. Sous AIX
version 4.1, le paramètre maxpin permet de fixer le pourcentage limite de mémoire fixe.
AIX version 4.1 permet d’optimiser le nombre de systèmes de fichiers bufstructs
(numfsbuf) et la quantité de données traitées par l’algorithme d’écriture différée (numclust).
Sous AIX version 4.1, vous pouvez également modifier les seuils déterminant l’insuffisance
d’espace de pagination. Le paramètre npswarn spécifie le nombre de pages de l’espace de
pagination disponibles, à partir duquel le système commence à avertir les processus que
l’espace de pagination est presque saturé. Le paramètre npskill spécifie le nombre de
Commandes de contrôle et d’optimisation des performances AIX
A-9
pages de l’espace de pagination à partir duquel le système commence à tuer les processus
pour libérer de l’espace.
Seul l’utilisateur root est habilité à exécuter vmune. Les modifications effectuées par le
biais de la commande vmune ne restent en vigueur que jusqu’à la réinitialisation suivante
du système. Pour modifier des paramètres VMM de façon permanente, placez la
commande vmune appropriée dans inittab.
Attention : Mal utilisée, cette commande peut induire une détérioration des
performances ou une panne du système d’exploitation. Avant de modifier des
paramètres système via vmtune, reportez-vous à ”Performances du gestionnaire de
mémoire virtuelle (VMM)”, page 2-5 et à ”Optimisation du remplacement de page VMM”,
page 7-16.
Indicateurs
A-10
–b numfsbuf
Nombre de systèmes de fichiers bufstruct. Valeur par
défaut :
–B numpbuf
Nombre de pbufs utilisés par LVM. Valeur maximale :
Sous AIX version 3, le nombre de pbufs doit parfois être
augmenté sur les systèmes effectuant souvent de vastes
opérations d’E/S séquentielles.
–c numclust
Nombre de grappes de 16 ko traitées en écriture différée.
Valeur par défaut :
–f minfree
Nombre minimal de trames de la liste de disponibilités.
Valeur comprise entre 8 et 204 800.
–F maxfree
Nombre de trames sur la liste de disponibilités à partir
duquel le vol de pages est interrompu. Sa valeur est
comprise entre 16 et 204 800, mais doit être supérieure au
nombre spécifié par minfree d’une valeur au moins égale à
maxpgahead.
–k npskill
Nombre de pages disponibles dans l’espace de pagination,
à partir duquel AIX commence à tuer les processus. Valeur
par défaut :
–l lrubucket
Taille (en pages de 4 ko) du compartiment de
repositionnement de page le moins récemment utilisé (lru).
Il s’agit du nombre de trames de page qui pourront être
examinées en une seule opération en vue de
déchargements possibles lorsqu’une trame libre est
requise. Un nombre peu élevé se traduit par un temps de
latence faible, mais engendre cependant un comportement
quelque peut différent de celui d’un véritable algorithme lru.
La valeur par défaut est de 512 Mo et le minimum est de
256 Mo. L’optimisation de cette option n’est pas conseillée.
–M maxpin
Pourcentage maximal de mémoire réelle susceptible d’être
fixée. Valeur par défaut : Si vous modifiez cette valeur,
veillez à conserver au moins 4 Mo de mémoire non fixe
pour le noyau.
AIX 4.3 Guide d’optimisation
–N pd_npages
Nombre de pages à supprimer d’un coup de la RAM
lorsqu’un fichier est supprimé. Valeur par défaut : la plus
grande taille de fichier possible divisé par la taille de page
(actuellement 4096). Si la taille maximale de fichier est 2
Go, la valeur par défaut de pd_npages est 524288.
Optimiser cette option ne présente d’intérêt que pour les
applications en temps réel.
–p minperm
Point en-deçà duquel les pages de fichier sont protégées
de l’algorithme de page déjà référencées. Cette valeur est
un pourcentage du total de trames de pages de mémoire
réelle du système. La valeur spécifiée doit être supérieure
ou égale à 5.
–P maxperm
Point au-delà duquel l’algorithme de vol de pages ne vole
que des pages de fichier. Cette valeur est un pourcentage
du total de trames de pages de mémoire réelle du système.
La valeur spécifiée doit être supérieure ou égale à 5.
–r minpgahead
Nombre de pages à partir duquel commence la lecture
séquentielle anticipée. Cette valeur doit être une puissance
de 2, comprise entre 0 et 4 096.
–R maxpgahead
Nombre maximal de pages à lire par anticipation. Cette
valeur doit être une puissance de 2, comprise entre 0 et
4 096, supérieure ou égale à minpgahead.
–u lvm_bufcnt
Nombre de tampons LVM pour les E/S physiques brutes.
Valeur par défaut : Valeurs possibles comprises entre 1 et
64. Cette option n’est disponible que sous AIX version 4.1.
–w npswarn
Nombre de pages libres de l’espace de pagination à partir
duquel AIX commence à envoyer le signal SIGDANGER
aux processus. Valeur par défaut :
–W maxrandwrt
Seuil (en pages de 4 ko) d’écritures aléatoires à accumuler
en RAM avant qu’elles soient synchronisées sur disque via
un algorithme d’écriture différée. Ce seuil est défini sur la
base des fichiers.
L’option –W maxrandwrt n’est disponible que sous AIX
version 4.1.3 et ultérieures. La valeur par défaut de
maxrandwrt est 0 (désactivation de l’écriture différée
aléatoire).
Voir aussi
”Performances du gestionnaire de la mémoire virtuelle (VMM)”, page 2-5.
Commandes de contrôle et d’optimisation des performances AIX
A-11
Script pdt_config
Objet
Contrôle les opérations de l’outil PDT (Performance Diagnostic Tool).
Syntaxe
pdt_config
Description
Le script pdt_config est interactif. Appelé, il affiche le menu :
# /usr/sbin/perf/diag_tool/pdt_config
________________PDT customization menu__________________
1) show current PDT report recipient and severity level
2) modify/enable PDT reporting
3) disable
PDT reporting
4) modify/enable PDT collection
5) disable
PDT collection
6) de–install
PDT
7) exit pdt_config
Please enter a number:
Pour sélectionner une option, tapez son numéro et appuyez sur Entrée.
Si le répertoire /usr/sbin/perf/diag_tool ne se trouve pas dans le chemin de recherche, le
script peut être appelé par /usr/sbin/perf/diag_tool/pdt_config.
Seul l’utilisateur root est habilité à exécuter le script pdt_config.
Indicateurs
Aucun.
Voir aussi
Chapitre 12. ”Outil de diagnostic PDT”.
A-12
AIX 4.3 Guide d’optimisation
Script pdt_report
Objet
Génère un compte rendu PDT (Performance Diagnostic Tool) sur la base des informations
historiques actuelles.
Syntaxe
pdt_report
gravité
pdt_report [ severity ]
Description
PDT contrôle régulièrement les performances du système et ajoute les données à une base
de données historique. Normalement, PDT génère un rapport par jour, à une heure définie.
Le script pdt_report crée ce compte rendu sur demande. Le compte rendu est écrit sur
stdout. Les messages d’erreur sont dirigés vers stderr.
Les messages issus de PDT peuvent être de gravité 1 à 3 (1 étant le niveau le plus élevé).
Par défaut, seuls les messages de gravité 1 sont intégrés au compte rendu. Mais vous
pouvez commander à pdt_report d’include des messages de moindre gravité.
Si le répertoire /usr/sbin/perf/diag_tool ne se trouve pas dans le chemin de recherche, le
script peut être appelé par /usr/sbin/perf/diag_tool/pdt_report.
Indicateurs
gravité
Niveau de gravité à partir duquel les messages sont intégrés au
rapport. Valeur : de 1 à 3.
Voir aussi
Chapitre 12. ”Outil de diagnostic PDT”.
Commandes de contrôle et d’optimisation des performances AIX
A-13
A-14
AIX 4.3 Guide d’optimisation
Annexe B. Sous-routines liées aux performances
Voici les routines susceptibles d’aider au contrôle et à l’optimisation des performances :
Sous-routines
Fonction
getpri
Détermine la priorité de programmation d’un processus en cours
d’exécution.
getpriority
Détermine la valeur nice d’un processus en cours d’exécution.
getrusage
Extrait des informations sur l’utilisation de ressources système.
nice
Incrémente la valeur nice du processus courant.
psdanger
Extrait des informations sur l’utilisation de l’espace de pagination.
setpri
Attribue une priorité fixe à un processus en cours d’exécution.
setpriority
Définit la valeur nice d’un processus en cours d’exécution.
Voir aussi
”Commandes de contrôle et d’optimisation des performances AIX”
Sous-routines liées aux performances
B-1
B-2
AIX 4.3 Guide d’optimisation
Annexe C. Mémoire cache et adressage
Une exploitation efficace des caches constituant un élément essentiel des performances
d’un processeur, les développeurs de logiciels ont intérêt à bien maîtriser les techniques de
codage, envisagées sous l’angle de l’utilisation du cache. Bien comprendre cet aspect du
problème suppose quelques connaissances sur les architectures de cache ESCALA.
Préliminaire
Les sections qui suivent s’adressent aux programmeurs soucieux de connaître l’impact de
la mise en mémoire cache et de l’adressage virtuel sur les performances de leurs
programmes. Les ingénieurs intéressés par la logique électronique et la conception précise
du ESCALA n’y trouveront sans doute pas leur compte : cette présentation ne prétend pas
à l’exhaustivité et la distinction entre les architectures POWER, PowerPC et POWER2 en
est quasiment absente.
Adressage
La figure ”Transformations successives d’une adresse mémoire” (section ”Consultation du
cache”) illustre les étapes par lesquelles une adresse 32 bits en mémoire virtuelle, générée
par un programme, se transforme en adresse mémoire réelle. Le nombre exact de bits varie
selon le modèle. Les modèles diffèrent dans leurs détails, mais pas dans le principe de leur
conception.
Mémoire cache et adressage
C-1
adresse 32 bits générée par le programme
registre de segment 15
.
.
.
.
4 bits
(numéro registre segment)
28 bits
(décalage
dans
segment)
24 bits
(ID segment)
registre de segment 0
8 bits
adresse
virtuelle 52 bits
Consultation
cache de
données
Nº ligne étiquette
étiquette
8 bits
37 bits
7 bits
absence en
cache D
Consultation
cache L2
adresse virtuelle 52 bits
étiquette
32 bits
Accès
mémoire
réelle
étiquette
Nº ligne
13 bits
7 bits
absence en
cache L2
adresse virtuelle 52 bits
étiquette TLB
32 bits
Nº TLB décalage page
8 bits
40 bits en
entrée
12 bits
Consultation
du TLB
translation
d’adresse
20 bits en
sortie
adresse réelle 32 bits
Adresse réelle de page décalage page
20 bits
12 bits
Transformations successives d’une adresse mémoire
Lorsqu’un programme demande le chargement d’un registre avec le contenu d’une portion
de la mémoire, l’emplacement mémoire est spécifié par le biais d’une adresse virtuelle de
32 bits. Les 4 bits supérieurs de cette adresse servent à indexer le bloc de registres de
16 segments. Les registres de segment, maintenus par le système d’exploitation,
contiennent à tout moment l’ID segment de 24 bits affecté au processus en cours
d’exécution. Ces ID segment sont uniques, à moins qu’un processus ne partage un
segment avec un ou plusieurs autres processus. L’ID segment 24 bits du registre de
segment sélectionné est combiné avec les 28 bits inférieurs de l’adresse des données pour
former l’adresse virtuelle 52 bits de l’élément de données à charger. Le décalage dans le
segment étant de 28 bits, chaque segment a une longueur de 256 Mo.
C-2
AIX 4.3 Guide d’optimisation
Consultation du cache
L’adresse virtuelle 52 bits est utilisée pour la consultation du cache de données, comme
illustré à la figure ”Consultation d’un cache de données”. Les lignes du cache ayant une
longueur de 128 octets, les 7 bits inférieurs de l’adresse représentent le décalage à
l’intérieur de la ligne du cache. Le cache de données, qui contient 128 ko d’espace, est
associatif à quatre voies. Chaque bloc du cache contient ainsi 256 lignes de 128 octets
(128 ko/(128*4) = 256), et les 8 bits supérieurs suivants représentent le numéro de
ligne (0-255). Chaque bloc du cache possède une ligne portant ce numéro, et les quatre
lignes dotées du même numéro forment une classe de congruence, c’est-à-dire les quatre
emplacements possibles des données cherchées. Il s’agit d’un cache associatif à quatre
voies. Si la classe de congruence comportait deux membres, nous aurions parlé d’un cache
associatif à deux voies. S’il y avait exactement une ligne de cache par adresse, le cache
serait dit en mappage direct.
adresse virtuelle 52 bits
étiquette
Nº ligne étiquette
37 bits
8 bits
7 bits
bloc 0
bloc 1
bloc 2
bloc 3
étiquette
étiquette
étiquette
étiquette
données
données
données
données
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
ligne 0
ligne 1
ligne 2
.
.
.
.
Classe de
congruence
ligne 253
ligne 254
ligne 255
consultation cache données
A chaque ligne du cache est associée une étiquette de 37 bits, constituée des bits
supérieurs de l’adresse 52 bits à partir de laquelle la ligne cache a été chargée à l’origine.
Si une des étiquettes des quatre lignes de l’ensemble de congruence correspond aux
37 bits supérieurs de l’adresse virtuelle 52 bits qui vient d’être générée, il y a présence en
cache. Les données de la ligne sont chargées dans le registre, et aucun accès RAM
(et donc aucune adresse réelle) n’est requis.
Si aucune des étiquettes de l’ensemble de congruence ne correspond à l’étiquette des
données à charger, il y a absence de données en cache. Cette machine comporte un cache
L2 : la consultation d’un cache est semblable à celle effectuée dans un cache de données.
La principale différence entre les deux consultations de caches est que le cache L2 est en
mappage direct. Les lignes ont une longueur de 128 octets, et le cache offre une capacité
de 1 Mo : il y a donc 8192 lignes. Les 7 bits inférieurs de l’adresse 52 bits constituent
toujours le décalage dans la ligne. Les 13 bits suivants constituent le numéro de la ligne du
cache. A chaque ligne est associée une étiquette 32 bits unique. Si cette étiquette
correspond aux 32 bits supérieurs de l’adresse 52 bits, il y a présence en cache L2. Sinon,
l’adresse réelle des données doit être déterminée et les données extraites de la RAM.
Différentes implantations des architectures POWER présentent des caches de taille et de
géométrie variables ; certaines sont dépourvues de cache L2, d’autres sont dotées de
caches combinant instructions et données, d’autres encore ont des longueurs de lignes
différentes. Taille et position des champs de l’adresse 52 bits peuvent différer quelque peu,
mais les principes de consultation du cache restent les mêmes.
Mémoire cache et adressage
C-3
Consultation du TLB
Le tampon de données TLB (translation lookaside buffer) est un cache d’adresses.
L’étiquette TLB est constituée des 32 bits supérieurs de l’adresse virtuelle 52 bits. Les 8 bits
suivants de cette adresse indiquent le numéro de ligne dans le TLB, qui a 512 entrées et
constitue un ensemble associatif à deux voies (chaque bloc est ainsi constitué de
256 entrées). Les 12 bits inférieurs de l’adresse 52 bits définissent le décalage dans la page
de 4096 octets. La partie données de chaque ligne du TLB constitue les 20 bits supérieurs
de l’adresse de page réelle 32 bits (voir la figure ”Consultation du TLB de données”). S’il y a
présence en TLB, les 20 bits supérieurs de l’entrée TLB sont combinés avec les 12 bits
inférieurs du décalage de page, pour former l’adresse réelle 32 bits des données.
adresse virtuelle 52 bits
Nº ligne
étiquette
32 bits
étiq0
page réelle
adresse
.
.
étiq1
.
8 bits
décal.
page
12 bits
page réelle
adresse
.
Classe de
congruence
.
.
.
.
32 bits
20 bits
32 bits
20 bits
Consultation du TLB de données
En cas d’absence en TLB, le matériel détermine l’adresse réelle des données en faisant
appel aux tableaux de pages, via un algorithme (qui n’entre pas dans le cadre de ce
manuel). Cette opération consomme plusieurs dizaines de cycles processeur. Une fois
calculée l’adresse réelle 32 bits, la portion adresse de page (20 bits) est mise en mémoire
cache dans l’entrée TLB ad hoc, et l’étiquette de cette entrée, mise à jour en conséquence.
Accès RAM
Quel que soit le moyen utilisé pour l’obtenir, l’adresse 32 bits réelle des données sert à
émettre une requête à la RAM. Normalement, un délai de latence d’au moins huit cycles
processeur intervient entre l’émission de la requête et le renvoi des 16 premiers octets de
données (128 bits, correspondant à la largeur du bus mémoire), incluant les données en
cours de chargement. A ce stade, le processeur peut reprendre ses opérations. L’accès
RAM se poursuit pendant encore sept cycles processeur, pour charger la ligne complète de
cache (128 octets, par tranches de 16 octets). Ainsi, une absence en cache mobilise au
moins 16 cycles processeur. L’étiquette de la ligne de cache est mise à jour via les 37 bits
supérieurs de l’adresse des données. Le contenu initial de la ligne de cache est perdu.
C-4
AIX 4.3 Guide d’optimisation
Implications
Plusieurs types de schémas d’adressage pathologique peuvent provoquer d’incessantes
absences en cache ou en TLB, ralentissant notablement la vitesse d’exécution. Si, par
exemple, le programme accède à un tableau plus grand que le cache, l’écart étant
d’exactement 128 octets, une absence en cache aura lieu à chaque accès. Si le programme
présente au processeur une série de requêtes concernant le même numéro de ligne cache,
mais dans des pages différentes, une série de collisions entre ensembles de congruence se
produiront, entraînant de nombreuses absences en cache même si celui-ci n’est pas saturé.
Le fait que le cache soit associatif à quatre voies rend cette éventualité assez improbable,
mais il suffit d’un choix malheureux de décalages pour les éléments de données pour
ralentir considérablement un programme.
Les grands tableaux peuvent également être à l’origine de problèmes. La figure
”Stucture d’un tableau en mémoire” illustre le stockage de tableaux en C et en FORTRAN.
Les tableaux C sont basés sur les rangées, tandis que les tableaux FORTRAN le sont sur
les colonnes. Si une boucle interne d’un programme C indexe par colonne (ou par rangée
pour un programme FORTRAN), un tableau assez grand (512 x 512 en virgule flottante
double précision, par exemple) peut provoquer une absence en TLB sur chaque accès.
Pour en savoir plus sur ces phénomènes, reportez-vous à ”Exemple théorique”, page 6-10.
Tableau FORTRAN
colonne 1
colonne 2
.
.
.
.
colonne n
.
rangée n
Tableau C
rangée 1
rangée 2
.
.
.
Structure d’un tableau en mémoire
Mémoire cache et adressage
C-5
C-6
AIX 4.3 Guide d’optimisation
Annexe D. Commande ld
L’éditeur de liens AIX (appelé à l’étape finale d’une compilation ou directement via la
commande ld) offre des fonctions non proposées par l’éditeur de liens UNIX classique.
Il peut en résulter un délai d’édition de liens plus long, si la puissance de l’éditeur AIX est
inexploitée. Cette annexe présente quelques techniques permettant de l’exploiter au mieux.
Exécutables rééditables
La documentation de l’éditeur de liens fait référence à sa capacité d’accepter un exécutable
(un module chargeable) comme entrée. Cette fonction peut sensiblement améliorer les
performances d’un système où le développement de logiciels constitue une part importante
de l’activité, ainsi que les temps de réponse des ld individuels.
Sur la majorité des systèmes UNIX classiques, l’entrée de la commande ld est toujours
constituée d’un ensemble de fichiers contenant du code objet, fichiers individuels .o ou
fichiers .o archivés en bibliothèque. La commande ld résout ensuite les références externes
de ces fichiers et écrit un exécutable portant par défaut le nom a.out. Le fichier a.out ne
peut être qu’exécuté. Si une erreur est détectée dans l’un des modules intégrés au fichier
a.out, il faut modifier et recompiler le code source défectueux, puis répéter l’intégralité du
processus ld, à partir de l’ensemble complet de fichiers .o.
Sous AIX, l’éditeur de liens accepte en entrée aussi bien les fichiers .o que les fichiers
a.out, car l’éditeur intègre les dictionnaires de résolution ESD (External Symbol Dictionary)
et RLD (Relocation Dictionary), dans le fichier exécutable. Ce qui signifie que l’utilisateur
peut rééditer les liens d’un exécutable existant pour remplacer un seul fichier .o modifié, au
lieu de reconstruire un nouvel exécutable depuis le début. Le processus d’édition
consommant des cycles processeur et de l’espace de stockage en partie
proportionnellement au nombre de fichiers faisant l’objet d’un accès et au nombre de
références aux symboles à résoudre, rééditer les liens d’un exécutable avec une nouvelle
version d’un seul module est bien plus rapide que de repartir du début.
Bibliothèques de sous-routines prééditées
Dans certains environnements, la capacité de prééditer les liens de l’intégralité d’une
bibliothèque de sous-routines est tout aussi importante. Les bibliothèque de
sous{TAG}routines du système telles que libc.a sont, en effet, livrées en format d’édition de
sortie, et non sous forme d’un fichier archive de fichiers .o . L’utilisateur gagne de ce fait un
temps considérable de traitement lorsqu’il édite les liens d’une application avec les
bibliothèques système requises, dans la mesure où seules les références de l’application
aux sous–routines de la bibliothèque doivent être résolues. Les références entre routines de
bibliothèques système ont été d’ores et déjà résolues au cours du processus de constitution
du système.
Nombre de bibliothèques de sous-routines tierces sont toutefois souvent livrées sous forme
d’archive de fichiers .o bruts. Lorsqu’un utilisateur édite les liens d’une application avec des
bibliothèques de ce type, l’éditeur de liens doivent résoudre les symboles de toute la
bibliothèque à chaque édition de liens de l’application. L’opération est d’autant plus longue
si les bibliothèques sont volumineuses et les machines peu puissantes.
L’écart de performance entre des bibliothèques prééditées et non prééditées est énorme,
notamment sur de petites configurations. Avec préédition de la bibliothèque de
sous-routines, l’édition des liens du programme FORTRAN est tombée à environ
1,7 minute. Lorsque le fichier a.out résultat a été soumis à une nouvelle édition de liens
Commande ld
D-1
avec un nouveau fichier FORTRAN .o, pour simuler une correction d’erreur, le délai est
passé à environ 4 secondes.
Exemples
1. Pour prééditer les liens d’une bibliothèque, lancez la commande suivante sur le fichier
archive :
ld –r libfoo.a –o libfooa.o
2. Compiler et éditer les liens du programme FORTRAN something.f revient alors à :
xlf something.f libfooa.o
Notez que la bibliothèque prééditée est traitée comme un fichier d’entrée normal, et non
avec la syntaxe habituelle d’identification des bibliothèques (–lfoo).
3. Pour recompiler le module et rééditer les liens de l’exécutable après correction d’une
erreur, lancez :
xlf something.f a.out
4. Si, toutefois, la correction de l’erreur a conduit à l’appel d’une autre sous-routine de la
bibliothèque, l’édition de liens n’aboutira pas. Le script shell Korn suivant teste le retour
d’un code d’erreur et y remédie :
# !/usr/bin/ksh
# Shell script for source file replacement bind
#
xlf something.f a.out
rc=$?
if [ ”$rc” != 0 ]
then
echo ”New function added ... using libfooa.o”
xlf something.o libfooa.o
fi
Voir aussi
Commande ld.
Format de fichier Objet XCOFF (a.out).
D-2
AIX 4.3 Guide d’optimisation
Annexe E. Outils de performance
De temps en temps, le groupe Performance AIX se voit demander des précisions sur la
”surcharge” occasionnée par les outils de performance. C’est une question intéressante,
dans la mesure où certains outils ont une répercussion certaine sur la charge du système.
C’est également une question à laquelle il est difficile de répondre, car le coût induit par la
plupart des outils est souvent proportionnel à un aspect particulier de la charge du système.
Les sections suivantes proposent des considérations succintes et informelles sur la vitesse
et les ressources utilisées par les principaux outils de contrôle et d’optimisation. Ces
considérations visent à donner une idée du coût relatif des différents outils : elles ne
constituent pas une description rigoureuse des performances des outils.
filemon
L’essentiel de la charge de filemon sur le système est contituée de temps
CPU. Dans un environnement saturé au niveau de la CPU avec peu d’E/S,
filemon a ralenti une longue compilation d’environ 1 %. Dans un
environnement saturé au niveau du CPU avec un fort taux de sorties
disque, filemon a ralenti le programme d’écriture d’environ 5 %.
fileplace
La plupart des variantes de cette commande utilisent moins de
0,3 seconde de temps CPU.
iostat
Cette commande utilise environ 20 millisecondes de temps CPU pour
chaque compte rendu périodique généré.
lsattr
Cette commande est limitée au niveau des E/S. A sa première exécution,
elle peut demander entre 2 et 4 secondes pour lire les données requises.
Les exécutions suivantes, sur un système peu chargé, consomment
environ 0,5 seconde de temps CPU.
lslv
Cette commande est limitée au niveau de la CPU. Par exemple, la
commande :
lslv –p hdisk0 hd1
consomme environ 0,5 seconde de temps CPU.
netpmon
Avec une charge modérée, orientée réseau, netpmon augmente la
consommation de CPU de 3 à 5 %. Dans un environnement saturé au
niveau du CPU avec peu d’E/S, netpmon a ralenti une longue compilation
d’environ 3,5 %.
netstat
La plupart des variantes de cette commande utilisent moins de
0,2 seconde de temps CPU.
nfsstat
La plupart des variantes de cette commande utilisent moins de
0,1 seconde de temps CPU.
PDT
La collecte quotidienne des données prend plusieurs minutes, mais
l’essentiel de ce temps est du temps de ”veille”. La consommation réelle
de CPU ne dépasse généralement pas 30 secondes.
ps
Le temps CPU consommé par cette commande dépend du nombre de
processus à afficher, mais ne dépasse généralement pas 0,3 seconde.
svmon
La commande svmon –G consomme environ 3,2 secondes de temps
CPU. Une commande svmon pour un seul processus (svmon –P
id-processus) consomme environ 0,7 seconde de temps CPU.
Outils de performance
E-1
E-2
tprof
tprof utilisant trace, il peut quelque peu surcharger le système. tprof
n’active toutefois qu’un point d’ancrage de suivi, la surcharge induite est
donc moindre que lors d’un suivi complet. Par exemple, tprof a provoqué
une baisse de performance d’environ 2 % pour une longue compilation.
trace
La surcharge induite par trace dépend largement de la charge du système
et du nombre d’ID de points d’ancrage collectés. A l’extrême, un travail
long et très mobilisateur de CPU, exécuté sur un système libre par ailleurs,
est rallongé d’environ 3,2 % si trace est actif et que tous les points
d’ancrage le sont aussi.
vmstat
Cette commande utilise environ 40 millisecondes de temps CPU pour
chaque compte rendu généré. La commande vmstat –s consomme
environ 90 millisecondes de temps CPU.
AIX 4.3 Guide d’optimisation
Annexe F. Gestion de la mémoire des applications
AIX a été doté, à partir de la version 3.2, d’un nouvel algorithme de gestion de la mémoire,
qui est resté en vigueur avec la version 4. L’algorithme précédent, largement exploité sur
les systèmes UNIX, arrondissait la taille de toutes les requêtes malloc à la puissance de 2
immédiatement supérieure. Il en résultait une fragmentation considérable de la mémoire
– réelle et virtuelle – et un faible regroupement référentiel. Le nouvel algorithme affecte la
quantité exacte d’espace requis et est plus efficace pour ce qui concerne la récupération
des blocs mémoire précédemment utilisés.
Malheureusement, un certain nombre de programmes d’application existants dépendent du
précédent algorithme – au niveau de leurs performances ou même de leur fonctionnement.
Par exemple, si un programme dépend de l’espace supplémentaire fourni par l’opération
d’arrondi, car il déborde en réalité de la fin d’un tableau, il échouera probablement avec la
version 3.2 de malloc.
Autre exemple : du fait de l’inefficacité de la récupération d’espace de la routine de la
version 3.1, le programme d’application reçoit presque toujours de l’espace qui a été
réinitialisé à zéro (lorsqu’un processus touche une page donnée de son segment de travail
pour la première fois, cette page est définie à zéro). L’exécution des applications peut
dépendre de cet effet secondaire. En fait, la mise à zéro de l’espace affecté n’est pas une
fonction propre à malloc et entraîne une pénalité non justifiée au niveau des performances,
pour les programmes qui n’initialisent que lorsque requis et peut-être pas à zéro.
La version 3.2 de malloc étant plus efficace au niveau de la réutilisation de l’espace, les
programmes dépendant de la réception de malloc d’espace mis à zéro échoueront
probablement avec les versions 3.2 et ultérieures du système.
De même, si un programme réaffecte (via realloc) continuellement une structure dans une
zone de taille légèrement supérieure, dans la version 3.1, realloc peut ne pas avoir besoin
de déplacer souvent la structure. Souvent, realloc peut faire usage de l’espace
supplémentaire fourni par l’opération d’arrondi. Sous la version 3.2, realloc aura
généralement à déplacer la structure vers une zone légèrement plus grande, parce que
quelque chose d’autre a été affecté (via malloc) juste au-dessus. Ceci explique l’apparente
dégradation des performances de realloc, alors qu’il s’agit en réalité de l’émergence d’un
coût implicite dans la structure du programme d’application.
Nous avons bien entendu prévu le cas où des programmes AIX existants, ou portés à partir
d’autres systèmes UNIX, dépendent d’effets secondaires de la version 3.1 de la
sous-routine malloc. Dans ces cas, l’algorithme de la version 3.1 peut être rappelé via :
MALLOCTYPE=3.1; export MALLOCTYPE
A partir de là, tous les programmes exécutés par le shell utiliseront la version antérieure de
la sous-routine malloc. Donner à MALLOCTYPE une valeur autre que 3.1 provoque le
retour à la version 3.2.
Voir aussi
Sous-routines malloc et realloc.
Gestion de la mémoire des applications
F-1
F-2
AIX 4.3 Guide d’optimisation
Annexe G. Bibliothèques partagées
Partager une bibliothèque offre parfois l’occasion de négocier mémoire et temps de
traitement.
Avantages et inconvénients
Partager une bibliothèque signifie disposer d’une seule copie des routines les plus utilisées
et maintenir cette copie dans un segment partagé unique. Ce qui peut réduire de façon
significative la taille des exécutables, et économiser ainsi de l’espace disque. En outre,
dans la mesure où ces routines sont exploitées par plusieurs processus dans un
environnement multi-utilisateur, une routine que vous appelez pour la première fois peut
déjà se trouver en mémoire réelle : vous gagnez ainsi le temps de chargement
correspondant et économisez la trame de page requise. Autre avantage, les routines ne
sont pas liées à l’application de façon statique, mais dynamiquement au chargement de
l’application. Ce qui permet aux applications d’hériter automatiquement des modifications,
sans recompilation ou réédition des liens.
Partager une bibliothèque peut néanmoins présenter quelques inconvénients. Du point de
vue des performances, un ”code collant” est requis dans l’exécutable pour accéder au
segment partagé. Ce code ajoute un nombre de cycles par appel à un segment de
bibliothèque partagée. Plus subtile est la réduction du ”regroupement référentiel”. Si seul un
nombre restreint de routines vous intéressent, vous risquez de les trouver dispersées dans
l’espace d’adressage virtuel de la bibliothèque : le nombre de pages auxquelles vous devez
alors accéder pour appeler les routines est notablement supérieur à ce qui aurait été le cas
si les routines avaient été directement liées à l’exécutable. Une des conséquences est que,
si vous êtes le seul utilisateur de ces routines, vous vous heurterez à davantage de défauts
de page pour les charger toutes en mémoire réelle. En outre, dans la mesure où davantage
de pages sont touchées, la probabilité d’une absence d’instruction en TLB
(translation lookaside buffer) est plus grande.
Définition d’exécutables partagés ou non
Par défaut, la commande cc est associée à l’option de bibliothèque partagée. Pour passer
outre cette valeur, spécifiez l’option –bnso comme suit :
cc xxx.c –o xxx.noshr –O –bnso –bI:/lib/syscalls.exp
Choix de l’option appropriée
A l’évidence, le plus simple pour déterminer si une application est sensible au partage des
bibliothèques est de recompiler l’exécutable avec l’option de non-partage. Si les
performances s’améliorent notablement, il vous appartient de décider si cette amélioration
vaut d’abandonner les autres avantages du partage des bibliothèques. Veillez à mesurer les
performances dans un environnement réel : un programme édité en mode non partagé peut
être exécuté plus rapidement comme instance simple sur une machine faiblement chargée.
Ce même programme, exploité simultanément par plusieurs utilisateurs, peut suffisamment
augmenter la consommation de mémoire réelle pour ralentir l’ensemble de la charge de
travail.
Bibliothèques partagées
G-1
Voir aussi
Shared Libraries and Shared Memory dans AIX General Programming Concepts : Writing
and Debugging Programs.
G-2
AIX 4.3 Guide d’optimisation
Annexe H. Accès à l’horloge du processeur
Les tentatives de mesure, sous AIX, d’intervalles de temps minimes se heurtent souvent à
l’activité d’arrière-plan intermittente du sytème d’exploitation et à la mobilisation de temps
de traitement par les routines du système. Une solution à ce problème consiste à accéder
directement à l’horloge du processeur pour déterminer le début et la fin des mesures
interrompues, à effectuer les mesures plusieurs fois et à filtrer le résultat pour éliminer les
périodes coupées par des interruptions.
Dans les architectures POWER et POWER2, l’horloge du processeur est implantée comme
paire de registres spéciaux. L’architecture PowerPC définit un registre 64 bits appelé base
horaire. Ces registres ne sont accessibles qu’aux programmes en assembleur.
Attention : Les durées mesurées par l’horloge du processeur correspondent à des
temps absolus. Si une interruption se produit dans l’intervalle, la durée calculée inclut
celle du traitement de cette interruption et, éventuellement, celle d’autres processus,
avant que le contrôle ne revienne au code chronométré. Autrement dit, la durée issue de
l’horloge processeur est une durée brute, qu’il ne faut pas utiliser sans vérification.
Sous AIX version 4.1, une paire de sous-routines de bibliothèque a été ajoutée au système
pour faciliter l’accès à ces registres et le rendre indépendant de l’architecture. Il s’agit des
routines read_real_time et time_base_to_time. La sous-routine read_real_time extrait
l’heure courante de la source ad hoc et la stocke sous forme de deux valeurs de 32 bits.
La sous-routine time_base_to_time vérifie que l’heure est exprimée en secondes et
nanosecondes, exécutant au besoin les conversions nécessaires à partir du format base
horaire. La séparation des deux fonctions (obtention de l’heure et conversion) a pour but de
minimiser la charge d’obtention de l’heure.
L’exemple suivant illustre l’utilisation de ces routines pour mesurer le délai d’exécution d’une
portion spécifique de code :
#include <stdio.h>
#include <sys/time.h>
int main(void) {
timebasestruct_t start, finish;
int val = 3;
int w1, w2;
double time;
/* get the time before the operation begins */
read_real_time(&start, TIMEBASE_SZ);
/* begin code to be timed */
printf(”This is a sample line %d \n”, val);
/* end code to be timed
*/
/* get the time after the operation is complete
read_real_time(&finish, TIMEBASE_SZ);
/* call the conversion routines unconditionally, to ensure
*/
/* that both values are in seconds and nanoseconds regardless */
/* of the hardware platform.
*/
time_base_to_time(&start, TIMEBASE_SZ);
time_base_to_time(&finish, TIMEBASE_SZ);
/* subtract the starting time from the ending time */
w1 = finish.tb_high – start.tb_high; /* probably zero */
w2 = finish.tb_low – start.tb_low;
Accès à l’horloge du processeur
H-1
/* if there was a carry from low–order to high–order during
/* the measurement, we may have to undo it.
if (w2 < 0) {
w1––;
w2 += 1000000000;
}
*/
*/
/* convert the net elapsed time to floating point microseconds */
time = ((double) w2)/1000.0;
if (w1 > 0)
time += ((double) w1)*1000000.0;
printf(”Time was %9.3f microseconds \n”, time);
exit(0);
}
Pour réduire la charge d’appel et de retour des routines d’horloge, l’analyste peut essayer
de lier les références de jeux d’essais non partagées (voir Annexe G).
S’il s’agit d’évaluer des performances réelles, vous pouvez exécuter plusieurs fois le code à
mesurer. Si vous avez chronométré ensemble un certain nombre de répétitions
consécutives, vous pouvez calculer le temps moyen, sachant qu’il risque d’inclure le temps
de traitement d’interruptions ou d’autres activités. Si les répétitions ont été chronométrées
individuellement, étudiez les délais pour évaluer s’il sont ”raisonnables”, mais pensez que le
temps d’exécution des routines de chronométrage est inclus dans chaque mesure. Vous
pouvez utiliser les deux techniques et comparer les résultats. En tout état de cause, le choix
d’une méthode dépend beaucoup de l’objectif des mesures.
Accès à l’horloge unique d’une architecture POWER
Attention : Les sections qui suivent ne s’appliquent qu’aux architectures POWER et
POWER2 (et au microprocesseur 601). Les exemples de code fonctionnent
correctement sur un système PowerPC (ils ne se ”planteront” pas), mais certaines
instructions ne seront que simulées. Dans la mesure où l’accès à l’horloge du
processeur a pour but de mesurer des durées très précises avec une faible charge, les
résultats ainsi obtenus sont de peu d’utilité.
Les architectures de processeur POWER et POWER2 comportent deux registres spéciaux
(un registre supérieur et un registre inférieur) qui contiennent une horloge haute résolution.
Le registre supérieur contient le temps en secondes et le registre inférieur, un décompte
des fractions de seconde, en nanosecondes. La précision réelle du registre inférieur dépend
de la fréquence de sa mise à jour, qui est spécifique du modèle.
Routines assembleur d’accès aux registres d’horloge POWER
Le module en assembleur suivant (timer.s) fournit des routines (rtc_upper et
rtc_lower) d’accès aux registres supérieur et inférieur de l’horloge.
H-2
.globl
.rtc_upper: mfspr
br
.rtc_upper
3,4
# copy RTCU to return register
.globl
.rtc_lower: mfspr
br
.rtc_lower
3,5
# copy RTCL to return register
AIX 4.3 Guide d’optimisation
Sous-routine C indiquant l’heure en secondes
Le module ci-dessous (second.c) contient une routine C qui appelle les routines timer.s
pour accéder au contenu des registres supérieur et inférieur, et qui retourne l’heure en
secondes, sous forme d’une valeur réelle double précision.
double second()
{
int ts, tl, tu;
ts
tl
tu
if
= rtc_upper();
/* seconds
= rtc_lower();
/* nanoseconds
= rtc_upper();
/* Check for a carry from
(ts != tu)
/* the lower reg to the upper.
tl = rtc_lower();
/* Recover from the race condition.
return ( tu + (double)tl/1000000000 );
*/
*/
*/
*/
*/
}
La sous-routine second peut être appelée par une routine C ou FORTRAN.
Remarque : La précision de second.c peut varier en fonction du temps écoulé depuis la
dernière réinitialisation du système. Plus long est ce délai, plus élevé est le nombre de
bits de précision consommée par la partie ”secondes entières” du nombre. La technique
indiquée au début de cette annexe évite le problème en effectuant la soustraction
requise pour obtenir le délai écoulé avant conversion en virgule flottante.
Accès aux registres d’horloge dans les systèmes PowerPC
L’architecture du processeur PowerPC comporte un registre de base horaire de 64 bits,
logiquement divisé en deux champs (supérieur et inférieur) de 32 bits (TBU et TBL).
La fréquence d’incrémentation de ce registre dépend de l’implantation logicielle et
matérielle, et peut parfois varier. Convertir les valeurs de la base horaire en secondes est
une tâche bien plus complexe que dans une architecture POWER. Nous vous conseillons
vivement d’utiliser les interfaces read_real_time et time_base_to_time pour obtenir la
valeur d’horloge des systèmes PowerPC.
Exemple d’utilisation de la routine second
Voici un exemple (main.c) de programme C faisant appel à la sous–routine second :
#include <stdio.h>
double second();
main()
{
double t1,t2;
t1 = second();
my_favorite_function();
t2 = second();
printf(”my_favorite_function time: %7.9f\n”,t2 – t1);
exit();
}
Accès à l’horloge du processeur
H-3
Voici un exemple (main.f) de programme FORTRAN faisant appel à la sous–routine
second :
double precision t1
double precision t2
11
t1 = second()
my_favorite_subroutine()
t2 = second()
write(6,11) (t2 – t1)
format(f20.12)
end
Pour compiler et exploiter main.c ou main.f, utilisez :
xlc –O3 –c second.c timer.s
xlf –O3 –o mainF main.f second.o timer.o
xlc –O3 –o mainC main.c second.o timer.o
H-4
AIX 4.3 Guide d’optimisation
Annexe I. Support NLS (National Language Support)
Le support AIX NLS (National Language Support) facilite l’exploitation d’AIX dans différents
environnements de langues. L’utilisation de NLS n’étant pas sans conséquence sur les
performances du système, nous allons en présenter les principales caractéristiques.
NLS permet d’adapter AIX en fonction de la langue et de l’environnement culturel de
l’utilisateur. Un environnement local, qui combine une langue et un ensemble de spécificités
géographiques ou culturelles, est identifié par un nom composé, tel que en_US
(anglais américain). A chaque environnement local, sont associés un ensemble de
catalogues de messages, des tables de tri et d’autres informations définissant les
spécificités de l’environnement. A l’installation d’AIX, l’administrateur système décide des
informations locales à installer. Par la suite, les utilisateurs peuvent les adapter à chaque
shell en modifiant les variables LANG et LC_ALL.
Le seul environnement local ne répondant pas à la structure ci-dessus est
l’environnement C (ou POSIX). Il s’agit de l’environnement par défaut (utilisé si aucun autre
n’est explicitement sélectionné). C’est également l’environnement dans lequel est lancé
chaque processus nouvellement généré. Une exécution dans l’environnement C équivaut
presque, sous AIX, à une exécution dans l’environnement originel, unilingue, d’UNIX.
Il n’existe pas de catalogues de messages C : les programmes qui tentent d’obtenir un
message d’un catalogue reçoivent le message par défaut compilé dans le programme.
Certaines commandes, telle sort, reviennent à leurs algorithmes d’origine, spécifiques de
leur jeu de caractères.
Selon nos mesures, les performances de NLS relèvent de trois niveaux possibles.
L’environnement C est généralement le plus rapide pour l’exécution des commandes, suivi
des environnements mono-octets (alphabet latin), tels que en_US, les environnements
multioctets étant les plus lents.
Remarques sur la programmation
Historiquement, le langage C a souffert d’une certaine confusion entre les mots octet et
caractère. Ainsi un tableau déclaré comme char foo[10] est un tableau de 10 octets. Or,
toutes les langues ne sont pas composées de caractères transcriptibles par un seul octet.
Le japonais et le chinois, par exemple, requièrent au moins deux octets par caractère. C’est
pourquoi, sous AIX, la distinction est faite entre un octet (8 bits de données) et un caractère
(quantité d’informations requises pour représenter un caractère).
Deux des caractéristiques d’un environnement local sont le nombre maximal d’octets requis
pour représenter un caractère et le nombre maximal de positions affichables en sortie qu’un
caractère peut occuper. Ces valeurs peuvent être obtenues via les macros MB_CUR_MAX
et MAX_DISP_WIDTH. Si ces deux valeurs sont égales à 1, l’équivalence entre octet et
caractère est pertinente dans cet environnement. Si l’une des deux valeurs est supérieure
à 1, les programmes effectuant un traitement caractère par caractère, ou gardant trace du
nombre de positions d’affichage, devront recourir aux fonctions d’internationalisation.
Dans la mesure où les codages multioctet comportent un nombre variable d’octets par
caractère, ils ne peuvent être traités comme des tableaux de caractères. Pour programmer
efficacement dans le cas où chaque caractère doit être traité, un type de données à taille
d’octet fixe, wchar_t, a été défini. Une donnée de type wchar_t est suffisamment grande
pour contenir le format converti de n’importe quel caractère codé. Les programmeurs
peuvent ainsi déclarer des tableaux de wchar_t et les traiter de façon grosso modo
équivalente à un tableau de type char, en utilisant les analogies avec les caractères
étendus des fonctions libc classiques. Malheureusement, la conversion du format multioctet
Support NLS (National Language Support)
I-1
(dans lequel le texte est rédigé, enregistré sur disque ou saisi à l’écran) au format wchar_t,
est relativement coûteuse. Il convient donc de ne recourir au type wchar_t que si l’efficacité
du programme compense largement le coût de la conversion de et vers le format wchar_t.
Quelques règles
Faute de connaître les quelques contraintes qui pèsent sur les jeux de caractères multioctet
et le minimum de fonctions d’internationalisation qui éliminent le problème, vous risquez
d’écrire un programme d’une remarquable lenteur. Voici quelques conseils :
• Dans tous les jeux de caractères pris en charge par BULL, les codes 0x00 à 0x3F sont
uniques et réservés aux caractères ASCII standard. Etre unique signifie ici que ces
combinaisons n’apparaissent jamais comme élément du codage d’un caractère
multioctet. Le caractère nul faisant partie de ce jeu, les fonctions strlen, strcpy et strcat
s’appliquent aux chaînes multi- et mono-octet. Le programmeur ne doit pas oublier que la
fonction strlen renvoie le nombre d’octets de la chaîne et non le nombre de caractères.
• De même, la fonction de chaîne standard strchr(foostr, ’/’) fonctionne
correctement dans tous les environnements, dans la mesure où le signe / (barre oblique)
fait partie d’un intervalle du code unique. En réalité, la plupart des délimiteurs standard
appartiennent à l’intervalle 0x00 à 0x3F, et l’essentiel de l’analyse peut être effectué sans
recours aux fonctions d’internationalisation ou à la conversion au format wchar_t.
• La comparaison entre chaînes conduit à une de deux relations : égalité ou inégalité. Pour
un test d’égalité, optez pour la fonction standard strcmp. En écrivant :
if (strcmp(foostr,”a rose”) == 0)
nous ne recherchons pas le nom ”rose”, mais cette combinaison exacte de bits.
Si foostr contient ”rosé”, cela ne nous intéresse pas.
• Les relations d’inégalité sont testées lorsqu’il s’agit d’ordonner des chaînes selon l’ordre
de tri défini pour l’environnement local. Pour ce faire, nous utilisons :
if (strcoll(foostr,barstr) > 0)
en étant conscient du coût de l’opération de tri sur chaque caractère.
• Tout programme exécuté (via exec) est toujours démarré dans l’environnement local C.
S’il doit faire appel à une ou plusieurs fonctions d’internationalisation, dont des accès aux
catalogues de message, il doit exécuter :
setlocale(LC_ALL, ””);
pour passer à l’environnement local de son processus parent avant tout appel à une
fonction d’internationalisation.
Contrôle de l’environnement local
La séquence de commandes :
LANG=C
export LANG
définit l’environnement local par défaut à C (C est utilisé, sauf spécification autre explicite
via une autre variable, telle LC_COLLATE).
La séquence :
LC_ALL=C
export LC_ALL
force toutes les variables à C, quelles que soient les définitions antérieures.
Pour un relevé des valeurs actuelles des variables locales, tapez locale.
I-2
AIX 4.3 Guide d’optimisation
Voir aussi
”Gestion des ressources AIX : généralités”.
Commande sort.
Support NLS (National Language Support)
I-3
I-4
AIX 4.3 Guide d’optimisation
Annexe J. Récapitulatif des paramètres AIX
optimisables
Cette annexe donne la liste des paramètres qui ont une incidence sur les performances.
Cette liste est classée dans l’ordre alphabétique.
Augmentation de la tranche horaire
Objet :
Valeurs :
Affichage :
Modification :
Diagnostics :
Optimisation :
Voir :
Nombre d’impulsions d’horloge de 10 millisecondes duquel augmenter
la tranche horaire par défaut (10 millisecondes).
Par défaut : Intervalle : 0 à n’importe quel entier positif.
schedtune
La modification est immédiate. La modification est effective jusqu’à
l’amorçage système suivant. Pour un changement permanent, ajoutez
la commande schedtune à /etc/inittab.
schedtune –t nouvelle-valeur
N/A.
Ce paramètre ne doit normalement pas être modifié. Si la charge de
travail est constituée essentiellement de programmes longs et
gourmands en CPU, une augmentation de ce paramètre peut avoir un
effet positif.
”Modification de la tranche horaire du programmateur”, page 6-25.
arpt_killc
Objet :
Valeurs :
Affichage :
Modification :
Diagnostics :
Optimisation :
Voir :
Délai avant suppression d’une entrée ARP inactive et terminée.
Par défaut : 20 (minutes). Intervalle : N/A.
no –a ou no –o arpt_killc
no –o arpt_killc=nouvellevaleur
La modification est immédiate. La modification est effective jusqu’à
l’amorçage système suivant. Pour un changement permanent, ajoutez
la commande no à /etc/rc.net.
N/A.
Pour réduire l’activité ARP dans un réseau stable, vous pouvez
augmenter arpt_killc. L’effet est peu significatif.
N/A.
Récapitulatif des paramètres AIX optimisables
J-1
Calcul de la priorité d’un processus
Objet :
Valeurs :
Affichage :
Modification :
Diagnostics :
Optimisation :
Voir :
Spécifie la valeur de l’augmentation de la priorité d’un processus en
fonction de son utilisation récente de CPU, et le taux de décroissance
du temps d’utilisation de CPU récente. Ces paramètres sont appelés r
et d.
Par défaut : Intervalle : 0 à 32 (Remarque : Lors du calcul, les valeurs
de r et d sont divisées par 32. L’intervalle réel des facteurs va ainsi de 0
à 1 par incréments de 0,03125.)
schedtune
schedtune –r ou schedtune –d
La modification est immédiate. La modification est effective jusqu’à
l’amorçage système suivant. Pour un changement permanent, ajoutez
la commande schedtune à /etc/inittab.
ps al Si vous constatez que la colonne PRI indique des priorités pour
les processus d’avant-plan (ceux qui ont des valeurs NI de 20)
supérieures aux valeurs PRI de certains processus d’arrière-plan
(valeurs NI > 20), vous devez peut-être diminuer la valeur de r.
Diminuer r rend plus compétitifs les processus d’avant-plan. Diminuer d
évite aux processus d’avant-plan d’être en conflit plus longtemps avec
les processus d’arrière-plan. schedtune –r 2 assure à chaque nouveau
processus d’avant-plan au moins 0,5 secondes de temps CPU, avant
de le laisser en concurrence avec les autres processus dont NI >= 24.
Reportez-vous à ”Optimisation du calcul de la priorité des processus
avec schedtune”, page 6-23.
Compte biod
Objet :
Valeurs :
Affichage :
Modification :
Diagnostics :
Optimisation :
Voir :
J-2
AIX 4.3 Guide d’optimisation
Nombre de processus biod disponibles pour gérer les requêtes NFS
sur un client.
Par défaut : Intervalle : 1 à n’importe quel entier positif.
ps –ef | grep biod
chnfs –b nouvellevaleur
Le changement prend effet immédiatement et est permanent.
L’indicateur –N entraîne un changement immédiat, mais temporaire
(perdu à l’amorçage suivant). L’indicateur –I entraîne un changement
différé à l’amorçage suivant.
netstat –s pour examiner les dépassements du tampon de socket UDP.
Augmentez le nombre jusqu’à éliminer les dépassements.
”Nombre de biod et de nfsd requis”, page 9-36.
Décompte nfsd
Objet :
Valeurs :
Affichage :
Modification :
Diagnostics :
Optimisation :
Voir :
Nombre de processus nfsd disponibles pour gérer les requêtes NFS
sur un serveur.
Par défaut : Intervalle : 1 à n
ps –ef | grep nfsd
chnfs –n nouvelle-valeur.
Le changement prend effet immédiatement et est permanent.
L’indicateur –N entraîne un changement immédiat, mais temporaire
(perdu à l’amorçage suivant). L’indicateur –I entraîne un changement
différé à l’amorçage suivant.
netstat –s pour examiner les dépassements du tampon de socket UDP.
Augmentez le nombre jusqu’à éliminer les dépassements.
”Nombre de biod et de nfsd requis”, page 9-36.
dog_ticks
Objet :
Valeurs :
Affichage :
Modification :
Diagnostics :
Optimisation :
Voir :
Granularité de l’horloge pour les routines IfWatchdog. Cette valeur n’est
pas utilisée sous AIX.
Par défaut : 60
N/A.
N/A.
N/A.
N/A.
N/A.
Intervalle de réessai fork()
Objet :
Valeurs :
Affichage :
Modification :
Diagnostics :
Optimisation :
Voir :
Délai d’attente avant relance d’un fork ayant échoué par manque
d’espace de pagination.
Par défaut : 10 (impulsions d’horloge de 10 millisecondes). Intervalle :
10 à n impulsions d’horloge.
schedtune
schedtune –f nouvelle-valeur.
La modification est immédiate. La modification est effective jusqu’à
l’amorçage système suivant. Pour un changement permanent, ajoutez
la commande schedtune à /etc/inittab.
Si des processus ont été tués par manque d’espace de pagination,
surveillez la situation à l’aide de la sous-routine sigdanger().
Si le manque d’espace de pagination est dû à des surcharges brèves et
sporadiques, augmenter le delai de réessai peut entraîner un
allongement du délai d’attente des processus permettant une libération
d’espace de pagination. Sinon, il convient d’agrandir ces espaces.
N/A.
Récapitulatif des paramètres AIX optimisables
J-3
Intervalle syncd
Objet :
Valeurs :
Affichage :
Modification :
Diagnostics :
Optimisation :
Voir :
Délai entre deux appels sync() par syncd.
Par défaut : 60 (secondes). Intervalle : 1 à n’importe quel entier positif.
grep syncd /sbin/rc.boot
vi /sbin/rc.boot
Le changement est différé à l’amorçage suivant, mais permanent.
N/A.
A sa valeur par défaut, l’effet de ce paramètre sur les performances est
négligeable. Aucune modification conseillée. Une diminution
significative de l’intervalle syncd – pour préserver l’intégrité des
données peut avoir l’effet inverse.
”Performances et sync/fsync”, page 8-21.
ipforwarding
Objet :
Valeurs :
Affichage :
Modification :
Diagnostics :
Optimisation :
Voir :
Spécifie si le noyau fait suivre les paquets IP.
Par défaut : 0 (non). Intervalle : 0 à 1
no –a ou no –o ipforwarding
no –o ipforwarding=nouvelle-valeur
La modification est immédiate. La modification est effective jusqu’à
l’amorçage système suivant. Pour un changement permanent, ajoutez
la commande no à /etc/rc.net.
N/A.
ll s’agit d’une décision de configuration ayant un impact sur les
performances.
N/A.
ipfragttl
Objet :
Valeurs :
Affichage :
Modification :
Diagnostics :
Optimisation :
Voir :
J-4
AIX 4.3 Guide d’optimisation
Durée de vie des fragments de paquets IP.
Par défaut : 60 (demi-secondes). Intervalle : 60 à n
no –a ou no –o ipfragttl
no –o ipfragttl=nouvelle-valeur
La modification est immédiate. La modification est effective jusqu’à
l’amorçage système suivant. Pour un changement permanent, ajoutez
la commande no à /etc/rc.net.
netstat –s
Si la valeur de IP: fragments dropped after timeout est non
nulle, augmenter ipfragttl peut réduire les retransmissions.
N/A.
ipqmaxlen
Objet :
Valeurs :
Affichage :
Modification :
Diagnostics :
Optimisation :
Voir :
Nombre maximal d’entrées de la file d’entrée IP.
Par défaut : Intervalle : 50 à n
no –a ou no –o ipqmaxlen
no –o ipqmaxlen =nouvelle-valeur
La modification est immédiate. La modification est effective jusqu’à
l’amorçage système suivant. Pour un changement permanent, ajoutez
la commande no à /etc/rc.net.
Utilisez la commande crash pour accéder au compteur de
dépassement de la file d’entrée IP.
Augmentez la taille.
”Optimisation des performances du protocole IP”, page 9-23.
ipsendredirects
Objet :
Valeurs :
Affichage :
Modification :
Diagnostics :
Optimisation :
Voir :
Spécifie si le noyau envoie les signaux de réacheminement.
Par défaut : 1 (oui). Intervalle : 0 à 1
no –a ou no –o ipsendredirects
no –o ipsendredirects=nouvelle-valeur
La modification est immédiate. La modification est effective jusqu’à
l’amorçage système suivant. Pour un changement permanent, ajoutez
la commande no à /etc/rc.net.
N/A.
N/A. ll s’agit d’une décision de configuration ayant un impact sur les
performances.
N/A.
Limites des requêtes en sortie sur une carte disque
Objet :
Valeurs :
Affichage :
Modification :
Diagnostics :
Optimisation :
Voir :
Nombre maximal de requêtes en sortie sur un bus SCSI (ne s’applique
qu’à la carte SCSI–2 Fast/Wide).
Par défaut : Intervalle : 40 à 128
lsattr –E –l scsin –a num_cmd_elems
chdev –l scsin –a num_cmd_elems=nouvellevaleur i
Le changement prend effet immédiatement et est permanent.
L’indicateur –T entraîne un changement immédiat, mais perdu à
l’amorçage suivant. L’indicateur –P entraîne un changement différé à
l’amorçage suivant, mais permanent.
N/A.
La valeur doit être égale au nombre d’unités physiques (y compris
celles se trouvant dans des piles de disques) situées sur le bus SCSI,
multiplié par la longueur des files d’attente sur chaque unité.
”Limites de la file d’attente de l’unité de disque et de la carte SCSI”,
page 8-23.
Récapitulatif des paramètres AIX optimisables
J-5
Longueur de file d’attente d’unité disque
Objet :
Valeurs :
Affichage :
Modification :
Diagnostics :
Optimisation :
Voir :
Nombre maximal de requêtes pouvant se trouver dans la file d’attente
de l’unité de disque.
Par défaut : disques BULL = 3. Intervalle : N/A.
Par défaut : disques non BULL = 0. Intervalle : spécifié par le fabricant.
lsattr –E –l hdiskn.
chdev –l hdiskn –a q_type=simple –a queue_depth=nouvelle-valeur.
Le changement prend effet immédiatement et est permanent.
L’indicateur –T entraîne un changement immédiat, mais perdu à
l’amorçage suivant. L’indicateur –P entraîne un changement différé à
l’amorçage suivant, mais permanent.
N/A.
Si le disque non BULL gère la mise des requêtes en file d’attente, ce
changement doit être effectué pour garantir que le système exploite
bien cette capacité.
”Limites de la file d’attente de l’unité de disque et de la carte SCSI”,
page 8-23.
loop_check_sum (version 3.2.5 seulement)
Objet :
Valeurs :
Affichage :
Modification :
Diagnostics :
Optimisation :
Voir :
Spécifie si les totaux de contrôle sont effectués et vérifiés sur une
interface en boucle. (Cette fonction n’existe pas sous AIX version 4.1.)
Par défaut : 1 (oui). Intervalle : 0 à 1
no –a ou no –o loop_check_sum
no –o loop_check_sum=0
La modification est immédiate. La modification est effective jusqu’à
l’amorçage système suivant. Pour un changement permanent, ajoutez
la commande no à /etc/rc.net.
N/A.
Nous vous conseillons de désactiver la vérification des totaux de
contrôle (loop_check_sum=0).
N/A.
lowclust (version 3.2.5 seulement)
Objet :
Valeurs :
Affichage :
Modification :
Diagnostics :
Optimisation :
Voir :
J-6
AIX 4.3 Guide d’optimisation
Spécifie le niveau bas du pool de grappes mbuf.
Par défaut : dépend de la configuration. Intervalle : 5 à n
no –a ou no –o lowclust
no –o lowclust=nouvelle-valeur
La modification est immédiate. La modification est effective jusqu’à
l’amorçage système suivant. Pour un changement permanent, ajoutez
la commande no à /etc/rc.net.
netstat –m
Si ”requests for memory denied” est non nul, augmentez lowclust.
”Optimisation du pool mbuf”, page 9-26.
lowmbuf (version 3.2.5 seulement)
Objet :
Valeurs :
Affichage :
Modification :
Diagnostics :
Optimisation :
Voir :
Spécifie le niveau bas du pool mbuf.
Par défaut : dépend de la configuration. Intervalle : 64 à n
no –a ou no –o lowmbuf
no –o lowmbuf=nouvelle-valeur
La modification est immédiate. La modification est effective jusqu’à
l’amorçage système suivant. Pour un changement permanent, ajoutez
la commande no à /etc/rc.net.
netstat –m
Si ”requests for memory denied” est non nul, augmentez lowmbuf.
”Optimisation du pool mbuf”, page 9-26.
lvm_bufcnt (AIX version 4.1 seulement)
Objet :
Valeurs :
Affichage :
Modification :
Diagnostics :
Optimisation :
Voir :
Nombre de tampons LVM pour les E/S physiques brutes.
Par défaut : Intervalle : 1 à 64
vmtune
vmtune –u nouvelle-valeur
La modification est immédiate. La modification est effective jusqu’à
l’amorçage système suivant. Pour un changement permanent, ajoutez
la commande vmtune à /etc/inittab.
Les applications qui effectuent de longues écritures sur des volumes
logiques bruts répartis n’atteignent pas le débit souhaité.
Si un système est configuré avec des volumes logiques bruts répartis et
effectue des écritures de plus de 1,125 Mo, augmenter cette valeur peut
améliorer le débit de l’application.
Commande vmtune”, page A-9.
maxrandwrt (AIX version 4.1.3 et ultérieure)
Objet :
Valeurs :
Affichage :
Modification :
Diagnostics :
Optimisation :
Voir :
Nombre de pages de fichier sales à accumuler en RAM avant qu’elles
soient synchronisées sur disque via un algorithme d’écriture différée. Le
seuil d’écriture différée aléatoire est défini sur la base des fichiers.
Par défaut : Intervalle : 0 à 128 (pages de 4 ko).
vmtune
vmtune –W nouvelle-valeur.
La modification est immédiate. La modification est effective jusqu’à
l’amorçage système suivant. Pour un changement permanent, ajoutez
la commande vmtune à /etc/inittab.
vmstat n affiche les manques de page et les pointes d’attente d’E/S à
intervalles réguliers (généralement lorsque le démon sync écrit des
pages sur disque).
Si vmstat n affiche des manques de page et des pointes d’attente d’E/S
à intervalles réguliers (généralement lorsque le démon sync écrit des
pages sur le disque), régler la valeur de maxrandwrt aide à mieux
répartir les E/S. La valeur 0 désactive l’écriture aléatoire différée.
”Gestion AIX du stockage sur disques fixes”, page 2-13 et la
commande vmtune, page A-9.
Récapitulatif des paramètres AIX optimisables
J-7
maxbuf
Objet :
Valeurs :
Affichage :
Modification :
Diagnostics :
Optimisation :
Voir :
Nombre de pages (4 ko) dans le cache tampon d’E/S bloc.
Par défaut : Intervalle : x à y
lsattr –E –l sys0 –a maxbuf
chdev –l sys0 –a maxbuf=nouvelle-valeur.
Le changement prend effet immédiatement et est permanent.
L’indicateur –T entraîne un changement immédiat, mais perdu à
l’amorçage suivant. L’indicateur –P entraîne un changement différé à
l’amorçage suivant, mais permanent.
N/A.
Ce paramètre a normalement un effet négligeable sur les performances
d’un système AIX, dans la mesure où les E/S ordinaires ne passent pas
par le cache tampon des E/S bloc.
N/A.
max_coalesce
Objet :
Valeurs :
Affichage :
Modification :
Diagnostics :
Optimisation :
Voir :
Spécifie la taille maximale, en octets, des requêtes fusionnées par le
pilote d’unité SCSI dans sa file d’attente.
Par défaut : ko. Intervalle : 64 ko à 2 Go
odmget
odmdelete, odmadd, bosboot
Le changement est différé à l’amorçage suivant, mais permanent.
N/A.
Augmentez si des volumes logiques répartis ou des piles de disques
sont utilisés.
”Modification du paramètre max_coalesce du pilote SCSI”, page 8-22.
maxfree
Objet :
Valeurs :
Affichage :
Modification :
Diagnostics :
Optimisation :
Voir :
J-8
AIX 4.3 Guide d’optimisation
Taille maximale à partir de laquelle la liste de trames de page
disponibles VMM croît – par vol de page.
Par défaut : dépend de la configuration. Intervalle : 16 à 204800
(trames de 4 ko).
vmtune
vmtune –F nouvelle-valeur.
La modification est immédiate. La modification est effective jusqu’à
l’amorçage système suivant. Pour un changement permanent, ajoutez
la commande vmtune à /etc/inittab.
Examinez les changements intervenus au niveau de la taille de la liste
des disponibilités, via vmstat n.
Si vmstat n indique que cette taille passe fréquemment en dessous de
minfree par le fait de demandes émises par des applications,
augmentez maxfree de façon à réduire les appels à la liste de
disponibilités remplie. D’une façon générale, maintenez
maxfree – minfree <= 100.
”Optimisation du remplacement de page VMM”, page 7-16.
maxperm
Objet :
Valeurs :
Affichage :
Modification :
Diagnostics :
Optimisation :
Voir :
Pourcentage de trames de page mémoire occupées par des pages
permanentes, au-delà duquel seules les pages permanentes voient leur
trames volées.
Par défaut : % de (taille mémoire – 4 Mo). Intervalle : 5 à 100
vmtune
vmtune –P nouvelle-valeur.
La modification est immédiate. La modification est effective jusqu’à
l’amorçage système suivant. Pour un changement permanent, ajoutez
la commande vmtune à /etc/inittab.
Surveillez les E/S disque via iostat n.
Si vous savez que des fichiers sont lus répétitivement, mais que les
taux d’E/S ne baissent pas depuis le lancement, maxperm est sans
doute trop bas.
”Optimisation du remplacement de page VMM”, page 7-16.
maxpgahead
Objet :
Valeurs :
Affichage :
Modification :
Diagnostics :
Optimisation :
Voir :
Limite supérieure du nombre de pages lues par anticipation par VMM
lors du traitement d’un fichier à accès séquentiel.
Par défaut : Intervalle : 0 à 16
vmtune
vmtune –R nouvelle-valeur.
La modification est immédiate. La modification est effective jusqu’à
l’amorçage système suivant. Pour un changement permanent, ajoutez
la commande vmtune à /etc/inittab.
Observez la durée d’exécution des applications critiques au niveau des
E/S séquentielles, via la commande time.
Si la durée d’exécution diminue lorsque maxpgahead est plus élevé,
étudiez les autres applications pour vérifier que leurs performances
n’ont pas souffert.
”Optimisation des lectures séquentielles anticipées”, page 8-11.
maxpin (AIX version 4.1 seulement)
Objet :
Valeurs :
Affichage :
Modification :
Diagnostics :
Optimisation :
Voir :
Pourcentage maximal de mémoire réelle susceptible d’être fixée.
Par défaut : 80 (% de RAM). Intervalle : au moins 4 Mo fixable à au
moins 4 Mo non fixable.
vmtune
vmtune –M nouvelle-valeur.
La modification est immédiate. La modification est effective jusqu’à
l’amorçage système suivant.
N/A.
N’effectuez de modification que dans des cas extrêmes, tels que
l’évaluation de la charge maximale.
Commande vmtune, page A-9.
Récapitulatif des paramètres AIX optimisables
J-9
maxpout
Objet :
Valeurs :
Affichage :
Modification :
Diagnostics :
Optimisation :
Voir :
Spécifie le nombre maximal d’E/S en attente d’un fichier.
Par défaut : 0 (pas de contrôle). Intervalle : 0 à n (n étant un multiple de
4, augmenté de 1).
lsattr –E –l sys0 –a maxpout
chdev –l sys0 –a maxpout=nouvelle-valeur.
Le changement prend effet immédiatement et est permanent.
L’indicateur –T entraîne un changement immédiat, mais perdu à
l’amorçage suivant. L’indicateur –P entraîne un changement différé à
l’amorçage suivant, mais permanent.
Si les temps de réponse en avant-plan de programmes générant de
lourdes sorties séquentielles sur disque se dégradent, il convient sans
doute de réguler les sorties séquentielles.
Définissez maxpout à 33 et minpout à 16. Si les performances en
mode séquentiel se dégradent de façon inacceptable, augmentez l’un
ou l’autre de ces paramètres, ou les deux. Si les performances en
avant-plan restent inacceptables, diminuez les deux.
”Régulation des E/S disque”, page 8-13.
maxttl
Objet :
Valeurs :
Affichage :
Modification :
Diagnostics :
Optimisation :
Voir :
Durée de vie des paquets RIP (Routing Information Protocol).
Par défaut : Intervalle : N/A.
no –a or no –o maxttl
no –o maxttl=nouvelle-valeur
La modification est immédiate. La modification est effective jusqu’à
l’amorçage système suivant. Pour un changement permanent, ajoutez
la commande no à /etc/rc.net.
N/A.
N/A.
N/A.
mb_cl_hiwat (version 3.2.5 seulement)
Objet :
Valeurs :
Affichage :
Modification :
Diagnostics :
Optimisation :
Voir :
J-10
AIX 4.3 Guide d’optimisation
Spécifie le niveau haut du pool de grappes mbuf.
Par défaut : dépend de la configuration. Intervalle : N/A.
no –a or no –o mb_cl_hiwat
no –o mb_cl_hiwat=nouvelle-valeur
La modification est immédiate. La modification est effective jusqu’à
l’amorçage système suivant. Pour un changement permanent, ajoutez
la commande no à /etc/rc.net.
netstat –m
Si le nombre de grappes mbuf (appelées ”pages mappées” par netstat)
est régulièrement supérieur à mb_cl_hiwat, augmentez mb_cl_hiwat.
”Optimisation du pool mbuf”, page 9-26.
minfree
Objet :
Valeurs :
Affichage :
Modification :
Diagnostics :
Optimisation :
Voir :
Taille de la liste de trames de page VMM disponibles à partir de laquelle
commence à voler des pages pour remplir la liste de disponibilités.
Valeurs :
Par défaut : dépend de la configuration. Intervalle : x à n’importe quel
entier positif.
vmtune
vmtune –f nouvelle-valeur
La modification est immédiate. La modification est effective jusqu’à
l’amorçage système suivant. Pour un changement permanent, ajoutez
la commande vmtune à /etc/inittab.
vmstat n.
Si des processus sont différés par le vol de page, augmentez minfree
pour améliorer les temps de réponse. Augmentez maxfree de la même
valeur ou d’une valeur supérieure.
”Optimisation du remplacement de page VMM”, page 7-16.
minperm
Objet :
Valeurs :
Affichage :
Modification :
Diagnostics :
Optimisation :
Voir :
Pourcentage de trames de page occupées par des pages permanentes,
en deçà duquel VMM vole les trames des pages permanentes et des
pages de travail, quel que soit le taux de repages.
Par défaut : % de (taille mémoire – 4 Mo). Intervalle : 5 à 100
vmtune
vmtune –P nouvelle-valeur.
La modification est immédiate. La modification est effective jusqu’à
l’amorçage système suivant. Pour un changement permanent, ajoutez
la commande vmtune à /etc/inittab.
Surveillez les E/S disque via iostat n.
Si vous savez que des fichiers sont lus répétitivement, mais que les
taux d’E/S ne baissent pas depuis le lancement, minperm est sans
doute trop bas.
”Optimisation du remplacement de page VMM”, page 7-16.
minpgahead
Objet :
Valeurs :
Affichage :
Modification :
Diagnostics :
Optimisation :
Voir :
Nombre de pages lues par anticipation par VMM dès qu’il détecte un
accès séquentiel.
Par défaut : Intervalle : 0 à 16
vmtune
vmtune –r nouvelle-valeur.
La modification est immédiate. La modification est effective jusqu’à
l’amorçage système suivant. Pour un changement permanent, ajoutez
la commande vmtune à /etc/inittab.
Observez la durée d’exécution des applications critiques au niveau des
E/S séquentielles, via la commande time.
Si la durée d’exécution diminue lorsque minpgahead est plus élevé,
étudiez les autres applications pour vérifier que leurs performances
n’ont pas souffert.
”Optimisation des lectures séquentielles anticipées”, page 8-11.
Récapitulatif des paramètres AIX optimisables
J-11
minpout
Objet :
Valeurs :
Affichage :
Modification :
Diagnostics :
Optimisation :
Voir :
Spécifie le point à partir duquel les programmes ayant atteint maxpout
peuvent reprendre l’écriture dans le fichier.
Par défaut : 0 (pas de contrôle). Intervalle : 0 à n (n étant un multiple de
4 et inférieur d’au moins 4 à maxpout).
lsattr –E –l sys0 –a minpout
chdev –l sys0 –a minpout=nouvelle-valeur.
Le changement prend effet immédiatement et est permanent.
L’indicateur –T entraîne un changement immédiat, mais perdu à
l’amorçage suivant. L’indicateur –P entraîne un changement différé à
l’amorçage suivant, mais permanent.
Si les temps de réponse en avant-plan de programmes générant de
lourdes sorties séquentielles sur disque se dégradent, il convient sans
doute de réguler les sorties séquentielles.
Définissez maxpout à 33 et minpout à 16. Si les performances en
mode séquentiel se dégradent de façon inacceptable, augmentez l’un
ou l’autre de ces paramètres, ou les deux. Si les performances en
avant-plan restent inacceptables, diminuez les deux.
”Régulation des E/S disque”, page 8-13.
MTU
Objet :
Valeurs :
Affichage :
Modification :
Diagnostics :
Optimisation :
Voir :
J-12
AIX 4.3 Guide d’optimisation
Limite la taille des paquets transmis via le réseau.
trn (4 Mo) : Par défaut : 1492, Intervalle : 60 à 3900
trn (16 Mo) : Par défaut : 1492, Intervalle : 60 à 17960
enn: Par défaut : 1500, Intervalle : 60 à 1500
fin: Par défaut : 4352, Intervalle : 60 à 4352
hin: Par défaut : 65536, Intervalle : 60 à 65536
son: Par défaut : 61428, Intervalle : 60 à 61428
lon: Par défaut : 1500 (version 3.2.5) 16896 (AIX version 4.1),
Intervalle : 60 à 65536
lsattr –E –l trn
chdev –l trn –a mtu=nouvelle-valeur.
Ne peut être modifié en cours d’exploitation de l’interface. Tous les
systèmes du réseau local (LAN) devant être dotés du même MTU, ils
doivent être modifiés simultanément. Le changement reste effectif
même après réamorçage.
Statistiques de fragmentation de paquets
Augmentez la taille MTU pour les interfaces en anneau à jeton :
trn (4 Mo) : 4056
trn (16 Mo) : 8500
Pour l’interface en boucle lon sous la version 3.2.5, augmentez à
16896.
Pour les autres interfaces, conservez la valeur par défaut.
”Cartes réseau local et pilotes d’unités”, page 9-11.
nfs_chars (version 3.2.5), nfs_socketsize (AIX version 4.1)
Objet :
Valeurs :
Affichage :
Modification :
Diagnostics :
Optimisation :
Voir :
Taille du tampon de socket UDP NFS.
Par défaut : Intervalle : 60000 à (sb_max –128).
nfso –a ou nfso –o nfs_chars (sous AIX version 4.1, nfso –o
nfs_socketsize).
nfso –o nfs_chars=nouvelle-valeur.
(sous AIX version 4.1, nfso –o nfs_socketsize=nouvelle-valeur)
stopsrc –g nfs.
startsrc –g nfs
La modification est immédiate. La modification est effective jusqu’à
l’amorçage système suivant. Pour un changement permanent, ajoutez
la commande nfso à /etc/rc.nfs ou /etc/rc.net. sb_max doit d’abord
être modifié en conséquence.
netstat –s
Si le compte ”UDP: socket buffer overflows” est non nul, augmentez
sb_max et nfs_chars.
”Optimisation de NFS”, page 9-36.
nfs_gather_threshold (AIX version 4.1 seulement)
Objet :
Valeurs :
Affichage :
Modification :
Diagnostics :
Optimisation :
Voir :
Taille minimale d’une écriture en ”veille” avant synchronisation. Utilisé
pour désactiver la fragmentation/assemblage des écritures sur le même
vnode.
Par défaut : Intervalle : x à y
nfso –a ou nfso –o nfs_gather_threshold
nfso –o nfs_gather_threshold=nouvelle-valeur
La modification est immédiate.
La modification est effective jusqu’à l’amorçage système suivant.
N/A.
N/A.
N/A.
nfs_portmon (version 3.2.5), portcheck (AIX version 4.1)
Objet :
Valeurs :
Affichage :
Modification :
Diagnostics :
Optimisation :
Voir :
Spécifie si NFS opère un contrôle, que les requêtes soient issues ou
non de ports privilégiés.
Par défaut : 0 (non). Intervalle : 0 à 1
nfso –a ou nfso –o nfs_portmon
nfso –o nfs_portmon=nouvelle-valeur
La modification est immédiate. La modification est effective jusqu’à
l’amorçage système suivant. Pour un changement permanent, ajoutez
la commande nfso à /etc/rc.nfs.
N/A.
ll s’agit d’une décision de configuration ayant un impact minimal sur les
performances.
N/A.
Récapitulatif des paramètres AIX optimisables
J-13
nfs_repeat_messages (AIX version 4.1 seulement)
Objet :
Valeurs :
Affichage :
Modification :
Diagnostics :
Optimisation :
Voir :
Spécifie si les messages écrits par NFS doivent être répétés.
Par défaut : 1 (oui). Intervalle : 0 à 1
nfso –a ou nfso –o nfs_repeat_messages
nfso –o nfs_repeat_messages=nouvelle-valeur
La modification est immédiate.
La modification est effective jusqu’à l’amorçage système suivant.
N/A.
N/A.
N/A.
nfs_setattr_error (AIX version 4.1 seulement)
Objet :
Valeurs :
Affichage :
Modification :
Diagnostics :
Optimisation :
Voir :
Spécifie si NFS ignore les erreurs NFS dues à des définitions d’attributs
PC illégaux.
Par défaut : Intervalle : 0 à 1
nfso –a
nfso –o nfs_setattr_error=nouvelle-valeur
La modification est immédiate.
La modification est effective jusqu’à l’amorçage système suivant.
N/A.
N/A.
N/A.
nfsudpcksum (version 3.2.5), udpchecksum (AIX version 4.1)
Objet :
Valeurs :
Affichage :
Modification :
Diagnostics :
Optimisation :
Voir :
J-14
AIX 4.3 Guide d’optimisation
Spécifie si NFS effectue le total de contrôle UDP.
Par défaut : 1 (oui). Intervalle : 0 à 1
nfso –a or nfso –o nfsudpcksum
nfso –o nfsudpcksum=nouvelle-valeur
La modification est immédiate. La modification est effective jusqu’à
l’amorçage système suivant. Pour un changement permanent, ajoutez
la commande nfso à /etc/rc.nfs.
N/A.
Désactiver le calcul du total de contrôle peut réduire le temps de
traitement, mais augmente le risque d’erreurs de données non
détectées.
N/A.
nonlocsrcroute
Objet :
Valeurs :
Affichage :
Modification :
Diagnostics :
Optimisation :
Voir :
Indique que les paquets IP acheminés strictement depuis la source
peuvent être adressés à des hôtes hors de l’anneau local. (Le routage
depuis une source non stricte n’est pas affecté.)
Par défaut : 0 (non). Intervalle : 0 à 1
no –a or no –o nonlocsrcroute
no –o nonlocsrcroute=nouvelle-valeur
La modification est immédiate. La modification est effective jusqu’à
l’amorçage système suivant. Pour un changement permanent, ajoutez
la commande no à /etc/rc.net.
N/A.
ll s’agit d’une décision de configuration ayant un impact minimal sur les
performances.
N/A.
npskill (AIX version 4.1 seulement)
Objet :
Valeurs :
Affichage :
Modification :
Diagnostics :
Optimisation :
Voir :
Nombre de pages libres de l’espace de pagination, à partir duquel les
processus commencent à être tués.
Par défaut : Intervalle : 0 au nombre de pages en mémoire réelle.
vmtune
vmtune –k nouvelle-valeur
La modification est immédiate. La modification est effective jusqu’à
l’amorçage système suivant.
N/A.
N/A.
Commande vmtune, page A-9.
npswarn (AIX version 4.1 seulement)
Objet :
Valeurs :
Affichage :
Modification :
Diagnostics :
Optimisation :
Voir :
Nombre de pages libres de l’espace de pagination, à partir duquel les
processus commencent à recevoir SIGDANGER.
Par défaut : Intervalle : au moins npskill pour le nombre de pages en
mémoire réelle.
vmtune
vmtune –w nouvelle-valeur
La modification est immédiate. La modification est effective jusqu’à
l’amorçage système suivant.
N/A.
Augmentez si vous constatez que des processus ont été tués par
insuffisance d’espace de pagination.
Commande vmtune, page A-9.
Récapitulatif des paramètres AIX optimisables
J-15
numclust (AIX version 4.1 seulement)
Objet :
Valeurs :
Affichage :
Modification :
Diagnostics :
Optimisation :
Voir :
Nombre de grappes de 16 ko traitées en écriture différée.
Par défaut : Intervalle : 1 à n’importe quel entier positif.
vmtune
vmtune –c nouvelle-valeur
La modification est immédiate. La modification est effective jusqu’à
l’amorçage système suivant.
N/A.
Augmentez éventuellement si des volumes logiques répartis ou des
piles de disques sont utilisés.
Commande vmtune, page A-9.
numfsbuf (AIX version 4.1 seulement)
Objet :
Valeurs :
Affichage :
Modification :
Diagnostics :
Optimisation :
Voir :
Nombre de systèmes de fichiers bufstruct.
Par défaut : Intervalle : 64 à n’importe quel entier positif.
vmtune
vmtune –b nouvelle-valeur
La modification est immédiate. La modification est effective jusqu’à
l’amorçage système suivant.
N/A.
Augmentez éventuellement si des volumes logiques répartis ou des
piles de disques sont utilisés.
Commande vmtune, page A-9.
Paramètres de contrôle de charge mémoire
Objet :
Valeurs :
Affichage :
Modification :
Diagnostics :
J-16
AIX 4.3 Guide d’optimisation
Personnalise l’utilitaire de contrôle de la charge mémoire VMM pour
maximiser l’utilisation du système tout en évitant l’emballement. Les
paramètres les plus utilisés sont :
h
seuil de surcharge de la mémoire haute.
p
seuil de surcharge mémoire par les processus.
m
niveau de multiprogrammation minimal.
h Valeur par défaut : Intervalle : 0 à n’importe quel entier positif.
p Valeur par défaut : Intervalle : 0 à n’importe quel entier positif.
m Valeur par défaut : Intervalle : 0 à n’importe quel entier positif.
schedtune
schedtune [–h nouvelle-valeur] [–p nouvelle-valeur] [–m
nouvelle-valeur]
La modification est immédiate. La modification est effective jusqu’à
l’amorçage système suivant. Pour un changement permanent, ajoutez
la commande schedtune à /etc/inittab.
De lourdes charges mémoire peuvent induire d’importants écarts au
niveau des temps de réponse.
Optimisation :
Voir :
schedtune –h 0 désactive le contrôle de la charge mémoire.
schedtune –p 2 requiert un niveau plus élevé de repagination par un
processus donné, avant qu’il ne soit candidat à être suspendu par le
contrôle de charge mémoire.
schedtune –m 10 requiert que le contrôle de charge mémoire
maintienne au moins 10 processus utilisateur actifs lorsqu’il suspend
des processus.
”Utilitaire de contrôle de charge mémoire”, page 2-8 et ”Optimisation du
contrôle de charge mémoire VMM”, page 7-14.
pd_npages
Objet :
Valeurs :
Affichage :
Modification :
Diagnostics :
Optimisation :
Voir :
Nombre de pages à supprimer d’un coup de la RAM lorsqu’un fichier
est supprimé.
Valeur par défaut :taille du plus grand fichier / taille de page. Intervalle :
1 à taille du plus grand fichier / taille de page
vmtune
vmtune –N nouvelle-valeur
La modification est immédiate. La modification est effective jusqu’à
l’amorçage système suivant. Pour un changement permanent, ajoutez
la commande vmtune à /etc/inittab.
Cette option est utile si une application en temps réel voit son temps de
réponse singulièrement ralenti pendant la suppression de gros fichiers.
Si le temps réel de réponse est un élément critique, régler cette option
peut l’améliorer en répartissant la suppression des pages de fichier de
la RAM plus uniformément par rapport à la charge de travail.
Commande vmtune”, page A-9.
rec_que_size
Objet :
Valeurs :
Affichage :
Modification :
Diagnostics :
Optimisation :
Voir :
(optimisable sous AIX version 3 exclusivement). Spécifie le nombre
maximal de tampons de réception qui peuvent être en file d’attente pour
l’interface.
Par défaut : Intervalle : 20 à 150
lsattr –E –l tokn –a rec_que_size
ifconfig tr0 detach
chdev –I tokn –a rec_que_size=nouvelle-valeur.
ifconfig tr0 nom-hôte up
Le changement reste effectif même après réamorçage.
N/A.
Augmentez la taille. Doit être naturellement définie à 150 sur les
systèmes orientés réseau, et notamment les serveurs.
”Cartes réseau local et pilotes d’unités”, page 9-11.
rfc1122addrchk
Objet :
Valeurs :
Affichage :
Modification :
Spécifie si la validation d’adresse est effectuée entre les couches de
communication.
Par défaut : 0 (non). Intervalle : 0 à 1
no –a ou no –o rfc1122addrchk
no –o rfc1122addrchk=nouvelle-valeur
La modification est immédiate. La modification est effective jusqu’à
l’amorçage système suivant. Pour un changement permanent, ajoutez
la commande no à /etc/rc.net.
Récapitulatif des paramètres AIX optimisables
J-17
Diagnostics :
Optimisation :
Voir :
N/A.
Cette valeur ne doit pas être modifiée.
N/A.
Objet :
1 indique que tcp_sendspace et tcp_recvspace peuvent dépasser
64 ko.
Par défaut : Intervalle : 0 ou 1
no –a ou no –o rfc1323
no –o rfc1323=nouvelle-valeur
La modification est immédiate. La modification est effective jusqu’à
l’amorçage système suivant. Pour un changement permanent, ajoutez
la commande no à /etc/rc.net.
Aucun.
Effectuez la modification avant de tenter de donner à tcp_sendspace
et tcp_recvspace une valeur supérieure à 64 ko.
”Couche TCP”, page 9-6.
rfc1323
Valeurs :
Affichage :
Modification :
Diagnostics :
Optimisation :
Voir :
sb_max
Objet :
Valeurs :
Affichage :
Modification :
Diagnostics :
Optimisation :
Voir :
Limite supérieure absolue de la taille des tampons de socket TCP et
UDP. Limite setsockopt(), udp_sendspace, udp_recvspace,
tcp_sendspace et tcp_recvspace.
Par défaut : Intervalle : N/A.
no –a ou no –o sb_max
no –o sb_max=nouvelle-valeur
La modification est immédiate pour les nouvelles connexions. La
modification est effective jusqu’à l’amorçage système suivant. Pour un
changement permanent, ajoutez la commande no à /etc/rc.net.
Aucun.
Augmentez la taille, de préférence à un multiple de 4 096. Doit être
environ double de la limite du plus grand tampon de socket.
”Couche socket”, page 9-3.
subnetsarelocal
Objet :
Valeurs :
Affichage :
Modification :
Diagnostics :
J-18
AIX 4.3 Guide d’optimisation
Spécifie que tous les sous-réseaux conformes à ce masque doivent
être considérés comme locaux, pour des opérations telles que
l’établissement, par exemple, de la taille maximale de segment TCP.
Par défaut : 1 (oui). Intervalle : 0 à 1
no –a ou no –o subnetsarelocal
no –o subnetsarelocal=nouvelle-valeur
La modification est immédiate. La modification est effective jusqu’à
l’amorçage système suivant. Pour un changement permanent, ajoutez
la commande no à /etc/rc.net.
N/A.
Optimisation :
Voir :
ll s’agit d’une décision de configuration ayant un impact sur les
performances. Si les sous-réseaux n’ont pas tous le même MTU, la
fragmentation au niveau des ponts peut entraîner une dégradation des
performances. S’ils ont tous le même MTU, et que subnetsarelocal
vaut 0, les sessions TCP risquent d’utiliser inutilement un MSS trop
petit.
”Optimisation de la taille maximum de segment (MSS) TCP”, page 9-21.
Taille de l’espace de pagination
Objet :
Quantité d’espace disque requise pour les pages de travail.
Valeurs :
Par défaut : dépend de la configuration. Intervalle : 32 Mo à n Mo pour
hd6, 16 Mo à n Mo pour non hd6
lsps –a
mkps ou chps ou smit pgsp
La modification est immédiate et est permanente. L’espace de
pagination n’est toutefois pas forcément mis en service immédiatement.
lsps –a. Si des processus ont été tués par insuffisance d’espace de
pagination, surveillez la situation à l’aide de la sous-routine psdanger().
S’il apparaît que l’espace de pagination est insuffisant pour gérer la
charge de travail normale, ajoutez un nouvel espace sur un autre
volume physique ou agrandissez l’espace existant.
”Position et taille des espaces de pagination”, page 4-26.
Affichage :
Modification :
Diagnostics :
Optimisation :
Voir :
tcp_keepidle
Objet :
Valeurs :
Affichage :
Modification :
Diagnostics :
Optimisation :
Voir :
Délai total pendant lequel conserver active une connexion TCP
inoccupée.
Par défaut : 14400 (demi-secondes) = 2 heures. Intervalle : tout entier
positif.
no –a ou no –o tcp_keepidle
no –o tcp_keepidle=nouvelle-valeur
La modification est immédiate. La modification est effective jusqu’à
l’amorçage système suivant. Pour un changement permanent, ajoutez
la commande no à /etc/rc.net.
N/A.
ll s’agit d’une décision de configuration ayant un impact minimal sur les
performances. Aucune modification conseillée.
N/A.
tcp_keepintvl
Objet :
Valeurs :
Affichage :
Modification :
Diagnostics :
Intervalle entre les paquets envoyés pour valider la connexion TCP.
Par défaut : 150 (demi-secondes) = 75 secondes. Intervalle : tout entier
positif.
no –a ou no –o tcp_keepintvl
no –o tcp_keepintvl=nouvelle-valeur
La modification est immédiate. La modification est effective jusqu’à
l’amorçage système suivant. Pour un changement permanent, ajoutez
la commande no à /etc/rc.net.
N/A.
Récapitulatif des paramètres AIX optimisables
J-19
Optimisation :
Voir :
ll s’agit d’une décision de configuration ayant un impact minimal sur les
performances. Aucune modification conseillée. Si l’intervalle est
sérieusement raccourci, les coûts en matière de traitement et de largeur
de bande peuvent devenir significatifs.
N/A.
tcp_mssdflt
Objet :
Valeurs :
Affichage :
Modification :
Diagnostics :
Optimisation :
Voir :
Taille de segment maximale utilisée par défaut pour communiquer avec
les réseaux distants.
Par défaut : Intervalle : 512 à (MTU de réseau local – 64).
no –a ou no –o tcp_mssdflt
no –o tcp_mssdflt=nouvelle-valeur
La modification est immédiate. La modification est effective jusqu’à
l’amorçage système suivant. Pour un changement permanent, ajoutez
la commande no à /etc/rc.net.
N/A.
Augmentez, si vous le souhaitez.
”Optimisation de la taille maximum de segment (MSS) TCP”, page 9-21.
tcp_recvspace
Objet :
Valeurs :
Affichage :
Modification :
Diagnostics :
Optimisation :
Voir :
Valeur par défaut de la taille du tampon de réception du socket TCP.
Par défaut : Intervalle : 0 à 64 ko si rfc1323=0,
Intervalle : 0 à 4 Go si rfc1323=1.
Doit être inférieur ou égal à sb_max.
Doit être égal à tcp_sendspace et uniforme sur tous les systèmes AIX
fréquemment sollicités.
no –a ou no –o tcp_recvspace
no –o tcp_recvspace=nouvelle-valeur
La modification est immédiate pour les nouvelles connexions. La
modification est effective jusqu’à l’amorçage système suivant. Pour un
changement permanent, ajoutez la commande no à /etc/rc.net.
Débit faible
Augmentez la taille, de préférence à un multiple de 4 096.
”Couche socket”, page 9-3.
tcp_sendspace
Objet :
Valeurs :
Affichage :
Modification :
Diagnostics :
Optimisation :
Voir :
J-20
AIX 4.3 Guide d’optimisation
Valeur par défaut de la taille du tampon d’envoi du socket TCP.
Par défaut : Intervalle : 0 à 64 ko si rfc1323=0,
Intervalle : 0 à 4 Go si rfc1323=1.
Doit être inférieur ou égal à sb_max.
Doit être égal à tcp_recvspace et uniforme sur tous les systèmes AIX
fréquemment sollicités.
no –a ou no –o tcp_sendspace
no –o tcp_sendspace=nouvelle-valeur
La modification est immédiate pour les nouvelles connexions. La
modification est effective jusqu’à l’amorçage système suivant. Pour un
changement permanent, ajoutez la commande no à /etc/rc.net.
Débit faible
Augmentez la taille, de préférence à un multiple de 4 096.
”Couche socket”, page 9-3.
tcp_ttl
Objet :
Valeurs :
Affichage :
Modification :
Diagnostics :
Optimisation :
Voir :
Durée de vie des paquets TCP.
Par défaut : 60 (impulsions de processeur de 10 millisecondes). tout
entier positif.
Affichage : no –a ou no –o tcp_ttl
no –o tcp_ttl=nouvelle-valeur
La modification est immédiate. La modification est effective jusqu’à
l’amorçage système suivant. Pour un changement permanent, ajoutez
la commande no à /etc/rc.net.
netstat –s
Si le système subit des dépassements de délai TCP, augmenter tcp_ttl
peut réduire le nombre de retransmissions.
N/A.
thewall
Objet :
Valeurs :
Affichage :
Modification :
Diagnostics :
Optimisation :
Voir :
Limite supérieure absolue de la quantité de mémoire réelle susceptible
d’être utilisée par le sous-système de communication.
Par défaut : % de la mémoire réelle. Intervalle : 0 à 50 % de la
mémoire réelle.
no –a ou no –o thewall
no –o thewall=nouvelle-valeur
nouvelle-valeur est en ko, et non en octets. La modification est
immédiate pour les nouvelles connexions. La modification est effective
jusqu’à l’amorçage système suivant. Pour un changement permanent,
ajoutez la commande no à /etc/rc.net.
Aucun.
Augmentez la taille, de préférence à un multiple de 4 ko.
”Optimisation du pool mbuf”, page 9-26.
udp_recvspace
Objet :
Valeurs :
Affichage :
Modification :
Diagnostics :
Optimisation :
Voir :
Valeur par défaut de la taille du tampon de réception du socket UDP.
Par défaut : Intervalle : N/A.
Doit être inférieur ou égal à sb_max.
no –a ou no –o udp_recvspace
no –o udp_recvspace=nouvelle-valeur
La modification est immédiate pour les nouvelles connexions. La
modification est effective jusqu’à l’amorçage système suivant. Pour un
changement permanent, ajoutez la commande no à /etc/rc.net.
n non nul dans le compte rendu de netstat –s de udp: n socket buffer
overflows
Augmentez la taille, de préférence à un multiple de 4 096.
”Couche socket”, page 9-3.
Récapitulatif des paramètres AIX optimisables
J-21
udp_sendspace
Objet :
Valeurs :
Affichage :
Modification :
Diagnostics :
Optimisation :
Voir :
Valeur par défaut de la taille du tampon d’envoi du socket UDP.
Par défaut : Intervalle : 0 à 65536
Doit être inférieur ou égal à sb_max.
no –a ou no –o udp_sendspace
no –o udp_sendspace=nouvelle-valeur
La modification est immédiate pour les nouvelles connexions. La
modification est effective jusqu’à l’amorçage système suivant. Pour un
changement permanent, ajoutez la commande no à /etc/rc.net.
N/A.
Augmentez la taille, de préférence à un multiple de 4 096.
”Couche socket”, page 9-3.
udp_ttl
Objet :
Valeurs :
Affichage :
Modification :
Diagnostics :
Optimisation :
Voir :
Durée de vie des paquets UDP.
Par défaut : 30 (impulsions d’horloge de 10 millisecondes). Intervalle :
tout entier positif.
no –a ou no –o udp_ttl
no –o udp_ttl=nouvelle-valeur
La modification est immédiate. La modification est effective jusqu’à
l’amorçage système suivant. Pour un changement permanent, ajoutez
la commande no à /etc/rc.net.
N/A.
N/A.
N/A.
xmt_que_size
Objet :
Valeurs :
Affichage :
Modification :
Diagnostics :
Optimisation :
Voir :
J-22
AIX 4.3 Guide d’optimisation
Spécifie le nombre maximal de tampons d’envoi susceptibles d’être en
file d’attente pour l’unité.
Par défaut : Intervalle : 20 à 150
lsattr –E –l tok0 –a xmt_que_size
ifconfig tr0 detach
chdev –I tok0 –a xmt_que_size=nouvelle-valeur
ifconfig tr0 nom-hôte up
Le changement reste effectif même après réamorçage.
netstat –i
Oerr > 0
Augmentez la taille. Doit être naturellement définie à 150 sur les
systèmes orientés réseau, et notamment les serveurs.
”Cartes réseau local et pilotes d’unités”, page 9-11.
Index
Symboles
#pragma isolated_call, 4-17
#pragma pour programme C, 4-16
A
activité système, analyse avec l’utilitaire de suivi,
11-1
affectation anticipée des emplacements d’espace
de pagination, 2-11
algorithme de remplacement de page, 2-8
optimisation, 7-16
anneau à jeton
(16 Mo) conseils d’optimisation, 9-24
(4 Mo) conseils d’optimisation, 9-24
applications dépendantes du disque, 12-25
ATM, conseils d’optimisation, 9-25
B
bibliothèques, G-1
bibliothèques de sous–routines, D-1
bibliothèques partagées, G-1
évaluation de l’utilisation de la CPU, 6-15
boîte à outils, disponibilité, A-1
Boîte à outils AIX, disponibilité, A-1
Boîte à outils Performance Toolbox (PTX), 12-16
disponibilité, A-1
C
cache
absence, 1-4
architecture, C-1
en mappage direct, C-3
présence, 1-4
absence, C-3
utilisation efficace, 4-11
caractère, multioctet, I-1
cartes, conseils d’optimisation, 9-13
charge d’une station de travail, 1-7
charge de travail
multi–utilisateur, 1-7
serveur, 1-7
charge de travail du serveur, 1-7
charge de travail multi–utilisateur, 1-7
charge de travail., identification, 1-8
codage
préprocesseur et compilateur, 4-14
sous–routine string, 4-18
style C et C++ efficace, 4-19
style de code paginable, utilisation efficace,
4-21
utilisation efficace de la mémoire cache, 4-11
cohérence de l’écriture miroir, 4-27
commande filemon, 8-8
disponibilité, 8-8
commande iostat
contrôle des performances, 5-3
exemple de rapport récapitulatif, 12-24
exemple du script shell, 8-2
commande ipreport, 9-61
commande lockstat, 12-24
commande netpmon, 9-59
disponibilité, 9-59
commande netstat
–m (option pour rendre compte de l’utilisation
des mbuf), 9-28
contrôle des performances, 5-3
optimisation des pools mbuf, 9-27
commande nice, 2-3
clarification de la syntaxe, 6-22
exemple, 6-20
commande ou sous–routine sync, 8-21
commande ps
affichage de la priorité d’un processus, 6-21
compte–rendu mémoire, 7-2
commande renice, 2-3
clarification de la syntaxe, 6-22
exemple, 6-22
commande rmss
changement de la taille effective de la
machine, 12-27
exemple, 7-6, 7-8
simulation de taille mémoire, 7-6
commande schedtune, 7-15, A-6
avertissement, 7-14
incrémentation de la tranche horaire, 2-4, 6-25
commande svmon, exemple, 7-3
commande time, mesure de l’utilisation de la CPU,
6-3
commande tprof exemple, exemple détaillé, 6-10
commande vmstat
compte rendu des activités CPU et d’E/S.,
12-23
compte rendu mémoire, 7-2, 12-25
contrôle de l’utilisation de la CPU, 6-2
contrôle des performances, 5-3
commande vmtune, A-9
avertissement, 7-16
utilisation, 7-16
communications, 9-59
récapitulatif des conseils d’installation et
d’optimisation, 9-31
compilation, propre à une architecture, 4-15
compilation propre à une architecture, 4-15
compression, système de fichiers, 8-18
compte rendu de problème, 13-1
compte rendu de problème AIX, 13-1
conditions liées aux performances, 4-2
conditions requises
performances, 4-2
ressource, 4-3
configuration
conseils relatifs aux disques, 4-24
enregistrement des performances de base
avant modification, 12-22
Index
X-1
taille et position des espaces de pagination,
4-26
connexions async
optimisation des entrées grande vitesse, 9-54
scipt fastport, 9-58
conseils d’optimisation
anneau à jeton (16 Mo), 9-24
anneau à jeton (4 Mo), 9-24
ATM, 9-25
cartes, 9-13
Ethernet, 9-23
FDDI, 9-24
files d’attente de réception, 9-14
files d’attente de réception , 9-14
files d’attente de transmission, 9-13
HIPPI, 9-25
IP, 9-23
SOCC, 9-25
TCP, UDP, 9-12
contrôle
continu, 5-2
surcharge, E-1
via iostat, netstat et/ou vmstat, 5-3
contrôle de charge mémoire
commande schedtune, A-6
description, 2-8
optimisation de grandes mémoires réelles,
7-15
récapitulatif des paramètres, J-16
contrôle de charge mémoire VMM, 7-14
contrôle des performances, 5-2
couche interface (IF)
flux d’envoi, 9-11
flux de réception, 9-11
CPU, 2-4
cycles par instruction, 1-6
D
débit, 1-2
décharger, 2-7
défaut de page
exemple, 1-4
nouvelle, 2-7
repagination, 2-7
défaut de page déjà référencée, 2-7
démon biod, 9-36, J-2
démon nfsd, 9-36, J-3
directive #pragma disjoint, 4-16
disque fixe, 4-24
disques
affectation de fragment, 8-17
commande filemon, 8-8
compression de système de fichiers, 8-18
écriture différée, 2-15
espace de pagination, 4-26
évaluation des performances avec iostat, 8-2
extension et amélioration de la configuration,
8-10
fichiers mappés, 2-15
fragmentation, 2-14
réduction, 8-5
généralités sur la gestion, 2-13
groupe de volumes (VG), 2-13
lecture anticipée, 2-14
X-2
AIX 4.3 Guide d’optimisation
limites des requêtes en sortie sur une carte,
J-5
optimisation des lectures séquentielles
anticipées, 8-11
partition logique (LP), 2-13
partition physique (PP), 2-13
placement physique d’un fichier, 8-4
placement physique d’un volume logique, 8-3
planification de la configuration physique et
logique, 4-24
profondeur de file d’attente, J-6
régulation des E/S, 2-16, 8-13
paramètre maxpout, J-10
paramètre minpout, J-12
réorganisation, 8-5, 8-6
répartition, 8-15
sync/fsync, 8-21
système de fichiers journalisé (JFS), 2-14
taille de bloc, 2-14
unité brute, 8-20
vérification de l’écriture, 4-27
vitesses relatives, 4-24
volume logique (LV)
cohérence de l’écriture miroir, 4-27
définition, 2-13
volume physique (PV), 2-13
dog_ticks, J-3
E
écriture différée, 2-15
éditeur de liens, D-1
édition de liens des bibliothèques de
sous–routines, D-1
emballement, élimination, 7-14
entrée a.out vers la commande ld, D-1
environnement local, I-1
espace de pagination, 2-6
affectation anticipée des emplacements, 2-11
espace de pagination insuffisant – paramètre
de réessai, A-8, J-3
post–affectation des emplacements, 2-11
sous–routine psdanger(), 4-26
taille, J-19
taille et position, 4-26
essai comparatif, standard de l’industrie, 1-2
Ethernet, conseils d’optimisation, 9-23
exécution de la commande cc, 4-20
exécution de la commande xlc, temps de latence,
4-20
exploitation par blocs, 4-14
F
FDDI, conseils d’optimisation, 9-24
fichier exécutable, D-1
fichiers, 2-15
files d’attente de réception, 9-14
files d’attente de réception , 9-14
files d’attente de transmission, 9-13
fork, intervalle de réessai, J-3
fragment, système de fichiers, 8-17
fragmentation, disque, 8-5
G
gestion de la charge de travail, 12-29
gestionnaire de mémoire virtuelle (VMM)
définition, 2-5
description, 1-6
Gestionnaire des volumes logiques (LVM), 1-6
grappe
description, 9-26
lowclust, 9-26
mb_cl_hiwat, 9-27
mbuf, 9-3
grappe mbuf, 9-3, 9-26
groupe de volumes (VG), 2-13
H
HIPPI, conseils d’optimisation, 9-25
horloge (matérielle), accès, H-1
I
identification des ressources limitatives, 12-23
ILS (International Language Support), I-1
astuces de codage, I-2
variable d’environnement
LANG, I-2
LC_ALL, I-2
installation
conseils de configuration d’installation, 4-23
conseils relatifs aux disques, 4-24
Interphase Network Coprocessor, 9-40
intervalle de sécurité, 2-9
intervalle syncd, J-4
intrusion, des outils de performance, E-1
IP
conseils d’optimisation, 9-23
flux d’envoi, 9-10
flux de réception, 9-10
maxttl, J-10
paramètre ipforwarding, J-4
paramètre ipfragttl, J-4
paramètre ipqmaxlen, J-5
paramètre ipsendredirects, J-5
paramètre nonlocsrcroute, J-15
présentation fonctionnelle, 9-10
ipqmaxlen, récapitulatif, 9-33
iptrace
exemple de sortie, 9-61, 9-62
formatage du rapport, 9-61
lancement et arrêt, 9-61
problèmes de performances, 9-61
L
LANG, I-2
latence de recherche, 1-3
LC_ALL, I-2
ld (éditeur de liens), D-1
lecture anticipée, 2-14, 8-11
lectures séquentielles anticipées, 8-11
libc.a, 6-15
liste des disponibilités, 2-6
modification de la taille, 7-16
paramètre maxfree, J-8
paramètre minfree, J-11
localité de référence, exemple, 1-6
longueur du parcours, 1-6
lowclust, 9-26, J-6
lowmbuf, 9-26, J-7
M
malloc
affectation des emplacements de l’espace de
pagination, 2-11
AIX 3.1 et AIX 3.2, F-1
perte de mémoire., 7-4
maxbuf, J-8
maxperm, J-9
modification, 7-17
présentation, 2-8
maxpgahead, J-9
maxpout, J-10
mb_cl_hiwat, 9-27
mbuf
conseils d’optimisation, 9-29
description, 9-26
généralités sur la gestion, 9-3
lowclust, 9-26, J-6
lowmbuf, 9-26, J-7
mb_cl_hiwat, 9-27, J-10
vérification de la taille actuelle du pool, 9-30
mémoire
de calcul, 2-7
évaluation des besoins d’une application, 7-8
fichier, 2-7
réduction de la taille, 12-27
mémoire fixe, 4-22
minperm, J-11
modification, 7-17
présentation, 2-8
minpgahead, J-11
minpout, J-12
MTU, 9-35, J-12
N
National Language Support (NLS), I-1
NFS
accélérateurs matériels, 9-40
cache d’attribut de fichier, 9-38
compte biod, J-2
configuration du disque du serveur, 4-24
mise en cache de données, 9-39
montage logiciel et matériel, 9-37
nombre de biods et de nfsds, 9-36
paramètre nfs_chars, J-13
paramètre nfs_gather_threshold, J-13
paramètre nfs_portmon, J-13
paramètre nfs_repeat_messages, J-14
paramètre nfs_setattr_error, J-14
paramètre nfs_udpcksum, J-14
paramètre timeo, 9-38
présentation, 9-36
relation avec les couches inférieures, 9-39
support ACL, 9-39
taille du tampon socket, 9-39
Index
X-3
O
optimisation
compilateur XL, 4-14
effet sur la vitesse du compilateur, 4-20
niveau, 4-18
propre à une architecture, 4-15
optimisation de DFS, 10-1
optimisation des performances, étapes, 1-8
optimisation des performances du système, étapes
du processus, 1-8
outil BigFoot, 7-5
outil STEM, exemple d’analyse du flux de
commande, 6-17
outils d’optimisation, A-3
outils de performance, A-1, A-3
outils de rapport et d’analyse, A-1
P
pages, 2-5
paramètres, optimisables, récapitulatif, J-1
paramètres AIX optimisables, récapitulatif, J-1
paramètres d’optimisation UDP, TCP/IP et mbuf,
9-31
partie active (définition), 4-12
partition logique (LP), 2-13
partition physique (PP), 2-13
performances de la sous–routine printf, 6-16
PerfPMR
capture des données, 13-4
diagnostic des performances, 12-21
installation, 13-3
pour AIX version 3, 13-2
rapport d’un possible défaut de performance
AIX, 13-1
pile de disques, 2-16
pilote de la carte LAN
flux d’envoi, 9-11
flux de réception, 9-11
placement sur le disque, 8-3
points critiques de la CPU, recherche dans un
programme, 6-10
politique de planification, 2-2
portée concurrentielle, 2-2
portée concurrentielle globale, 2-2
portée concurrentielle locale, 2-2
position sur le disque, 8-3
post–affectation des emplacements d’espace de
pagination, 2-11
POWER (architecture), 4-15
pragma, 4-16
Prestoserve, 9-40
priorité
affichage via ps, 6-21
commande nice, 2-3
commande renice, 2-3
composant
minimum routine utilisateur, 2-3
utilisation de la CPU, 2-3
valeur nice, 2-3
exécution d’une commande avec nice, 6-20
fixe, 2-3
affichage via ps, 6-21
X-4
AIX 4.3 Guide d’optimisation
définition via setpri, 6-20
modification via renice, 6-22
optimisation de l’algorithme de calcul, J-2
sous–routine setpri, 2-3
valeur de priorité, 2-3
variable, 2-3, 6-20
priorité fixe, 2-3
priorité variable, 2-3
prise en charge de routines, présentation, 2-2
processeur
accès à l’horloge matérielle du processeur, H-1
contrôle des conflits via la priorité, 6-20
contrôle via vmstat, 6-2
mesure de l’utilisation via la commande time,
6-3
profilage des zones critiques, 6-10
schéma d’adressage virtuel, C-1
tranche horaire, 2-4, 6-25
programmateur, 2-2
programme de chargement, 1-5
PTX, disponibilité, A-1
R
RAID, 2-16
RAM, mesuré des besoins via rmss, 7-8
rec_que_size, J-17
récapitulatif, 9-34
réédition des liens de fichiers exécutables, D-1
registres de segment, C-2
regroupement référentiel, définition, 4-12
régulation, 2-16
E/S disque, 8-13
régulation des E/S, 2-16, 8-13
remplacement de page, A-9
réorganisation des données sur disque, 8-5
répartition, 8-15
répartition des volumes logiques, 8-15
réseau
commande netpmon, 9-59
iptrace, 9-61
paramètre arpt_killc, J-1
paramètre loop_check_sum, J-6
résolution de chemins d’accès, 9-42
résolution de problèmes de performances
communications, 9-1
CPU, 6-1
disque, 8-1
généralités, 12-17
mémoire, 7-1
ressource
critique, 1-9
évaluation, 4-3, 4-7
logique, 1-9
mesure, 4-4
réelle, 1-9
supplémentaire, 1-11, 8-10
ressource critique, 1-9
rfc1122addrchk, J-17
rfc1323, J-18
récapitulatif, 9-32
routine
politique de planification, 2-2
portée concurrentielle, 2-2
portée concurrentielle globale, 2-2
portée concurrentielle locale, 2-2
routine initiale, 3-11
S
saturation de la file d’entrée IP, 9-23
saturation des files d’entrée IP, 9-23
sb_max, J-18
récapitulatif, 9-32
script pdt_config, A-12
script pdt_report, A-13
script shell vmstatit, 12-25
segment, mémoire virtuelle, associatif à quatre
voies, C-2
segment différé
client, 2-6
de travail, 2-6
décharger, 2-6
journalisé, 2-6
persistant, 2-6, 2-14
SMIT
création d’un port TTY, 9-58
définition des paramètres de régulation des
E/S disque, 8-13
nombre de démons nfsd lancé au démarrage,
9-47
SOCC, conseils d’optimisation, 9-25
socket
création, 9-4
flux d’envoi, 9-4
flux de réception, 9-4
limite de la taille du tampon, 9-3
taille du tampon, 9-39
sockthresh, récapitulatif, 9-31
sort, performance en environnement local C et non
C, I-1
sous–routine free
élimination des pertes de mémoire, 7-4
utilisation inutile, 7-4
sous–routine fsync, 8-21
sous–routine psdanger(), 4-26
sous–routine realloc, 7-4, F-1
sous–routine setpri, 2-3
exemple, 6-20
sous–routine string, 4-18
sous–routine trcstart, 11-7
station de travail sans disque, 9-41
activité NFS pour exécution d’un programme
simple, 9-42
écart de performances avec les systèmes à
disque, 9-48
pagination via NFS, 9-44
remarques sur l’optimisation, 9-46
ressources requises, 9-45
statistiques de pagination, 12-26
subnetsarelocal, J-18
surcharge, des outils de contrôle, E-1
System Management Interface Tool, 9-47
système de fichiers journalisé (JFS), 2-14
T
tableaux
C, 6-13
structure du stockage, C-5
tableaux C, 6-13
tampon historique des pages déjà référencées, 2-7
tampon TLB (Translation Lookaside Buffer)
absence
RAM, 1-4
remplissage de ligne, C-4
présence, C-4
TCP
conseils d’optimisation, 9-12
fenêtre (illustration), 9-6
flux d’envoi, 9-9
flux de réception, 9-9
présentation fonctionnelle, 9-6
TCP/IP, 9-6, 9-10
illustration du flux de données, 9-2
iptrace, 9-61
tcp_keepidle, J-19
tcp_keepintvl, J-19
tcp_mssdflt, J-20
tcp_recvspace, J-20
récapitulatif, 9-33
tcp_sendspace, J-20
récapitulatif, 9-33
tcp_ttl, J-21
temps de latence
définition, 1-3
recherche, 1-3
rotationnelle, 1-3
temps de réponse, 1-2
thewall, J-21
récapitulatif, 9-31
thewall (description), 9-27
TLB, 1-4
trace
ajout d’événements, 11-9
appels ioctl de contrôle, 11-7
canaux, 11-9
commandes de contrôle, 11-6
exemple d’événement utilisateur, 11-11
format article événement, 11-9
ID événement, 11-10
macros, 11-10
sous–commande, 11-6
sous–routines de contrôle, 11-7
syntaxe de la strophe de fichier de format,
11-13
utilitaire, 11-1
tranche horaire, 2-4
augmentation, J-1
effet, 2-4
modification via schedtune, 2-4, 6-25
U
UDP
conseils d’optimisation, 9-12
flux d’envoi, 9-6
flux de réception, 9-6
illustration du flux de données, 9-2
présentation fonctionnelle, 9-5
udp_recvspace, J-21
récapitulatif, 9-32
udp_sendspace, J-22
récapitulatif, 9-32
udp_ttl, J-22
Index
X-5
unités brutes, disque, 8-20
utilisation de la CPU, 2-3
V
valeur nice, 2-3
variable d’environnement
LANG, I-2
LC_ALL, I-2
MALLOCTYPE, F-1
PATH, 9-44
variable d’environnement MALLOCTYPE, F-1
X-6
AIX 4.3 Guide d’optimisation
vérification de l’écriture, 4-27
vitesse du compilateur, 4-20
vitesse du compilateur C, 4-20
vmtune, présentation, 2-7
volume logique (LV), 2-13
volume physique (PV), 2-13
X
xmt_que_size, J-22
récapitulatif, 9-34
Vos remarques sur ce document / Technical publication remark form
Titre / Title :
Bull AIX 4.3 Guide d’optimisation
Nº Référence / Reference Nº :
86 F2 72AP 04
Daté / Dated :
Octobre 1999
ERREURS DETECTEES / ERRORS IN PUBLICATION
AMELIORATIONS SUGGEREES / SUGGESTIONS FOR IMPROVEMENT TO PUBLICATION
Vos remarques et suggestions seront examinées attentivement.
Si vous désirez une réponse écrite, veuillez indiquer ci-après votre adresse postale complète.
Your comments will be promptly investigated by qualified technical personnel and action will be taken as required.
If you require a written reply, please furnish your complete mailing address below.
NOM / NAME :
SOCIETE / COMPANY :
ADRESSE / ADDRESS :
Remettez cet imprimé à un responsable BULL ou envoyez-le directement à :
Please give this technical publication remark form to your BULL representative or mail to:
BULL ELECTRONICS ANGERS
CEDOC
34 Rue du Nid de Pie – BP 428
49004 ANGERS CEDEX 01
FRANCE
Date :
Technical Publications Ordering Form
Bon de Commande de Documents Techniques
To order additional publications, please fill up a copy of this form and send it via mail to:
Pour commander des documents techniques, remplissez une copie de ce formulaire et envoyez-la à :
BULL ELECTRONICS ANGERS
CEDOC
ATTN / MME DUMOULIN
34 Rue du Nid de Pie – BP 428
49004 ANGERS CEDEX 01
FRANCE
Managers / Gestionnaires :
Mrs. / Mme :
C. DUMOULIN
Mr. / M :
L. CHERUBIN
+33 (0) 2 41 73 76 65
+33 (0) 2 41 73 63 96
FAX :
E–Mail / Courrier Electronique :
+33 (0) 2 41 73 60 19
[email protected]
Or visit our web site at: / Ou visitez notre site web à:
http://www–frec.bull.com
(PUBLICATIONS, Technical Literature, Ordering Form)
CEDOC Reference #
No Référence CEDOC
Qty
Qté
CEDOC Reference #
No Référence CEDOC
Qty
Qté
CEDOC Reference #
No Référence CEDOC
__ __ ____ _ [__]
__ __ ____ _ [__]
__ __ ____ _ [__]
__ __ ____ _ [__]
__ __ ____ _ [__]
__ __ ____ _ [__]
__ __ ____ _ [__]
__ __ ____ _ [__]
__ __ ____ _ [__]
__ __ ____ _ [__]
__ __ ____ _ [__]
__ __ ____ _ [__]
__ __ ____ _ [__]
__ __ ____ _ [__]
__ __ ____ _ [__]
__ __ ____ _ [__]
__ __ ____ _ [__]
__ __ ____ _ [__]
__ __ ____ _ [__]
__ __ ____ _ [__]
__ __ ____ _ [__]
Qty
Qté
[ _ _ ] : no revision number means latest revision / pas de numéro de révision signifie révision la plus récente
NOM / NAME :
Date :
SOCIETE / COMPANY :
ADRESSE / ADDRESS :
TELEPHONE / PHONE :
FAX :
E–MAIL :
For Bull Subsidiaries / Pour les Filiales Bull :
Identification:
For Bull Affiliated Customers / Pour les Clients Affiliés Bull :
Customer Code / Code Client :
For Bull Internal Customers / Pour les Clients Internes Bull :
Budgetary Section / Section Budgétaire :
For Others / Pour les Autres :
Please ask your Bull representative. / Merci de demander à votre contact Bull.
86 F2 72AP 04
PLACE BAR CODE IN LOWER
LEFT CORNER
BULL ELECTRONICS ANGERS
CEDOC
34 Rue du Nid de Pie – BP 428
49004 ANGERS CEDEX 01
FRANCE
Utiliser les marques de découpe pour obtenir les étiquettes.
Use the cut marks to get the labels.
AIX
AIX 4.3
Guide
d’optimisation
86 F2 72AP 04
AIX
AIX 4.3
Guide
d’optimisation
86 F2 72AP 04
AIX
AIX 4.3
Guide
d’optimisation
86 F2 72AP 04

Manuels associés