Manuel de suivi dynamique Solaris

Arguments

Les types d'argument des sondes io sont répertoriés dans Tableau 27–2. Les arguments sont décrits dans Tableau 27–1.

Tableau 27–2 Arguments de sonde io

Sonder 

args[0]

args[1]

args[2]

start

struct buf *

devinfo_t *

fileinfo_t *

done

struct buf *

devinfo_t *

fileinfo_t *

wait-start

struct buf *

devinfo_t *

fileinfo_t *

wait-done

struct buf *

devinfo_t *

fileinfo_t *

Chaque sonde io comprend des arguments constitués d'un pointeur sur une structure buf(9S), d'un pointeur sur devinfo_t et d'un pointeur sur fileinfo_t. Ces structures sont décrites plus en détails dans cette section.

Structure bufinfo_t

La structure bufinfo_t représente l'abstraction décrivant une demande d'E/S. Le tampon correspondant à une demande d'E/S est indiqué par args[0] des sondes start, done, wait-start et wait-done. La définition de la structure bufinfo_t est la suivante :

typedef struct bufinfo {
	int b_flags;                    /* flags */
	size_t b_bcount;                /* number of bytes */
	caddr_t b_addr;                 /* buffer address */
	uint64_t b_blkno;               /* expanded block # on device */
	uint64_t b_lblkno;              /* block # on device */
	size_t b_resid;                 /* # of bytes not transferred */
	size_t b_bufsize;               /* size of allocated buffer */ 
	caddr_t b_iodone;               /* I/O completion routine */
	dev_t b_edev;                   /* extended device */
 } bufinfo_t;

L'élément b_flags indique l'état du tampon d'E/S et comprend des valeurs d'état bitwise ou autres. Les valeurs d'état valides sont indiquées dans Tableau 27–3.

Tableau 27–3 Valeurs de b_flags

B_DONE

Indique que le transfert de données est terminé. 

B_ERROR

Indique une erreur de transfert d'E/S. Défini avec le champ b_error.

B_PAGEIO

Indique que le tampon est en cours d'utilisation dans une demande d'E/S chargée. Pour plus d'informations, reportez-vous à la description du champ b_addr.

B_PHYS

Indique que le tampon est en cours d'utilisation pour des E/S physiques (directes) d'une zone de données utilisateur. 

B_READ

Indique que les données doivent être lues du périphérique à la mémoire principale. 

B_WRITE

Indique que les données doivent être transférées de la mémoire principale au périphérique. 

B_ASYNC

La demande d'E/S est asynchrone et sera mise en attente. Les sondes wait-start et wait-done ne se déclenchent pas pour des demandes d'E/S asynchrones. Notez que B_ASYNC peut ne pas être défini pour certaines E/S conçues pour être asynchrones : le sous-système d'E/S asynchrone peut mettre en œuvre la demande asynchrone en disposant d'un thread distinct pour exécuter une opération d'E/S synchrone.

Le champ b_bcount représente le nombre d'octets à transférer dans la demande d'E/S.

Le champ b_addr représente l'adresse virtuelle de la demande d'E/S, à moins que B_PAGEIO soit défini. L'adresse est une adresse virtuelle de noyau à moins que B_PHYS soit défini, auquel cas il s'agit d'une adresse virtuelle d'utilisateur. Si B_PAGEIO est défini, le champ b_addr contient des données privées de noyau. Un de B_PHYS et de B_PAGEIO peut être défini, sinon aucun indicateur n'est défini.

Le champ b_lblkno identifie le bloc logique du périphérique auquel accéder. Le mappage d'un bloc logique avec un bloc physique (comme le cylindre, la piste, etc.) est défini par le périphérique.

Le champ b_resid est défini sur le nombre d'octets non transférés en raison d'une erreur.

Le champ b_bufsize contient la taille du tampon affecté.

Le champ b_iodone identifie une routine spécifique dans le noyau appelée à la fin de l'E/S.

Le champ b_error peut contenir un code d'erreur renvoyé par le périphérique en cas d'erreur d'E/S. b_error est défini avec le bit B_ERROR défini dans le membre b_flags.

Le champ b_edev contient les numéros supérieur et inférieur de périphériques du périphérique accessible. Les clients peuvent utiliser les sous-routines D getmajor() et getminor() pour extraire les numéros supérieur et inférieur de périphériques du champ b_edev.

devinfo_t

La structure devinfo_t fournit des informations sur un périphérique. La structure devinfo_t correspondant au périphérique de destination d'E/S est indiquée par args[1] des sondes start, done, wait-start et wait-done. Les éléments de devinfo_t sont les suivants :

typedef struct devinfo {
	int dev_major;                  /* major number */
	int dev_minor;                  /* minor number */
	int dev_instance;               /* instance number */
	string dev_name;                /* name of device */
	string dev_statname;            /* name of device + instance/minor */
	string dev_pathname;            /* pathname of device */
} devinfo_t;

Le champ dev_major représente le numéro supérieur du périphérique. Pour plus d'informations, reportez-vous à getmajor(9F).

Le champ dev_minor représente le numéro inférieur du périphérique. Pour plus d'informations, reportez-vous à getminor(9F).

Le champ dev_instance représente le numéro d'instance du périphérique. L'instance d'un périphérique est différente du numéro inférieur. Le numéro inférieur est une abstraction gérée par le pilote du périphérique. Le numéro d'instance est une propriété du nœud de périphérique. Vous pouvez afficher des numéros d'instance de nœud de périphérique via prtconf(1M).

Le champ dev_name représente le nom du pilote de périphérique qui gère le périphérique. Vous pouvez afficher les noms des pilotes de périphérique via l'option -D pour prtconf(1M).

Le champ dev_statname représente le nom du périphérique tel qu'indiqué par iostat(1M). Ce nom correspond également au nom d'une statistique de noyau tel qu'indiqué par kstat(1M). Ce champ est conçu pour qu'une sortie iostat ou kstat anormale puisse être rapidement mise en corrélation avec l'activité d'E/S réelle.

Le champ dev_pathname représente le chemin d'accès complet au périphérique. Ce chemin peut être spécifié en tant qu'argument pour prtconf(1M) afin d'obtenir des informations détaillées sur le périphérique. Le chemin spécifié par dev_pathname inclut des composants indiquant le nœud du périphérique, le numéro d'instance et le nœud inférieur. Ces trois éléments ne sont cependant pas nécessairement indiqués dans le nom de statistique. Pour certains périphériques, le nom de statistique est composé du nom du périphérique et du numéro d'instance. Pour d'autres, il est composé du nom du périphérique et du numéro de nœud inférieur. Par conséquent, deux périphériques portant le même dev_statname peuvent avoir un dev_pathname différent .

fileinfo_t

La structure fileinfo_t fournit des informations sur un fichier. Le fichier auquel correspond des E/S est indiqué par args[0] des sondes start, done, wait-start et wait-done. La présence d'informations sur un fichier est liée au système de fichiers fournissant ces informations lors de la répartition de demandes d'E/S. Certains systèmes de fichiers, notamment de tiers, peuvent ne pas fournir ces informations. De même, des demandes d'E/S peuvent provenir d'un système de fichiers pour lequel il n'existe aucune information de fichier. Par exemple, les E/S pour des métadonnées de système de fichiers ne seront associées à aucun fichier. Enfin, certains systèmes de fichiers hautement optimisés peuvent regrouper des E/S de fichiers distincts dans une seule demande d'E/S. Dans ce cas, le système de fichiers peut fournir les informations relatives au fichier représentant la plupart des E/S ou au fichier représentant certaines E/S. Le système de fichiers peut également ne fournir aucune information de fichier.

La définition de la structure fileinfo_t est la suivante :

typedef struct fileinfo {
	string fi_name;                 /* name (basename of fi_pathname) */
	string fi_dirname;              /* directory (dirname of fi_pathname) */
	string fi_pathname;             /* full pathname */
	offset_t fi_offset;             /* offset within file */
	string fi_fs;                   /* filesystem */
	string fi_mount;                /* mount point of file system */
} fileinfo_t;

Le champ fi_name contient le nom du fichier mais aucun composant de répertoire. Si aucune information de fichier n'est associée à une E/S, le champ fi_name sera défini sur la chaîne <none>. Dans quelques rares cas, le nom de chemin associé à un fichier peut être inconnu. Dans ce cas, le champ fi_name sera défini sur la chaîne <unknown>.

Le champ fi_dirname ne contient que le composant de répertoire du nom de fichier. Comme fi_name, cette chaîne peut être définie sur <none> s'il n'existe aucune information de fichier ou sur <unknown> si le nom du chemin associé au fichier est inconnu.

Le champ fi_pathname contient le nom du chemin complet au fichier. Comme fi_name, cette chaîne peut être définie sur <none> s'il n'existe aucune information de fichier ou sur <unknown> si le nom du chemin associé au fichier est inconnu.

Le champ fi_offset contient le décalage dans le fichier ou -1 s'il n'existe aucune information de fichier ou si le décalage n'est pas spécifié par le système de fichiers.