Guide d'administration d'Oracle® VM Server for SPARC 3.2

Quitter la vue de l'impression

Mis à jour : Mai 2015
 
 

Ajustement de la limite d'interruption

Le matériel fournissant un nombre limité d'interruptions, Oracle Solaris limite le nombre d'interruptions que chaque périphérique peut utiliser. La limite par défaut doit correspondre aux besoins d'une configuration système type, sachant que la valeur devra peut-être être ajustée pour certaines configurations système.

Lorsque vous activez la virtualisation d'E/S sur un bus PCIe, des ressources matérielles d'interruptions sont affectées à chaque domaine d'E/S. Chaque domaine se voit attribuer un nombre limité de ces ressources, ce qui peut conduire à des problèmes d'allocations d'interruptions. Cette situation n'a d'incidence que sur les plates-formes UltraSPARC T2, UltraSPARC T2 Plus, SPARC T3, SPARC T4, SPARC T5, SPARC M5 et SPARC M6.

Cet avertissement sur la console Oracle Solaris signifie que l'approvisionnement d'interruptions a été épuisé lorsque les pilotes de périphériques d'E/S ont été joints :

WARNING: ddi_intr_alloc: cannot fit into interrupt pool

Plus précisément, la limite peut nécessiter des ajustements si le système est divisé en plusieurs domaines logiques et si un nombre trop important de périphériques d'E/S est assigné à un domaine invité. Oracle VM Server for SPARC divise le nombre total des interruptions en ensembles plus petits et les assigne à des domaines invités. Si un nombre trop important de périphériques d'E/S est assigné à un domaine invité, ses approvisionnements d'interruptions risquent d'être trop faibles pour fournir à chaque périphérique la limite par défauts d'interruptions. Le domaine invité épuise donc son approvisionnement en interruptions avant d'être entièrement associé à tous les pilotes.

Certains pilotes fournissent une routine de rappels facultatifs qui permet au SE Oracle Solaris d'ajuster automatiquement leurs interruptions. La limite par défaut ne s'applique pas à ces pilotes.

Déterminez comment les interruptions sont utilisées à l'aide des macros MDB ::irmpools et ::irmreqs. La macro ::irmpools affiche l'approvisionnement global des interruptions divisées en pools. La macro ::irmreqs affiche les périphériques qui sont mappés vers chaque pool. Pour chaque périphérique, ::irmreqs affiche si la limite par défaut est appliquée par une routine de rappels facultatifs, le nombre d'interruptions demandées par chaque pilote et le nombre d'interruptions de chaque pilote.

Bien que ces macros n'affichent pas d'informations sur les pilotes qui n'ont pas pu être joints, vous pouvez utiliser des informations pour calculer l'étendue de l'ajustement de la limite par défaut. Vous pouvez forcer un périphérique qui utilise plus d'une interruption sans fournir de routine de rappels pour utiliser moins d'interruptions en ajustant la limite par défaut. Pour de tels dispositifs, réduire la limite par défaut permet de libérer des interruptions pouvant être utilisées par d'autres périphériques.

Pour ajuster la limite par défaut, définissez la propriété ddi_msix_alloc_limit sur une valeur comprise entre 1 to 8 dans le fichier /etc/system. Réinitialisez ensuite le système pour que la modification prenne effet.

Pour plus d'informations sur la création ou la mise à jour des valeurs de propriété /etc/system, reportez-vous à la section Mise à jour des valeurs de propriété dans le fichier /etc/system.

Pour optimiser les performances, commencez par affecter de grandes valeurs et réduisez les valeurs par petits incréments jusqu'à la réussite de l'initialisation du système, sans avertissements. Utilisez les macros ::irmpools et ::irmreqs pour mesurer l'impact de l'ajustement sur tous les pilotes joints.

Par exemple, supposez que les avertissements suivants sont émis lors de l'initialisation du SE Oracle Solaris dans un domaine invité :

WARNING: emlxs3: interrupt pool too full.
WARNING: ddi_intr_alloc: cannot fit into interrupt pool

Les macros ::irmpools et ::irmreqs affichent les informations suivantes :

# echo "::irmpools" | mdb -k
ADDR             OWNER   TYPE   SIZE  REQUESTED  RESERVED
00000400016be970 px#0    MSI/X  36    36         36

# echo "00000400016be970::irmreqs" | mdb -k
ADDR             OWNER   TYPE   CALLBACK NINTRS NREQ NAVAIL
00001000143acaa8 emlxs#0 MSI-X  No       32     8    8
00001000170199f8 emlxs#1 MSI-X  No       32     8    8
000010001400ca28 emlxs#2 MSI-X  No       32     8    8
0000100016151328 igb#3   MSI-X  No       10     3    3
0000100019549d30 igb#2   MSI-X  No       10     3    3
0000040000e0f878 igb#1   MSI-X  No       10     3    3
000010001955a5c8 igb#0   MSI-X  No       10     3    3

La limite par défaut dans cet exemple comporte 8 interruptions par périphérique, ce qui n'est pas suffisant pour lier le périphérique emlxs3 final au système. En supposant que toutes les instances emlxs se comportent de la même manière, emlxs3 a probablement demandé 8 interruptions.

En soustrayant les 12 interruptions utilisées par tous les périphériques igb de la taille totale du pool des 36 interruptions, 24 interruptions sont disponibles pour les périphériques emlxs. La division des 24 interruptions par 4 suggère que 6 interruptions par périphérique permettent à tous les périphériques emlxs de se joindre avec des performances égales. L'ajustement suivant est ainsi ajouté au fichier /etc/system :

set ddi_msix_alloc_limit = 6

Pour plus d'informations sur la création ou la mise à jour des valeurs de propriété /etc/system, reportez-vous à la section Mise à jour des valeurs de propriété dans le fichier /etc/system.

Lorsque le système réussit à s'initialiser sans avertissement, les macros ::irmpools et ::irmreqs affichent les informations mises à jour suivantes :

primary# echo "::irmpools" | mdb -k
ADDR             OWNER   TYPE   SIZE  REQUESTED  RESERVED
00000400018ca868 px#0    MSI/X  36    36         36
 
# echo "00000400018ca868::irmreqs" | mdb -k
ADDR             OWNER   TYPE   CALLBACK NINTRS NREQ NAVAIL
0000100016143218 emlxs#0 MSI-X  No       32     8    6
0000100014269920 emlxs#1 MSI-X  No       32     8    6
000010001540be30 emlxs#2 MSI-X  No       32     8    6
00001000140cbe10 emlxs#3 MSI-X  No       32     8    6
00001000141210c0 igb#3   MSI-X  No       10     3    3
0000100017549d38 igb#2   MSI-X  No       10     3    3
0000040001ceac40 igb#1   MSI-X  No       10     3    3
000010001acc3480 igb#0   MSI-X  No       10     3    3