La commande aioo est apparue en AIX 5.3 TL05. Elle permet de contrôler la configuration des Asynchronous I/O sur le système.
La commande n’est pas encore parfaitement implémenté, par exemple si on essaye de voir les paramètres alors que le module kernel AIO n’est pas chargé on obtient ce message :
# aioo -a
exec(): 0509-036 Cannot load program aioo because of the following errors:
0509-130 Symbol resolution failed for aioo because:
0509-136 Symbol aio_cntl (number 20) is not exported from
dependent module /unix.
0509-192 Examine .loader section symbols with the
'dump -Tv' command.
Ce message explicite indique seulement que le module AIO n’est pas chargé dans le kernel. On peut voir avec la commande genkex que ce module n’est effectivement pas chargé(la commande ne renvoit rien contenant aio)
#genkex|grep aio
Il suffit soit de passer par le menu smit qui va bien (smitty aio) et de rebooter, soit de charger le module kernel de manière plus basique :
# mkdev -l aio0
aio0 Available
On vérifie que le module kernel est bien chargé :
# genkex|grep aio
437b000 3628 /usr/lib/drivers/aiopin
436f000 b278 /usr/lib/drivers/aio.ext
Après ça, on obtient une sortie plus polie de la commande :
# aioo -a
minservers = 1
maxservers = 10
maxreqs = 4096
fsfastpath = 0
On voit les paramètres classiques correspondant aux nombre d’ aioserver démarrés par défaut sur chaque processeur (minservers), le nombre maximum d’aioserver par processeur (maxservers) et le nombre de requètes que chaque aioserver peut traiter (maxreqs).
On peut compter le nombre d’aioserver démarrés avec la commande pstat :
# pstat -a|grep aio
48 a 30098 1 30098 0 0 1 aioserver
55 a 3708a 1 3708a 0 0 1 aioserver
56 a 38088 1 38088 0 0 1 aioserver
60 a 3c096 1 3c096 0 0 1 aioserver
62 a 3e096 1 3e096 0 0 1 aioserver
72 a 48096 1 48096 0 0 1 aioserver
74 a 4a098 1 4a098 0 0 1 aioserver
78 a 4e09c 1 4e09c 0 0 1 aioserver
79 a 4f09e 1 4f09e 0 0 1 aioserver
...
Il suffit de compter le nombre d’aioserver démarré puis de le diviser par le nombre de processeurs logiques (si le SMT est activé) pour savoir où l’on se situe dans le paramètrage. Les aioserver sont des processus kernel, on peut donc aussi les lister avec la commande ps aux.
En plus de tout cela, on découvre un nouveau paramètre : fsfastpath. Il permet d’activer une implémentation où les I/O asynchrones sont directement adressés au driver sans passer par les processus aioserver . Cette implémentation est prévue pour les filesystems JFS2 en Concurrent I/O.
Il suffit de passer ce paramètre à 1 pour en profiter car elle n’est pas activée par défaut.
# aioo -o fsfastpath=1
En théorie, on gagne en performance au niveau cpu en évitant des context switchs dûe au passage par les aioserver et en mémoire comme il n’y a plus besoin d’allouer de la mémoire pour ces process. En pratique, et en ayant tester ce paramètre sur des serveurs réels(recette et production donc difficile à monitorer de manière précise), je n’ai pas remarqué de différences significatives ce qui est déjà pas mal :-) . Avec ce paramètre, il est inutile d’effectuer un tuning fin des aioserver et on ne risque pas de problèmes de performance comme lorsque le nombre d’aioserver est insuffisant.
Dernier commentaire sur la commande aioo, elle n’est pas encore bien implémentée dans AIX dans le sens où son paramètrage n’est pas conservée lors d’un reboot (pas d’entrées ajoutées dans les fichiers du répertoire /etc/tunables). Il faut donc ajouter une entrée dans /etc/inittab pour que le paramètre soit pris en compte au reboot.
Et pour la fin l’information la plus importante à mes yeux, IBM maintient un redbook intégrant les nouvelles fonctionnalités apportées à AIX 5.3(uniquement lors des TL impaires). Il s’agit du redbook sg247414 nommé AIX 5L Differences guide Version 5.3 Addendum. Il ne se contente pas de lister les nouvelles fonctionnalités mais les décrit aussi. Vraiment très sympatique.
PS: la commande existe aussi en AIX 5.2 TL9 mais sans le paramètre fsfastpath.